[Bf-blender-cvs] [d39b661722c] fluid-mantaflow: various fluid guiding improvements

Sebastián Barschkis noreply at git.blender.org
Fri Aug 25 12:40:23 CEST 2017


Commit: d39b661722ced7e50896f5458ccb25c185c03ec1
Author: Sebastián Barschkis
Date:   Mon Aug 21 11:47:33 2017 +0200
Branches: fluid-mantaflow
https://developer.blender.org/rBd39b661722ced7e50896f5458ccb25c185c03ec1

various fluid guiding improvements

the domain settings for fluid guiding are gone now. guiding objects handle settings individually, guiding functions kick in automatically if there is a guiding object present.

===================================================================

M	intern/mantaflow/extern/manta_fluid_API.h
M	intern/mantaflow/intern/FLUID.cpp
M	intern/mantaflow/intern/FLUID.h
M	intern/mantaflow/intern/manta_fluid_API.cpp
M	intern/mantaflow/intern/strings/shared_script.h
M	intern/mantaflow/intern/strings/smoke_script.h
M	release/scripts/startup/bl_ui/properties_physics_smoke.py
M	source/blender/blenkernel/intern/smoke.c
M	source/blender/makesdna/DNA_smoke_types.h
M	source/blender/makesrna/intern/rna_smoke.c

===================================================================

diff --git a/intern/mantaflow/extern/manta_fluid_API.h b/intern/mantaflow/extern/manta_fluid_API.h
index 628acc72345..4c3c9e19195 100644
--- a/intern/mantaflow/extern/manta_fluid_API.h
+++ b/intern/mantaflow/extern/manta_fluid_API.h
@@ -93,8 +93,6 @@ void smoke_ensure_colors(struct FLUID *smoke, struct SmokeModifierData *smd);
 float *smoke_get_guide_velocity_x(struct FLUID *smoke);
 float *smoke_get_guide_velocity_y(struct FLUID *smoke);
 float *smoke_get_guide_velocity_z(struct FLUID *smoke);
-float *smoke_get_phiguidein(struct FLUID *smoke);
-int *smoke_get_num_guide(struct FLUID *fluid);
 
 // Liquid grids
 float *liquid_get_phiin(struct FLUID *liquid);
@@ -160,9 +158,13 @@ void liquid_set_snd_particle_type(struct FLUID* liquid, int* buffer, int numPart
 // Fluids in general
 int *fluid_get_num_obstacle(struct FLUID *fluid);
 float *fluid_get_inflow(struct FLUID *fluid);
+float *fluid_get_phiguidein(struct FLUID *fluid);
+int *fluid_get_num_guide(struct FLUID *fluid);
 int fluid_get_res_x(struct FLUID *fluid);
 int fluid_get_res_y(struct FLUID *fluid);
 int fluid_get_res_z(struct FLUID *fluid);
+void fluid_ensure_guiding(struct FLUID *fluid, struct SmokeModifierData *smd);
+
 
 #ifdef __cplusplus
 }
diff --git a/intern/mantaflow/intern/FLUID.cpp b/intern/mantaflow/intern/FLUID.cpp
index 44563e0eb9d..18fec6791cc 100644
--- a/intern/mantaflow/intern/FLUID.cpp
+++ b/intern/mantaflow/intern/FLUID.cpp
@@ -61,6 +61,7 @@ FLUID::FLUID(int *res, SmokeModifierData *smd) : mCurrentID(++solverID)
 	mUsingHeat    = smd->domain->active_fields & SM_ACTIVE_HEAT;
 	mUsingFire    = smd->domain->active_fields & SM_ACTIVE_FIRE;
 	mUsingColors  = smd->domain->active_fields & SM_ACTIVE_COLORS;
+	mUsingGuiding = smd->domain->active_fields & SM_ACTIVE_GUIDING;
 	mUsingHighRes = smd->domain->flags & MOD_SMOKE_HIGHRES;
 	mUsingLiquid  = smd->domain->type == MOD_SMOKE_DOMAIN_TYPE_LIQUID;
 	mUsingSmoke   = smd->domain->type == MOD_SMOKE_DOMAIN_TYPE_GAS;
