diff --git a/intern/elbeem/extern/elbeem.h b/intern/elbeem/extern/elbeem.h index 5370196ff4a..2cee22a62a4 100644 --- a/intern/elbeem/extern/elbeem.h +++ b/intern/elbeem/extern/elbeem.h @@ -162,6 +162,7 @@ typedef struct elbeemMesh { /* fluid control settings */ float cpsTimeStart; float cpsTimeEnd; + float cpsQuality; int channelSizeAttractforceStrength; float *channelAttractforceStrength; diff --git a/intern/elbeem/intern/elbeem.cpp b/intern/elbeem/intern/elbeem.cpp index 00fc9ef6854..0deed5082b0 100644 --- a/intern/elbeem/intern/elbeem.cpp +++ b/intern/elbeem/intern/elbeem.cpp @@ -163,6 +163,7 @@ void elbeemResetMesh(elbeemMesh *mesh) { /* fluid control settings */ mesh->cpsTimeStart = 0; mesh->cpsTimeEnd = 0; + mesh->cpsQuality = 0; mesh->channelSizeAttractforceStrength = 0; mesh->channelAttractforceStrength = NULL; @@ -215,6 +216,7 @@ int elbeemAddMesh(elbeemMesh *mesh) { /* fluid control features */ obj->setCpsTimeStart(mesh->cpsTimeStart); obj->setCpsTimeEnd(mesh->cpsTimeEnd); + obj->setCpsQuality(mesh->cpsQuality); if((mesh->volumeInitTypevolumeInitType>VOLUMEINIT_BOTH)) mesh->volumeInitType = VOLUMEINIT_VOLUME; obj->setVolumeInit(mesh->volumeInitType); diff --git a/intern/elbeem/intern/ntl_geometryobject.cpp b/intern/elbeem/intern/ntl_geometryobject.cpp index 32433df34b3..c7a222af3e5 100644 --- a/intern/elbeem/intern/ntl_geometryobject.cpp +++ b/intern/elbeem/intern/ntl_geometryobject.cpp @@ -42,6 +42,7 @@ ntlGeometryObject::ntlGeometryObject() : mTriangleDivs1(), mTriangleDivs2(), mTriangleDivs3(), mMovPntsInited(-100.0), mMaxMovPnt(-1), mcGeoActive(1.), + mCpsTimeStart(0.), mCpsTimeEnd(1.0), mCpsQuality(10.), mcAttrFStr(0.),mcAttrFRad(0.), mcVelFStr(0.), mcVelFRad(0.) { }; diff --git a/intern/elbeem/intern/ntl_geometryobject.h b/intern/elbeem/intern/ntl_geometryobject.h index 436e511ea79..666798385f6 100644 --- a/intern/elbeem/intern/ntl_geometryobject.h +++ b/intern/elbeem/intern/ntl_geometryobject.h @@ -109,6 +109,10 @@ class ntlGeometryObject : public ntlGeometryClass inline float getCpsTimeEnd() const { return mCpsTimeEnd; } inline void setCpsTimeEnd(float set) { mCpsTimeEnd=set; } + /*! Set/get the particle control set quality */ + inline float getCpsQuality() const { return mCpsQuality; } + inline void setCpsQuality(float set) { mCpsQuality=set; } + inline AnimChannel getCpsAttrFStr() const { return mcAttrFStr; } inline AnimChannel getCpsAttrFRad() const { return mcAttrFRad; } inline AnimChannel getCpsVelFStr() const { return mcVelFStr; } @@ -228,6 +232,7 @@ class ntlGeometryObject : public ntlGeometryClass /* fluid control settings */ float mCpsTimeStart; float mCpsTimeEnd; + float mCpsQuality; AnimChannel mcAttrFStr, mcAttrFRad, mcVelFStr, mcVelFRad; public: diff --git a/intern/elbeem/intern/solver_control.cpp b/intern/elbeem/intern/solver_control.cpp index bda464f56d6..3dc9b700ccb 100644 --- a/intern/elbeem/intern/solver_control.cpp +++ b/intern/elbeem/intern/solver_control.cpp @@ -242,6 +242,9 @@ LbmFsgrSolver::initCpdata() cset->mCparts->setCPSTimeStart(obj->getCpsTimeStart()); cset->mCparts->setCPSTimeEnd(obj->getCpsTimeEnd()); + if(obj->getCpsQuality() > LBM_EPSILON) + cset->mCparts->setCPSWith(1.0 / obj->getCpsQuality()); + // this value can be left at 0.5: cset->mCparts->setCPSMvmWeightFac(0.5); diff --git a/source/blender/makesdna/DNA_object_fluidsim.h b/source/blender/makesdna/DNA_object_fluidsim.h index 0c0eff0620e..3426b1426a3 100644 --- a/source/blender/makesdna/DNA_object_fluidsim.h +++ b/source/blender/makesdna/DNA_object_fluidsim.h @@ -121,6 +121,7 @@ typedef struct FluidsimSettings { /* Fluid control settings */ float cpsTimeStart; float cpsTimeEnd; + float cpsQuality; float attractforceStrength; float attractforceRadius; diff --git a/source/blender/src/buttons_object.c b/source/blender/src/buttons_object.c index 3a0c9e8514d..6146fb045d4 100644 --- a/source/blender/src/buttons_object.c +++ b/source/blender/src/buttons_object.c @@ -5069,7 +5069,7 @@ static void object_panel_fluidsim(Object *ob) if(fss->typeFlags&OB_FSBND_PARTSLIP) { uiDefBut(block, LABEL, 0, "PartSlipValue:", 0,yline,200,objHeight, NULL, 0.0, 0, 0, 0, ""); - uiDefButF(block, NUM, B_DIFF, "", 200, yline,100,objHeight, &fss->partSlipValue, 0.0, 1.0, 10,0, "."); + uiDefButF(block, NUM, B_DIFF, "Amount of mixing between no- and free-slip, 0=stickier, 1=same as free slip.", 200, yline,100,objHeight, &fss->partSlipValue, 0.0, 1.0, 10,0, "."); yline -= lineHeight; } else { //uiDefBut(block, LABEL, 0, "-", 200,yline,100,objHeight, NULL, 0.0, 0, 0, 0, ""); @@ -5216,8 +5216,8 @@ static void object_panel_fluidsim(Object *ob) } else if(fss->type == OB_FLUIDSIM_CONTROL) { - uiDefButF(block, NUM, B_DIFF, "Time Sta:", 0, yline,150,20, &fss->cpsTimeStart, 0.0, 2.0, 10,0, "Specifies time when the control particles are activated."); - uiDefButF(block, NUM, B_DIFF, "Time End:", 150, yline,150,20, &fss->cpsTimeEnd, 0.0, 2.0, 10,0, "Specifies time when the control particles are deactivated."); + uiDefButF(block, NUM, B_DIFF, "Time Sta:", 0, yline,150,20, &fss->cpsTimeStart, 0.0, 100.0, 10,0, "Specifies time when the control particles are activated."); + uiDefButF(block, NUM, B_DIFF, "Time End:", 150, yline,150,20, &fss->cpsTimeEnd, 0.0, 100.0, 10,0, "Specifies time when the control particles are deactivated."); yline -= lineHeight; @@ -5230,6 +5230,9 @@ static void object_panel_fluidsim(Object *ob) yline -= lineHeight; uiDefButF(block, NUM, B_DIFF, "Strength:", 0, yline,150,20, &fss->velocityforceStrength, 0.0, 2.0, 10,0, ""); uiDefButF(block, NUM, B_DIFF, "Radius:", 150, yline,150,20, &fss->velocityforceRadius, 0.0, 2.0, 10,0, ""); + + yline -= lineHeight; + uiDefButF(block, NUM, B_DIFF, "Quality:", 0, yline,150,20, &fss->cpsQuality, 1.0, 100.0, 10,0, "Specifies the quality which is used for object sampling."); } else { yline -= lineHeight + 5; diff --git a/source/blender/src/fluidsim.c b/source/blender/src/fluidsim.c index 0d38e8b9601..4504ae89391 100644 --- a/source/blender/src/fluidsim.c +++ b/source/blender/src/fluidsim.c @@ -221,6 +221,7 @@ FluidsimSettings *fluidsimSettingsNew(struct Object *srcob) fss->velocityforceRadius = 0.75; fss->cpsTimeStart = fss->animStart; fss->cpsTimeEnd = fss->animEnd; + fss->cpsQuality = 10.0; // 1.0 / 10.0 => means 0.1 width return fss; } @@ -1073,6 +1074,7 @@ void fluidsimBake(struct Object *ob) fsmesh.cpsTimeStart = obit->fluidsimSettings->cpsTimeStart; fsmesh.cpsTimeEnd = obit->fluidsimSettings->cpsTimeEnd; + fsmesh.cpsQuality = obit->fluidsimSettings->cpsQuality; fsmesh.channelSizeAttractforceRadius = fsmesh.channelSizeVelocityforceStrength = @@ -1084,7 +1086,7 @@ void fluidsimBake(struct Object *ob) fsmesh.channelVelocityforceStrength = channelVelocityforceStrength[o]; fsmesh.channelVelocityforceRadius = channelVelocityforceRadius[o]; } - else*/ + else */ { // set channels to 0 fsmesh.channelAttractforceStrength =