[Bf-blender-cvs] [2d0f34e] soc-2014-fluid: Manta 2D Smoke display correct

Roman Pogribnyi noreply at git.blender.org
Sun Feb 1 23:59:28 CET 2015


Commit: 2d0f34ef76d6af235b21dbc5f1db7a943749914a
Author: Roman Pogribnyi
Date:   Sun Feb 1 23:52:19 2015 +0100
Branches: soc-2014-fluid
https://developer.blender.org/rB2d0f34ef76d6af235b21dbc5f1db7a943749914a

Manta 2D Smoke display correct

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

M	intern/smoke/extern/smoke_API.h
M	intern/smoke/intern/MANTA.cpp
M	intern/smoke/intern/MANTA.h
M	intern/smoke/intern/scenarios/smoke.h
M	intern/smoke/intern/smoke_API.cpp

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

diff --git a/intern/smoke/extern/smoke_API.h b/intern/smoke/extern/smoke_API.h
index 2229201..11bb26e 100644
--- a/intern/smoke/extern/smoke_API.h
+++ b/intern/smoke/extern/smoke_API.h
@@ -119,6 +119,7 @@ void manta_write_effectors(struct FLUID_3D *fluid);
 void manta_update_effectors(struct Scene *scene, struct Object *ob,struct SmokeDomainSettings *sds, float dt);
 void manta_write_emitters(struct SmokeFlowSettings *sfs, bool highRes, int min_x, int min_y, int min_z, int max_x, int max_y, int max_z, int d_x, int d_y, int d_z,float *influence, float *vel);	
 void manta_export_obstacles(float * influence, int x, int y, int z);
+	int cell_index_3D(int index_2d,int sizex,int sizey, int sizez); /*For 2D sims only: transforms 2D manta cell index into 3D Blender index*/
 #ifdef __cplusplus
 }
 #endif
diff --git a/intern/smoke/intern/MANTA.cpp b/intern/smoke/intern/MANTA.cpp
index 75c5abf..1ebabc7 100644
--- a/intern/smoke/intern/MANTA.cpp
+++ b/intern/smoke/intern/MANTA.cpp
@@ -285,7 +285,7 @@ string Manta_API::gridNameFromType(const string &type)
 	}
 }
 