@@ -126,6 +127,8 @@ FLUID::FLUID(int *res, SmokeModifierData *smd) : mCurrentID(++solverID)
 	mPhiOutIn       = NULL;
 	mPhi            = NULL;
 
+	mNumGuide = NULL;
+
 	mNumVertices  = 0;
 	mNumNormals   = 0;
 	mNumTriangles = 0;
@@ -146,6 +149,7 @@ FLUID::FLUID(int *res, SmokeModifierData *smd) : mCurrentID(++solverID)
 	if (mUsingLiquid) {
 		initDomain(smd);
 		initLiquid(smd);
+		if (mUsingGuiding) initGuiding(smd);
 
 		updatePointers();
 		
@@ -174,9 +178,10 @@ FLUID::FLUID(int *res, SmokeModifierData *smd) : mCurrentID(++solverID)
 	if (mUsingSmoke) {
 		initDomain(smd);
 		initSmoke(smd);
-		if (mUsingHeat)   initHeat(smd);
-		if (mUsingFire)   initFire(smd);
-		if (mUsingColors) initColors(smd);
+		if (mUsingHeat)    initHeat(smd);
+		if (mUsingFire)    initFire(smd);
+		if (mUsingColors)  initColors(smd);
+		if (mUsingGuiding) initGuiding(smd);
 
 		updatePointers(); // Needs to be after heat, fire, color init
 
@@ -237,7 +242,6 @@ void FLUID::initSmoke(SmokeModifierData *smd)
 	std::string tmpString = smoke_alloc_low
 		+ smoke_variables_low
 		+ smoke_bounds_low
-		+ smoke_guiding
 		+ smoke_adaptive_step
 		+ smoke_export_low
 		+ smoke_pre_step_low
@@ -381,6 +385,20 @@ void FLUID::initLiquidHigh(SmokeModifierData *smd)
 	mUsingHighRes = true;
 }
 
+void FLUID::initGuiding(SmokeModifierData *smd)
+{
+	if (!mPhiGuideIn) {
+		std::string tmpString = fluid_alloc_guiding_low
+			+ fluid_with_guiding;
+		std::string finalString = parseScript(tmpString, smd);
+		mCommands.clear();
+		mCommands.push_back(finalString);
+
+		runPythonString(mCommands);
+		mUsingGuiding = true;
+	}
+}
+
 void FLUID::step(int framenr)
 {
 	// manta_write_effectors(this);                         // TODO in Mantaflow
@@ -425,6 +443,9 @@ FLUID::~FLUID()
 	tmpString += smoke_delete_fire_high;
 	tmpString += smoke_delete_colors_high;
 
+	// Guiding
+	tmpString += fluid_delete_guiding_low;
+
 	// Cleanup multigrid
 	tmpString += fluid_multigrid_cleanup_low;
 	if (mUsingHighRes) tmpString += fluid_multigrid_cleanup_high;
@@ -485,6 +506,8 @@ FLUID::~FLUID()
 	mTextureV2      = NULL;
 	mTextureW2      = NULL;
 
+	mNumGuide = NULL;
+
 	// Liquid
 	mPhiIn      = NULL;
 	mPhiObsIn   = NULL;
@@ -502,6 +525,7 @@ FLUID::~FLUID()
 	mUsingHeat    = false;
 	mUsingFire    = false;
 	mUsingColors  = false;
+	mUsingGuiding = false;
 	mUsingHighRes = false;
 }
 
@@ -575,7 +599,7 @@ std::string FLUID::getRealValue(const std::string& varName,  SmokeModifierData *
 	else if (varName == "USING_HIGHRES")
 		ss << (smd->domain->flags & MOD_SMOKE_HIGHRES ? "True" : "False");
 	else if (varName == "USING_GUIDING")
-		ss << (smd->domain->flags & MOD_SMOKE_GUIDING ? "True" : "False");
+		ss << (smd->domain->active_fields & SM_ACTIVE_GUIDING ? "True" : "False");
 	else if (varName == "SOLVER_DIM")
 		ss << smd->domain->manta_solver_res;
 	else if (varName == "DO_OPEN") {
@@ -755,6 +779,7 @@ void FLUID::exportSmokeScript(SmokeModifierData *smd)
 	bool heat    = smd->domain->active_fields & SM_ACTIVE_HEAT;
 	bool colors  = smd->domain->active_fields & SM_ACTIVE_COLORS;
 	bool fire    = smd->domain->active_fields & SM_ACTIVE_FIRE;
+	bool guiding = smd->domain->active_fields & SM_ACTIVE_GUIDING;
 
 	std::string manta_script;
 
@@ -772,6 +797,8 @@ void FLUID::exportSmokeScript(SmokeModifierData *smd)
 		manta_script += smoke_alloc_colors_low;
 	if (fire)
 		manta_script += smoke_alloc_fire_low;
+	if (guiding)
+		manta_script += fluid_alloc_guiding_low;
 
 	if (highres) {
 		manta_script += fluid_variables_high
@@ -790,6 +817,8 @@ void FLUID::exportSmokeScript(SmokeModifierData *smd)
 	}
 	
 	manta_script += smoke_import_low;
+	if (guiding)
+	    manta_script += fluid_import_low;
 	if (highres)
 		manta_script += smoke_import_high;
 	
@@ -835,6 +864,7 @@ void FLUID::exportSmokeData(SmokeModifierData *smd)
 void FLUID::exportLiquidScript(SmokeModifierData *smd)
 {
 	bool highres = smd->domain->flags & MOD_SMOKE_HIGHRES;
+	bool guiding = smd->domain->active_fields & SM_ACTIVE_GUIDING;
 
 	std::string manta_script;
 	
@@ -855,6 +885,7 @@ void FLUID::exportLiquidScript(SmokeModifierData *smd)
 	}
 
 	manta_script += liquid_import_low;
+	manta_script += fluid_import_low;
 	if (highres)
 		manta_script += liquid_import_high;
 	
@@ -862,6 +893,8 @@ void FLUID::exportLiquidScript(SmokeModifierData *smd)
 	manta_script += liquid_post_step_low;
 	
 	manta_script += liquid_step_low;
+	if (guiding)
+		manta_script += fluid_import_low;
 	if (highres)
 		manta_script += liquid_step_high;
 
@@ -1122,6 +1155,15 @@ void FLUID::updatePointers()
 	mPhiObsIn = (float*) getDataPointer("phiObsIn" + solver_ext, solver);
 	mPhiOutIn = (float*) getDataPointer("phiOutIn" + solver_ext, solver);
 
+	if (mUsingGuiding) {
+		mPhiGuideIn = (float*) getDataPointer("phiGuideIn" + solver_ext, solver);
+		mNumGuide = (int*) getDataPointer("numGuides" + solver_ext, solver);
+
+		mGuideVelocityX = (float*) getDataPointer("x_guidevel" + solver_ext, solver);
+		mGuideVelocityY = (float*) getDataPointer("y_guidevel" + solver_ext, solver);
+		mGuideVelocityZ = (float*) getDataPointer("z_guidevel" + solver_ext, solver);
+	}
+
 	// Liquid
 	if (mUsingLiquid) {
 		mPhiIn  = (float*) getDataPointer("phiIn" + solver_ext,  solver);
@@ -1143,13 +1185,6 @@ void FLUID::updatePointers()
 		mInVelocityY = (float*) getDataPointer("y_invel" + solver_ext, solver);
 		mInVelocityZ = (float*) getDataPointer("z_invel" + solver_ext, solver);
 
-		mPhiGuideIn = (float*) getDataPointer("phiGuideIn" + solver_ext, solver);
-		mNumGuide = (int*) getDataPointer("numGuides" + solver_ext, solver);
-
-		mGuideVelocityX = (float*) getDataPointer("x_guidevel" + solver_ext, solver);
-		mGuideVelocityY = (float*) getDataPointer("y_guidevel" + solver_ext, solver);
-		mGuideVelocityZ = (float*) getDataPointer("z_guidevel" + solver_ext, solver);
-
 		if (mUsingHeat) {
 			mHeat       = (float*) getDataPointer("heat" + solver_ext,    solver);
 		}
diff --git a/intern/mantaflow/intern/FLUID.h b/intern/mantaflow/intern/FLUID.h
index f2c3dfa6034..d01572eafba 100644
--- a/intern/mantaflow/intern/FLUID.h
+++ b/intern/mantaflow/intern/FLUID.h
@@ -55,6 +55,7 @@ public:
 	void initColorsHigh(struct SmokeModifierData *smd);
 	void initLiquid(SmokeModifierData *smd);
 	void initLiquidHigh(SmokeModifierData *smd);
+	void initGuiding(SmokeModifierData *smd);
 	
 	// Pointer transfer Mantaflow -> Blender
 	void updatePointers();
@@ -214,6 +215,7 @@ private:
 	bool mUsingHeat;
 	bool mUsingColors;
 	bool mUsingFire;
+	bool mUsingGuiding;
 	bool mUsingHighRes;
 	bool mUsingLiquid;
 	bool mUsingSmoke;
diff --git a/intern/mantaflow/intern/manta_fluid_API.cpp b/intern/mantaflow/intern/manta_fluid_API.cpp
index 959b92eb851..d420789d60f 100644
--- a/intern/mantaflow/intern/manta_fluid_API.cpp
+++ b/intern/mantaflow/intern/manta_fluid_API.cpp
@@ -459,7 +459,7 @@ extern "C" int *fluid_get_num_obstacle(FLUID *fluid)
 	return fluid->getNumObstacle();
 }
 
-extern "C" int *smoke_get_num_guide(FLUID *fluid)
+extern "C" int *fluid_get_num_guide(FLUID *fluid)
 {
 	return fluid->getNumGuide();
 }
@@ -522,11 +522,6 @@ extern "C" void smoke_ensure_colors(FLUID *smoke, struct SmokeModifierData *smd)
 	}
 }
 
-extern "C" float *smoke_get_phiguidein(FLUID *smoke)
-{
-	return smoke->getPhiGuideIn();
-}
-
 extern "C" void liquid_ensure_init(FLUID *smoke, struct SmokeModifierData *smd)
 {
 	if (smoke) {
@@ -535,6 +530,19 @@ extern "C" void liquid_ensure_init(FLUID *smoke, struct SmokeModifierData *smd)
 	}
 }
 
+extern "C" void fluid_ensure_guiding(FLUID *fluid, struct SmokeModifierData *smd)
+{
+	if (fluid) {
+		fluid->initGuiding(smd);
+		fluid->updatePointers();
+	}
+}
+
+extern "C" float *fluid_get_phiguidein(FLUID *fluid)
+{
+	return fluid->getPhiGuideIn();
+}
+
 extern "C" float *liquid_get_phiin(FLUID *liquid)
 {
 	return liquid->getPhiIn();
diff --git a/intern/mantaflow/intern/strings/shared_script.h b/intern/mantaflow/intern/strings/shared_script.h
index fb5d3c4ad73..2c03427d400 100644
--- a/intern/mantaflow/intern/strings/shared_script.h
+++ b/intern/mantaflow/intern/strings/shared_script.h
@@ -76,7 +76,15 @@ boundConditions_s$ID$     = '$BOUNDCONDITIONS$'\n\
 boundaryWidth_s$ID$       = 1\n\
 \n\
 using_highres_s$ID$   = $USING_HIGHRES$\n\
-using_adaptTime_s$ID$ = $USIN

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list