[Bf-blender-cvs] [c9571f9] soc-2014-fluid: Run sim from timeline, without Bake button

Roman Pogribnyi noreply at git.blender.org
Sun Aug 17 15:58:57 CEST 2014


Commit: c9571f9a3ea64d3bfe16bdc503f354b082c98746
Author: Roman Pogribnyi
Date:   Sun Aug 17 15:55:00 2014 +0200
Branches: soc-2014-fluid
https://developer.blender.org/rBc9571f9a3ea64d3bfe16bdc503f354b082c98746

Run sim from timeline, without Bake button

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

M	intern/smoke/intern/MANTA.cpp
M	release/scripts/startup/bl_ui/properties_physics_smoke.py
M	source/blender/blenkernel/intern/smoke.c
M	source/blender/makesrna/intern/rna_smoke.c

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

diff --git a/intern/smoke/intern/MANTA.cpp b/intern/smoke/intern/MANTA.cpp
index ad4af88..ef4169e 100644
--- a/intern/smoke/intern/MANTA.cpp
+++ b/intern/smoke/intern/MANTA.cpp
@@ -169,6 +169,7 @@ extern "C" int read_mantaflow_sim(struct SmokeDomainSettings *sds, char *name, b
 			if (!manta_check_wavelets_size(sds->wt, head.dimX, head.dimY, head.dimZ))	return 0;
 			/*Y and Z axes are swapped in manta and blender*/
 			gzread(gzf,sds->wt->_densityBig, sizeof(float)*head.dimX*head.dimY*head.dimZ);
+			gzread(gzf,sds->wt->_densityBigOld, sizeof(float)*head.dimX*head.dimY*head.dimZ);
 //			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);
@@ -243,7 +244,7 @@ void manta_create_solver(stringstream& ss, char *name, char *nick, char *grid_si
 	if ((dim != 2) && (dim != 3))
 	{ return; }
 	if (dim == 2)
-	{ z_res = 1; }
+	{ y_res = 1; }
 	ss << grid_size_name << " = vec3(" << x_res << ", " << y_res << ", " << z_res << ")" << " \n";
 	ss << name << " = Solver(name = '" << nick << "', gridSize = " << grid_size_name << ", dim = " << dim << ") \n";
 }
@@ -298,18 +299,36 @@ void *run_manta_scene_thread(void *arguments)
 
 void run_manta_scene(Scene *s, SmokeModifierData *smd)
 {
-//	vector<string> a;
-//	a.push_back(filepath);
-//	//PyGILState_STATE gilstate = PyGILState_Ensure();
-//	runMantaScript(a);
-//	//PyGILState_Release(gilstate);
-	struct manta_arg_struct *args = (struct manta_arg_struct*)malloc(sizeof(struct manta_arg_struct));
-	args->smd = *smd;
-	args->s = *s;
-//	args.frame_num = smd->domain->manta_end_frame - smd->domain->manta_start_frame;
-	int rc = pthread_create(&manta_thread, NULL, run_manta_sim_thread, (void *)args);
-//	pthread_join(manta_thread,NULL);
-//	pthread_detach(manta_thread);
+	smd->domain->manta_sim_frame = 0;
+	PyGILState_STATE gilstate = PyGILState_Ensure();
+//	for (int fr=0; fr< 1; ++fr)
+	int fr = s->r.cfra;
+	{
+//		if(smd->domain->manta_sim_frame == -1)
+//			break;
+		printf("Simulation Step");
+		manta_write_effectors(s, smd);
+		smd->domain->manta_sim_frame = fr;
+		std::string frame_str = static_cast<ostringstream*>( &(ostringstream() << fr) )->str();
+		std::string py_string_0 = string("sim_step(").append(frame_str);
+		std::string py_string_1 = py_string_0.append(")\0");
+		//		std::string py_string_1 = string("sim_step()\0");
+		PyRun_SimpleString(py_string_1.c_str());
+		cout<< "done"<<manta_sim_running<<endl;
+		//		frame_num ++;
+	}
+	//returning simulation state to "not simulating" aka -1
+//	smd->domain->manta_sim_frame = -1;
+//
+//	
+//	
+//	struct manta_arg_struct *args = (struct manta_arg_struct*)malloc(sizeof(struct manta_arg_struct));
+//	args->smd = *smd;
+//	args->s = *s;
+////	args.frame_num = smd->domain->manta_end_frame - smd->domain->manta_start_frame;
+//	int rc = pthread_create(&manta_thread, NULL, run_manta_sim_thread, (void *)args);
+////	pthread_join(manta_thread,NULL);
+////	pthread_detach(manta_thread);
 }
 
 void stop_manta_sim()
@@ -396,7 +415,7 @@ void generate_manta_sim_file(Scene *scene, SmokeModifierData *smd)
 //	int size_y = int(smd->domain->global_size[1] * factor);
 //	int size_z = int(smd->domain->global_size[2] * factor);
 //	
-	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);
+	manta_create_solver(ss, "s", "main", "gs", smd->domain->fluid->xRes(), smd->domain->fluid->yRes(), smd->domain->fluid->zRes(), smd->domain->manta_solver_res);
 	ss << "s.timestep = " << smd->domain->time_scale << " \n";
 	
 	/*Noise Field*/