-void Manta_API::addGrid(void * data, string name, string type, int x, int y, int z)
+void Manta_API::addGrid(void * data, string name, string type, int x, int y, int z, bool is2D = false)
 {
 	if (data == NULL || name == "" || gridNameFromType(type) == "") return;
 	cout << "Adding Grid:" << name<<endl; 
@@ -296,8 +296,13 @@ void Manta_API::addGrid(void * data, string name, string type, int x, int y, int
 	stringStream << grid_name << " = s.create(" << gridNameFromType(type) << ")";
 	const std::string command_1 = stringStream.str();
 	stringStream.str("");
-
-	stringStream << grid_name << ".readGridFromMemory(\'"<< data << "\', " << x << "," << y << "," << z << ")";
+	if (is2D){
+		/*for 2D case, Y and Z axes are switched, Y axis is '1' for Mantaflow*/
+		stringStream << grid_name << ".readGridFromMemory(\'"<< data << "\', " << x << "," << z << "," << 1 << ")";
+	}
+	else{
+		stringStream << grid_name << ".readGridFromMemory(\'"<< data << "\', " << x << "," << y << "," << z << ")";
+	}
 	const std::string command_2 = stringStream.str();
 	const std::string command_3 = name + ".add(" + grid_name + ")";
 	PyGILState_STATE gilstate = PyGILState_Ensure();
@@ -307,7 +312,7 @@ void Manta_API::addGrid(void * data, string name, string type, int x, int y, int
 	PyGILState_Release(gilstate);		
 }
 
-void Manta_API::addAdaptiveGrid(void * data, string gridName, string solverName, string type, int minX, int minY, int minZ, int maxX, int maxY, int maxZ)
+void Manta_API::addAdaptiveGrid(void * data, string gridName, string solverName, string type, int minX, int minY, int minZ, int maxX, int maxY, int maxZ, bool is2D = false)
 {
 	if (data == NULL || gridName == "" || gridNameFromType(type) == "") return;
 	{
@@ -321,8 +326,15 @@ void Manta_API::addAdaptiveGrid(void * data, string gridName, string solverName,
 	stringStream << temp_grid_name << " = "<< solverName << ".create(" << gridNameFromType(type) << ")";
 	const std::string command_1 = stringStream.str();
 	stringStream.str("");
-	stringStream << temp_grid_name << ".readAdaptiveGridFromMemory(\'"<< data << "\', vec3(" << minX << "," << minY << "," << minZ << 
-	"), vec3(" << maxX << "," << maxY << "," << maxZ << ") )";
+	
+	if (is2D){
+		stringStream << temp_grid_name << ".readAdaptiveGridFromMemory(\'"<< data << "\', vec3(" << minX << "," << minZ << "," << 1 << 
+		"), vec3(" << maxX << "," << maxZ << "," << 1 << ") )";
+	}
+	else{
+		stringStream << temp_grid_name << ".readAdaptiveGridFromMemory(\'"<< data << "\', vec3(" << minX << "," << minY << "," << minZ << 
+		"), vec3(" << maxX << "," << maxY << "," << maxZ << ") )";
+	}
 	const std::string command_2 = stringStream.str();
 	const std::string command_3 = gridName + ".add(" + temp_grid_name + ")";
 	PyGILState_STATE gilstate = PyGILState_Ensure();
@@ -334,7 +346,7 @@ void Manta_API::addAdaptiveGrid(void * data, string gridName, string solverName,
 	PyGILState_Release(gilstate);		
 }
 
-void Manta_API::export_obstacles(float *data, int x, int y, int z)
+void Manta_API::export_obstacles(float *data, int x, int y, int z, bool is2D = false)
 {
 	if (data == NULL){
 		cout << "NULL passed to grid export_obstacles " <<endl;  return;
@@ -346,7 +358,12 @@ void Manta_API::export_obstacles(float *data, int x, int y, int z)
 	const std::string command_1 = stringStream.str();
 	stringStream.str("");
 	cout<<"Exporting obstacles"<<endl;
-	stringStream << grid_name << ".readGridFromMemory(\'"<< data << "\', " << x << "," << y << "," << z << ")";
+	if (is2D){
+		stringStream << grid_name << ".readGridFromMemory(\'"<< data << "\', " << x << "," << z << "," << 1 << ")";
+	}
+	else{
+		stringStream << grid_name << ".readGridFromMemory(\'"<< data << "\', " << x << "," << y << "," << z << ")";
+	}
 	const std::string command_2 = stringStream.str();
 	const std::string command_3 = grid_name + ".applyToGrid(grid = flags, value = FlagObstacle)";
 	PyGILState_STATE gilstate = PyGILState_Ensure();
@@ -387,6 +404,7 @@ void Manta_API::generate_manta_sim_file_highRes(SmokeModifierData *smd)
 std::string Manta_API::getRealValue( const std::string& varName, SmokeModifierData *smd)
 {
 	ostringstream ss;
+	bool is2D = smd->domain->fluid->manta_resoution == 2;
 	if (varName == "UVS_CNT")
 		ss << smd->domain->manta_uvs_num ;
 	else if (varName == "UPRES")
@@ -397,10 +415,15 @@ std::string Manta_API::getRealValue( const std::string& varName, SmokeModifierDa
 		ss <<  smd->domain->maxres;
 	else if (varName == "RESX")
 		ss <<  smd->domain->fluid->_xRes;
+	
 	else if (varName == "RESY")
-		ss <<  smd->domain->fluid->_yRes;
+		if (is2D){	ss <<  smd->domain->fluid->_zRes;}
+		else{ 		ss <<  smd->domain->fluid->_yRes;}
+	
 	else if (varName == "RESZ")
-		ss <<  smd->domain->fluid->_zRes;
+		if (is2D){	ss << 1;}
+		else{ 		ss << smd->domain->fluid->_zRes;}
+	
 	else if (varName == "SOLVER_DIM")
 		ss <<  smd->domain->manta_solver_res;
 	else if (varName == "NOISE_CN")
@@ -416,9 +439,13 @@ std::string Manta_API::getRealValue( const std::string& varName, SmokeModifierDa
 	else if (varName == "HRESX")
 		ss << smd->domain->wt->getResBig()[0];
 	else if (varName == "HRESY")
-		ss << smd->domain->wt->getResBig()[1];
+		if (is2D){	ss << smd->domain->wt->getResBig()[2];}
+		else{ 		ss << smd->domain->wt->getResBig()[1];}
+
 	else if (varName == "HRESZ")
-		ss << smd->domain->wt->getResBig()[2];
+		if (is2D){	ss << 1;}
+		else{ 		ss << smd->domain->wt->getResBig()[2];}
+
 	else if (varName == "TIMESTEP")
 		ss << smd->domain->time_scale * 0.1f;
 	else if (varName == "XL_TIMESTEP")
@@ -593,7 +620,12 @@ void Manta_API::updatePointers(FLUID_3D *fluid, bool updateColor)
 		int step = 0;
 		for (int cnt(0); cnt < fluid->xRes() * fluid->zRes()-1; ++cnt){
 			assert(fluid->_yLocation != -1);
-			step = (fluid->_yLocation) + cnt * fluid->yRes();
+			step = int(fluid->_yRes * 0.5) * fluid->_xRes + 
+					(cnt % (fluid->_xRes)) + 
+					int(cnt/(fluid->_xRes)) * fluid->_xRes * fluid->_yRes;
+			if ((step < 0) || (step > fluid->_totalCells)){
+				cout << "UpdatePointers: step is larger tahn cell dim" << step << endl;
+			}
 			fluid->_density[step] = manta_fluid_density[cnt];
 			fluid->_manta_flags[step] = manta_fluid_flags[cnt];
 		}		
diff --git a/intern/smoke/intern/MANTA.h b/intern/smoke/intern/MANTA.h
index 3dbaa0c..fad858a 100644
--- a/intern/smoke/intern/MANTA.h
+++ b/intern/smoke/intern/MANTA.h
@@ -120,9 +120,9 @@ public:
 	static void * pointerFromString(const std::string& s);
 	
 	static string gridNameFromType(const string& type);
-	static void addGrid(void * data,string name, string type, int x, int y, int z);
-	static void addAdaptiveGrid(void * data, string gridName, string solverName, string type,int minX, int minY, int minZ, int maxX, int maxY, int maxZ);
-	static void export_obstacles(float *data, int x, int y, int z);
+	static void addGrid(void * data,string name, string type, int x, int y, int z, bool is2D);
+	static void addAdaptiveGrid(void * data, string gridName, string solverName, string type,int minX, int minY, int minZ, int maxX, int maxY, int maxZ, bool is2D);
+	static void export_obstacles(float *data, int x, int y, int z, bool is2D);
 	
 	static std::string getGridPointer(string gridName, string solverName);
 	static void updatePointers(FLUID_3D *fluid, bool updateColor);
diff --git a/intern/smoke/intern/scenarios/smoke.h b/intern/smoke/intern/scenarios/smoke.h
index 37835a6..d931114 100644
--- a/intern/smoke/intern/scenarios/smoke.h
+++ b/intern/smoke/intern/scenarios/smoke.h
@@ -31,14 +31,14 @@ density = s.create(LevelsetGrid)\n\
 pressure = s.create(RealGrid)\n\
 \n\
 # noise field\n\
-noise = s.create(NoiseField, loadFromFile=True)\n\
-noise.posScale = vec3(45)\n\
-noise.clamp = True\n\
-noise.clampNeg = 0\n\
-noise.clampPos = 1\n\
-noise.valScale = 1\n\
-noise.valOffset = 0.75\n\
-noise.timeAnim = 0.2\n\
+#noise = s.create(NoiseField, loadFromFile=True)\n\
+#noise.posScale = vec3(45)\n\
+#noise.clamp = True\n\
+#noise.clampNeg = 0\n\
+#noise.clampPos = 1\n\
+#noise.valScale = 1\n\
+#noise.valOffset = 0.75\n\
+#noise.timeAnim = 0.2\n\
 \n\
 flags.initDomain()\n\
 flags.fillGrid()\n\
@@ -145,20 +145,25 @@ for step in range(100):\n\
 
 const string smoke_step_low = "def sim_step_low(t, standalone = False):\n\
   #applying inflow\n\
-  if standalone and t==0:\n\
-    density.load('density.uni')\n\
-    flags.load('flags.uni')\n\
-    forces.load('forces.uni')\n\
-  if standalone:\n\
-    inflow_grid.load('inflow.uni')\n\
-    inflow_grid.multConst(0.1)\n\
-    density.add(inflow_grid)\n\
-  elif solver_dim == 2:\n\
+  #if standalone and t==0:\n\
+  #  density.load('density.uni')\n\
+  #  flags.load('flags.uni')\n\
+  #  forces.load('forces.uni')\n\
+  #if standalone:\n\
+  #  inflow_grid.load('inflow.uni')\n\
+  #  inflow_grid.multConst(0.1)\n\
+  #  density.add(inflow_grid)\n\
+  #elif solver_dim == 2:\n\
+  #  density.add(inflow_grid)\n\
+  print ('Simulating frame ' + str(t))\n\
+  if not standalone and t == 1 and solver_dim == 2:\n\
     density.add(inflow_grid)\n\
   if manta_using_heat:\n\
-    addHeatBuoyancy(density=density, densCoeff = 0.001, vel=vel, gravity=vec3(0,0,-0.981), flags=flags, heat = heat_low, heatCoe

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list