[Bf-blender-cvs] [dc529de] soc-2014-fluid: resizeable domain added. Working for non-rotated objects

Roman Pogribnyi noreply at git.blender.org
Wed Aug 13 22:31:16 CEST 2014


Commit: dc529debbd6aafc01844bc7f748e94458a140d45
Author: Roman Pogribnyi
Date:   Wed Aug 13 20:57:12 2014 +0200
Branches: soc-2014-fluid
https://developer.blender.org/rBdc529debbd6aafc01844bc7f748e94458a140d45

resizeable domain added. Working for non-rotated objects

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

M	intern/smoke/intern/MANTA.cpp
M	intern/smoke/intern/smoke_API.cpp
M	release/scripts/startup/bl_ui/properties_physics_smoke.py

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

diff --git a/intern/smoke/intern/MANTA.cpp b/intern/smoke/intern/MANTA.cpp
index 4021917..8b82f6b 100644
--- a/intern/smoke/intern/MANTA.cpp
+++ b/intern/smoke/intern/MANTA.cpp
@@ -7,6 +7,7 @@ void runMantaScript(vector<string>& args);//defined in manta_pp/pwrapper/pymain.
 
 extern "C" bool manta_check_grid_size(struct FLUID_3D *fluid, int dimX, int dimY, int dimZ)
 {
+	/*Y and Z axes are swapped in manta and blender*/
 	if (!(dimX == fluid->xRes() && dimY == fluid->yRes() && dimZ == fluid->zRes())) {
 		for (int cnt(0); cnt < fluid->_totalCells; cnt++)
 			fluid->_density[cnt] = 0.0f;
@@ -17,6 +18,7 @@ extern "C" bool manta_check_grid_size(struct FLUID_3D *fluid, int dimX, int dimY
 
 extern "C" bool manta_check_wavelets_size(struct WTURBULENCE *wt, int dimX, int dimY, int dimZ)
 {
+	/*Y and Z axes are swapped in manta and blender*/
 	if (!(dimX == wt->_xResBig && dimY == wt->_yResBig && dimZ == wt->_zResBig)) {
 		for (int cnt(0); cnt < wt->_totalCellsBig; cnt++)
 			wt->_densityBig[cnt] = 0.0f;
@@ -25,6 +27,65 @@ extern "C" bool manta_check_wavelets_size(struct WTURBULENCE *wt, int dimX, int
 	return true;
 }
 
+void read_rotated_grid(gzFile gzf, float *data, int size_x, int size_y, int size_z)
+{
+	assert(size_x > 1 && size_y > 1 && size_z > 1);
+	float* temp_data = (float*)malloc(sizeof(float) * size_x * size_y * size_z);
+//	data = (float*)malloc(sizeof(float) * size_x * size_y * size_z);
+	gzread(gzf, temp_data, sizeof(float)* size_x * size_y * size_z);
+	for (int cnt_x(0); cnt_x < size_x; ++cnt_x)
+	{
+		for (int cnt_y(0); cnt_y < size_y; ++cnt_y)
+		{
+			for (int cnt_z(0); cnt_z < size_z; ++cnt_z)
+			{
+				data[cnt_x + size_x * cnt_y + size_x*size_y * cnt_z] = temp_data[cnt_x + size_x * cnt_y + size_x*size_y * cnt_z];
+			}			
+		}
+	}
+}
+
+void wavelets_add_lowres_density(SmokeDomainSettings *sds)
+{
+	assert(sds != NULL);
+	for (int cnt_x(0); cnt_x < sds->wt->_xResBig; ++cnt_x)
+	{
+		for (int cnt_y(0); cnt_y < sds->wt->_yResBig; ++cnt_y)
+		{
+			for (int cnt_z(0); cnt_z < sds->wt->_zResBig; ++cnt_z)
+			{
+				//scale down to domain res
+				float x_sc = 1. * sds->base_res[0] * cnt_x / sds->wt->_xResBig;
+				float y_sc = 1. * sds->base_res[1] * cnt_y / sds->wt->_yResBig;
+				float z_sc = 1. * sds->base_res[2] * cnt_z / sds->wt->_zResBig;
+				//finding cells to interpolate from
+				int start_x = int(x_sc / 1);
+				int start_y = int(y_sc / 1);
+				int start_z = int(z_sc / 1);
+				int end_x = ((x_sc - start_x > 0.001) && (start_x + 1 < sds->base_res[0]))? start_x + 1: start_x;
+				int end_y = ((y_sc - start_y > 0.001) && (start_y + 1 < sds->base_res[1]))? start_y + 1: start_y;
+				int end_z = ((z_sc - start_z > 0.001) && (start_z + 1 < sds->base_res[2]))? start_z + 1: start_z;
+				//interpolation
+				float add_value = 0;
+				int cnt=0;
+				for(int x(start_x); x <= end_x; ++x)
+				{
+					for(int y(start_y); y <= end_y; ++y)
+					{
+						for(int z(start_z); z <= end_z; ++z)
+						{
+							cnt++;
+							add_value += sds->fluid->_density[x + y*sds->base_res[0] + z * sds->base_res[0]*sds->base_res[1]];	
+						}			
+					}	
+				}
+				add_value /= float(cnt);
+				sds->wt->_densityBig[cnt_x + cnt_y *sds->wt->_xResBig + cnt_z*sds->wt->_xResBig*sds->wt->_yResBig] += add_value;
+			}
+		}
+	}
+}
+
 //PR need SMD data here for wavelets 
 extern "C" int read_mantaflow_sim(struct SmokeDomainSettings *sds, char *name, bool reading_wavelets)
 {
@@ -100,11 +161,17 @@ extern "C" int read_mantaflow_sim(struct SmokeDomainSettings *sds, char *name, b
 		/* actual grid read */
         if ( ! reading_wavelets){
 			if (!manta_check_grid_size(sds->fluid, head.dimX, head.dimY, head.dimZ))	return 0;
-			gzread(gzf,sds->fluid->_density, sizeof(float)*head.dimX*head.dimY*head.dimZ);
+			/*Y and Z axes are swapped in manta and blender*/
+			read_rotated_grid(gzf,sds->fluid->_density,head.dimX,head.dimY,head.dimZ);
+			//gzread(gzf,sds->fluid->_density, sizeof(float)*head.dimX*head.dimY*head.dimZ);
     	}
 		else{
 			if (!manta_check_wavelets_size(sds->wt, head.dimX, head.dimY, head.dimZ))	return 0;
-			gzread(gzf,sds->wt->_densityBig, sizeof(float)*head.dimX*head.dimY*head.dimZ);
+			/*Y and Z axes are swapped in manta and blender*/
+			read_rotated_grid(gzf,sds->wt->_densityBig,head.dimX,head.dimY,head.dimZ);
+//			wavelets_add_lowres_density(sds);
+//			read_rotated_grid(gzf,sds->wt->_densityBigOld,head.dimX,head.dimY,head.dimZ);
+			//	gzread(gzf,sds->wt->_densityBig, sizeof(float)*head.dimX*head.dimY*head.dimZ);
 		}
 	}
     gzclose(gzf);
@@ -188,9 +255,9 @@ inline bool file_exists (const std::string& name) {
 /*blender transforms obj coords to [-1,1]. This method transforms them back*/
 void add_mesh_transform_method(stringstream& ss)
 {
-	ss << "def transform_back(obj, res):\n" <<
-	"  obj.scale(vec3(res/2, res/2, res/2))\n" <<
-	"  obj.offset(vec3(res/2, res/2, res/2))\n\n";
+	ss << "def transform_back(obj, gs):\n" <<
+	"  obj.scale(gs/2)\n" <<
+	"  obj.offset(gs/2)\n\n";
 }
 
 void manta_cache_path(char *filepath)
@@ -308,7 +375,7 @@ void generate_manta_sim_file(Scene *scene, SmokeModifierData *smd)
 	add_mesh_transform_method(ss);
 	/*Data Declaration*/
 	/*Wavelets variables*/
-	int upres = smd->domain->amplify;
+	int upres = smd->domain->amplify+1;
 	ss << "uvs = " << smd->domain->manta_uvs_num << "\n";
 	ss << "velInflow = vec3(0, 0, 1)"<< "\n";	/*TODO:add UI*/
 	if (wavelets) {
@@ -324,7 +391,7 @@ void generate_manta_sim_file(Scene *scene, SmokeModifierData *smd)
 	/*Solver Resolution*/
 	ss << "res = " << smd->domain->maxres << " \n";
 	/*Z axis in Blender = Y axis in Mantaflow*/
-	manta_create_solver(ss, "s", "main", "gs", smd->domain->base_res[0], smd->domain->base_res[2], smd->domain->base_res[1], smd->domain->manta_solver_res);
+	manta_create_solver(ss, "s", "main", "gs", smd->domain->base_res[0], smd->domain->base_res[1], smd->domain->base_res[2], smd->domain->manta_solver_res);
 	ss << "s.timestep = " << smd->domain->time_scale << " \n";
 	
 	/*Noise Field*/
@@ -333,17 +400,17 @@ void generate_manta_sim_file(Scene *scene, SmokeModifierData *smd)
 	/*Inflow source - for now, using mock sphere */
 	ss << "source = s.create(Mesh)\n";
 	ss << "source.load('manta_flow.obj')\n";
-	ss << "transform_back(source, res)\n";
+	ss << "transform_back(source, gs)\n";
 	ss << "sourceVel = s.create(Mesh)\n";
 	ss << "sourceVel.load('manta_flow.obj')\n";
-	ss << "transform_back(sourceVel, res)\n";
+	ss << "transform_back(sourceVel, gs)\n";
 	//	ss << "source    = s.create(Cylinder, center=gs*vec3(0.3,0.2,0.5), radius=res*0.081, z=gs*vec3(0.081, 0, 0))\n";
 	//	ss << "sourceVel = s.create(Cylinder, center=gs*vec3(0.3,0.2,0.5), radius=res*0.15 , z=gs*vec3(0.15 , 0, 0))\n";
 	
 	/*Wavelets: larger solver*/
 	if(wavelets && upres>0)
 	{
-		manta_create_solver(ss, "xl", "larger", "xl_gs", smd->domain->fluid->xRes() * upres, smd->domain->fluid->zRes()* upres, smd->domain->fluid->yRes() * upres, smd->domain->manta_solver_res);
+		manta_create_solver(ss, "xl", "larger", "xl_gs", smd->domain->fluid->xRes() * upres, smd->domain->fluid->yRes()* upres, smd->domain->fluid->zRes() * upres, smd->domain->manta_solver_res);
 		ss << "xl.timestep = " << smd->domain->time_scale << " \n";
 		
 		ss << "xl_vel = xl.create(MACGrid) \n";
@@ -355,7 +422,7 @@ void generate_manta_sim_file(Scene *scene, SmokeModifierData *smd)
 		//		ss << "xl_source = xl.create(Cylinder, center=xl_gs*vec3(0.3,0.2,0.5), radius=xl_gs.x*0.081, z=xl_gs*vec3(0.081, 0, 0)) \n";
 		ss << "xl_source = s.create(Mesh)\n";
 		ss << "xl_source.load('manta_flow.obj')\n";
-		ss << "transform_back(xl_source, res)\n";
+		ss << "transform_back(xl_source, xl_gs)\n";
 		//		ss << "xl_source.scale(vec3("<< upres <<", " << upres <<", " << upres << "))\n";
 		
 		/*Obstacle handling*/
@@ -363,7 +430,7 @@ void generate_manta_sim_file(Scene *scene, SmokeModifierData *smd)
 		{
 			ss << "xl_obs = s.create(Mesh)\n";
 			ss << "xl_obs.load('manta_coll.obj')\n";
-			ss << "transform_back(xl_obs, res)\n";
+			ss << "transform_back(xl_obs, xl_gs)\n";
 			ss << "xl_obs.applyToGrid(grid=xl_flags, value=FlagObstacle,cutoff=3)\n";
 		}
 		manta_gen_noise(ss, "xl", 0, "xl_noise", 256, true, noise_clamp, noise_clamp_neg, noise_clamp_pos, noise_val_scale, noise_val_offset, noise_time_anim * (float)upres);
@@ -377,7 +444,7 @@ void generate_manta_sim_file(Scene *scene, SmokeModifierData *smd)
 	{
 		ss << "obs = s.create(Mesh)\n";
 		ss << "obs.load('manta_coll.obj')\n";
-		ss << "transform_back(obs, res)\n";
+		ss << "transform_back(obs, gs)\n";
 		ss << "obs.applyToGrid(grid=flags, value=FlagObstacle, cutoff=3)\n";
 		ss << "sdf_obs  = s.create(LevelsetGrid)\n";
 		ss << "obs.meshSDF(obs, sdf_obs, 1.1)\n";
@@ -479,7 +546,7 @@ void generate_manta_sim_file(Scene *scene, SmokeModifierData *smd)
 		ss << "  for substep in range(upres):  \n";
 		ss << "    advectSemiLagrange(flags=xl_flags, vel=xl_vel, grid=xl_density, order=2)  \n";
 		ss << "  if (applyInflow): \n";
-		ss << "    densityInflowMesh( flags=xl_flags, density=xl_density, noise=xl_noise, mesh=xl_source, scale=1, sigma=0.5 ) \n";
+		ss << "    densityInflowMesh( flags=xl_flags, density=xl_density, noise=xl_noise, mesh=xl_source, scale=3, sigma=0.5 ) \n";
 		ss << "  xl_density.save('densityXl_%04d.uni' % t)\n";
 		//ss << "    densityInflow( flags=xl_flags, density=xl_density, noise=xl_noise, shape=xl_source, scale=1, sigma=0.5 ) \n";
 //		ss << "  xl.step()   \n";
diff --git a/intern/smoke/intern/smoke_API.cpp b/intern/smoke/intern/smoke_API.cpp
index 5dd4e7a..5cce068 100644
--- a/intern/smoke/intern/smoke_API.cpp
+++ b/intern/smoke/intern/smoke_API.cpp
@@ -530,12 +530,12 @@ extern "C" void manta_write_effectors(struct Scene *s, struct SmokeModifierData
 	assert(smd->domain->manta_obj != NULL);
 	manta_update_effectors(s, smd->domain->manta_obj, smd->domain, 0.1f);
 	int size_x = smd->domain->fluid->xRes();
-	int size_y = smd->domain->fluid->zRes();
-	int size_z = smd->domain->fluid->yRes();
+	int size_y = smd->domain->fluid->yRes();
+	int size_z = smd->domain->fluid->zRes();
 	
 	float *force_x = smoke_get_force_x(smd->domain->fluid);
-	float *force_y = smoke_get_force_z(smd->domain->fluid);
-	float *force_z = smoke_get_force_y(smd->domain->fluid

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list