@@ -416,7 +435,7 @@ void generate_manta_sim_file(Scene *scene, SmokeModifierData *smd)
 	if(wavelets && upres>0)
 	{
 		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 * 0.2f<< " \n";
+		ss << "xl.timestep = " << smd->domain->time_scale * 0.5f<< " \n";
 		
 		ss << "xl_vel = xl.create(MACGrid) \n";
 		ss << "xl_density = xl.create(RealGrid) \n";/*smoke simulation*/
diff --git a/release/scripts/startup/bl_ui/properties_physics_smoke.py b/release/scripts/startup/bl_ui/properties_physics_smoke.py
index fc8ed4f..1080529 100644
--- a/release/scripts/startup/bl_ui/properties_physics_smoke.py
+++ b/release/scripts/startup/bl_ui/properties_physics_smoke.py
@@ -404,6 +404,12 @@ class OBJECT_OT_RunMantaButton(bpy.types.Operator):
             transform_objgroup_back(flow_objs,domain,old_data)
         for ob in selected_before:
             ob.select = True
+        # ds = domain.modifiers['Smoke'].domain_settings
+        # if (!global manta_solver_res_switched) and ds.manta_solver_res == 2:
+        #     #resize domain s.th. Y-axis dim corresponds to 1
+        #     scale_fac = ds.resolution_max / max(domain.scale[0],domain.scale[1],domain.scale[2])
+        #     domain.scale[1] /= scale_fac
+        #     global manta_solver_res_switched = True
         bpy.ops.manta.make_file()
         bpy.ops.manta.sim_step()
         return{'FINISHED'}
diff --git a/source/blender/blenkernel/intern/smoke.c b/source/blender/blenkernel/intern/smoke.c
index b4a8bbf..8ad4318 100644
--- a/source/blender/blenkernel/intern/smoke.c
+++ b/source/blender/blenkernel/intern/smoke.c
@@ -2766,31 +2766,8 @@ static void smokeModifier_process(SmokeModifierData *smd, Scene *scene, Object *
 			printf("bad smokeModifier_init\n");
 			return;
 		}
-		
-		if(smd->domain->flags & MOD_SMOKE_USE_MANTA)	/*load manta sim data into fluid object*/
-		{
-			const char *density_name_format = "./den%04d.uni";
-			const char *wavelets_name_format = "./densityXL_%04d.uni";
-			char buff[100];
-			if(smd->domain->manta_start_frame > scene->r.cfra)
-				return;
-			sprintf(buff, density_name_format, scene->r.cfra - smd->domain->manta_start_frame);
-			bool read_density = smoke_mantaflow_read(smd->domain, buff, 0);
-			bool read_wavelets = 1;
-			if (smd->domain->flags & MOD_SMOKE_HIGHRES)
-			{
-				/*highdres*/
-				sprintf(buff, wavelets_name_format, scene->r.cfra - smd->domain->manta_start_frame);
-				read_wavelets = smoke_mantaflow_read(smd->domain, buff, 1);	
-			}
-			//			smoke_calc_transparency(sds, scene);
-			//			return;
-			//			if(read_density && read_wavelets)
-			//			{	
-			//				BKE_ptcache_write(&pid, framenr);
-			//			}
-			return;
-		}
+		if (framenr == startframe && smd->domain->flags & MOD_SMOKE_USE_MANTA && smd->domain->fluid)
+			smoke_mantaflow_write_scene_file(scene, smd);
 		
 		/* try to read from cache */
 		if (BKE_ptcache_read(&pid, (float)framenr) == PTCACHE_READ_EXACT) {
@@ -2821,7 +2798,26 @@ static void smokeModifier_process(SmokeModifierData *smd, Scene *scene, Object *
 
 		// simulate the actual smoke (c++ code in intern/smoke)
 		// DG: interesting commenting this line + deactivating loading of noise files
-		
+		if(smd->domain->flags & MOD_SMOKE_USE_MANTA)	/*load manta sim data into fluid object*/
+		{
+			smoke_mantaflow_sim_step(scene,smd);
+			const char *density_name_format = "./den%04d.uni";
+			const char *wavelets_name_format = "./densityXL_%04d.uni";
+			char buff[100];
+			if(smd->domain->manta_start_frame > scene->r.cfra)
+				return;
+			sprintf(buff, density_name_format, scene->r.cfra - smd->domain->manta_start_frame);
+			bool read_density = smoke_mantaflow_read(smd->domain, buff, 0);
+			bool read_wavelets = 1;
+			if (smd->domain->flags & MOD_SMOKE_HIGHRES)
+			{
+				/*highdres*/
+				sprintf(buff, wavelets_name_format, scene->r.cfra - smd->domain->manta_start_frame);
+				read_wavelets = smoke_mantaflow_read(smd->domain, buff, 1);	
+			}
+			//			smoke_calc_transparency(sds, scene);
+			//			return;
+		}else{
 			if (framenr != startframe)
 			{
 				if (sds->flags & MOD_SMOKE_DISSOLVE) {
@@ -2835,7 +2831,7 @@ static void smokeModifier_process(SmokeModifierData *smd, Scene *scene, Object *
 				}
 			step(scene, ob, smd, dm, scene->r.frs_sec / scene->r.frs_sec_base, for_render);
 			}
-		
+		}
 		// create shadows before writing cache so they get stored
 		smoke_calc_transparency(sds, scene);
 
diff --git a/source/blender/makesrna/intern/rna_smoke.c b/source/blender/makesrna/intern/rna_smoke.c
index ce7da14..9a9cc1b 100644
--- a/source/blender/makesrna/intern/rna_smoke.c
+++ b/source/blender/makesrna/intern/rna_smoke.c
@@ -97,6 +97,28 @@ static void rna_Smoke_reset_dependency(Main *bmain, Scene *scene, PointerRNA *pt
 	rna_Smoke_dependency_update(bmain, scene, ptr);
 }
 
+static void rna_Smoke_manta_write_settings(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+	SmokeDomainSettings *settings = (SmokeDomainSettings *)ptr->data;
+	if (settings->flags & MOD_SMOKE_USE_MANTA)
+		smoke_mantaflow_write_scene_file(scene, settings->smd);
+	rna_Smoke_reset(bmain,scene,ptr);
+}
+
+static void rna_Smoke_manta_switch2D(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+	SmokeDomainSettings *settings = (SmokeDomainSettings *)ptr->data;
+	if (settings->manta_solver_res == 2)
+	{
+		settings->base_res[1] = 1;
+	}
+	else if(settings->manta_solver_res == 3)
+	{
+		settings->base_res[1] = 5;
+	}
+	rna_Smoke_reset(bmain,scene,ptr);
+}
+
 static char *rna_SmokeDomainSettings_path(PointerRNA *ptr)
 {
 	SmokeDomainSettings *settings = (SmokeDomainSettings *)ptr->data;
@@ -549,14 +571,14 @@ static void rna_def_smoke_domain_settings(BlenderRNA *brna)
 	prop = RNA_def_property(srna, "use_manta", PROP_BOOLEAN, PROP_NONE);
 	RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_SMOKE_USE_MANTA);
 	RNA_def_property_ui_text(prop, "MantaFlow", "Use Mantaflow");
-	RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
+	RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_manta_write_settings");
 	
 	prop = RNA_def_property(srna, "manta_solver_res", PROP_INT, PROP_NONE);
 	RNA_def_property_int_sdna(prop, NULL, "manta_solver_res");
 	RNA_def_property_range(prop, 2, 3);
 	RNA_def_property_ui_range(prop, 2, 3, 1, -1);
 	RNA_def_property_ui_text(prop, "Solver Res", "Solver resolution(2D/3D)");
-	RNA_def_property_update(prop, 

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list