[Bf-blender-cvs] [306ef17] soc-2014-fluid: updating force_fields on per-step basis

Roman Pogribnyi noreply at git.blender.org
Thu Aug 7 23:51:36 CEST 2014


Commit: 306ef174cb99937af19f4ce1fe1bedc2a9018bb8
Author: Roman Pogribnyi
Date:   Thu Aug 7 23:50:58 2014 +0200
Branches: soc-2014-fluid
https://developer.blender.org/rB306ef174cb99937af19f4ce1fe1bedc2a9018bb8

updating force_fields on per-step basis

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

M	intern/smoke/extern/smoke_API.h
M	intern/smoke/intern/MANTA.cpp
M	intern/smoke/intern/MANTA.h
M	intern/smoke/intern/smoke_API.cpp
M	source/blender/blenkernel/intern/smoke.c
M	source/blender/editors/physics/physics_fluid.c
M	source/blender/makesdna/DNA_smoke_types.h

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

diff --git a/intern/smoke/extern/smoke_API.h b/intern/smoke/extern/smoke_API.h
index 38b5a05..a8fae1a 100644
--- a/intern/smoke/extern/smoke_API.h
+++ b/intern/smoke/extern/smoke_API.h
@@ -116,10 +116,10 @@ void smoke_ensure_colors(struct FLUID_3D *fluid, struct WTURBULENCE *wt, float i
 /*Mantaflow functions*/
 void smoke_mantaflow_read(struct FLUID_3D *fluid, char* name);
 void smoke_mantaflow_write_scene_file(struct Scene *s, struct SmokeModifierData *smd);
-void smoke_mantaflow_sim_step(struct SmokeModifierData *smd);
+void smoke_mantaflow_sim_step(struct Scene *scene, struct SmokeModifierData *smd);
 void smoke_mantaflow_stop_sim();
 void manta_write_effectors(struct Scene *s, struct SmokeModifierData *smd);
-void update_effectors(struct Scene *scene, struct Object *ob,struct SmokeDomainSettings *sds, float dt);
+void manta_update_effectors(struct Scene *scene, struct Object *ob,struct SmokeDomainSettings *sds, float dt);
 #ifdef __cplusplus
 }
 #endif
diff --git a/intern/smoke/intern/MANTA.cpp b/intern/smoke/intern/MANTA.cpp
index b547744..d2c789b 100644
--- a/intern/smoke/intern/MANTA.cpp
+++ b/intern/smoke/intern/MANTA.cpp
@@ -196,19 +196,18 @@ void *run_manta_scene_thread(void *arguments)
 	return NULL;
 }
 
-void run_manta_scene(SmokeModifierData *smd)
+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;
-//	args.filepath = filepath;
-	args.smd = smd;
+	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, smd);//(void *)&args);
+	int rc = pthread_create(&manta_thread, NULL, run_manta_sim_thread, (void *)args);
 //	pthread_join(manta_thread,NULL);
 //	pthread_detach(manta_thread);
 }
@@ -222,15 +221,17 @@ void stop_manta_sim()
 void *run_manta_sim_thread(void *arguments)
 //void manta_sim_step(int frame)
 {
-//	struct manta_arg_struct *args = (struct manta_arg_struct *)arguments;
+	struct manta_arg_struct *args = (struct manta_arg_struct *)arguments;
 //	int num_sim_steps = args->smd->domain->manta_end_frame - args->smd->domain->manta_start_frame;
-	SmokeModifierData *smd = (SmokeModifierData*)arguments;
+	SmokeModifierData *smd = &args->smd;
+	Scene *s = &args->s;
 	int num_sim_steps = smd->domain->manta_end_frame - smd->domain->manta_start_frame;
 	smd->domain->manta_sim_frame = 0;
 	PyGILState_STATE gilstate = PyGILState_Ensure();
 	for (int fr=0; fr< num_sim_steps; ++fr) {
 		if(smd->domain->manta_sim_frame == -1)
 			break;
+		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);
@@ -364,6 +365,9 @@ void generate_manta_sim_file(Scene *scene, SmokeModifierData *smd)
 	ss << "energy = s.create(RealGrid) \n";
 	ss << "tempFlag  = s.create(FlagGrid)\n";
 	ss << "sdf_flow  = s.create(LevelsetGrid)\n";
+	ss << "forces = s.create(MACGrid)\n";
+//	ss << "forces.load('manta_forces.uni')\n";
+
 //	ss << "field_source = s.create(Box, p0=vec3(0,0,0), p1=gs)\n";
 	ss << "source.meshSDF(source, sdf_flow, 1.1)\n";
 	ss << "source_shape = s.create(Cylinder, center=gs*vec3(0.5,0.1,0.5), radius=res*0.14, z=gs*vec3(0, 0.02, 0))\n";
diff --git a/intern/smoke/intern/MANTA.h b/intern/smoke/intern/MANTA.h
index 42ecb80..91bdf61 100644
--- a/intern/smoke/intern/MANTA.h
+++ b/intern/smoke/intern/MANTA.h
@@ -16,10 +16,11 @@
 //#include "../../../source/blender/python/manta_pp/pwrapper/pymain.cpp"
 
 void export_force_fields(int size_x, int size_y, int size_z, float *f_x, float*f_y, float*f_z);/*defined in pymain.cpp*/
+extern "C" void manta_write_effectors(struct Scene *s, struct SmokeModifierData *smd); /*defined in smoke_api.cpp*/
 
 struct manta_arg_struct {
-//	std::string filepath;
-	SmokeModifierData *smd;
+	Scene s;
+	SmokeModifierData smd;
 };
 
 static pthread_t manta_thread;
@@ -57,7 +58,7 @@ void *run_manta_scene_thread(void *threadid);
 
 void *run_manta_sim_thread(void *threadid);
 
-void run_manta_scene(SmokeModifierData *smd);
+void run_manta_scene(Scene *scene, SmokeModifierData *smd);
 
 void stop_manta_sim();
 
diff --git a/intern/smoke/intern/smoke_API.cpp b/intern/smoke/intern/smoke_API.cpp
index 51fdeb5..6670472 100644
--- a/intern/smoke/intern/smoke_API.cpp
+++ b/intern/smoke/intern/smoke_API.cpp
@@ -520,13 +520,15 @@ extern "C" void smoke_mantaflow_write_scene_file(struct Scene *s, struct SmokeMo
 	generate_manta_sim_file(s, smd);
 }
 
-extern "C" void smoke_mantaflow_sim_step(SmokeModifierData *smd)
+extern "C" void smoke_mantaflow_sim_step(Scene *scene, SmokeModifierData *smd)
 {
-	run_manta_scene(smd);
+	run_manta_scene(scene, smd);
 }
+
 extern "C" void manta_write_effectors(struct Scene *s, struct SmokeModifierData *smd)
 {
-	/*updateeffectors function already called*/
+	assert(smd->domain->manta_obj != NULL);
+	manta_update_effectors(s, smd->domain->manta_obj, smd->domain, 0.1f);
 	FLUID_3D *fluid = smd->domain->fluid;
 	int size_x = fluid->xRes();
 	int size_y = fluid->yRes();
diff --git a/source/blender/blenkernel/intern/smoke.c b/source/blender/blenkernel/intern/smoke.c
index ffa6904..ced48e8 100644
--- a/source/blender/blenkernel/intern/smoke.c
+++ b/source/blender/blenkernel/intern/smoke.c
@@ -2378,7 +2378,7 @@ static void update_flowsfluids(Scene *scene, Object *ob, SmokeDomainSettings *sd
 		MEM_freeN(emaps);
 }
 
-void update_effectors(Scene *scene, Object *ob, SmokeDomainSettings *sds, float UNUSED(dt))
+static void update_effectors(Scene *scene, Object *ob, SmokeDomainSettings *sds, float UNUSED(dt))
 {
 	ListBase *effectors;
 	/* make sure smoke flow influence is 0.0f */
@@ -2728,6 +2728,7 @@ static void smokeModifier_process(SmokeModifierData *smd, Scene *scene, Object *
 	else if (smd->type & MOD_SMOKE_TYPE_DOMAIN)
 	{
 		SmokeDomainSettings *sds = smd->domain;
+		sds->manta_obj = ob;
 		PointCache *cache = NULL;
 		PTCacheID pid;
 		int startframe, endframe, framenr;
@@ -2766,8 +2767,6 @@ static void smokeModifier_process(SmokeModifierData *smd, Scene *scene, Object *
 		}
 		if(smd->domain->flags & MOD_SMOKE_USE_MANTA)
 		{
-			manta_update_effectors(scene, ob, smd->domain, 0.1f);
-			manta_write_effectors(scene,smd);
 			char buff[100];
 			if(smd->domain->manta_start_frame > scene->r.cfra)
 				return;
diff --git a/source/blender/editors/physics/physics_fluid.c b/source/blender/editors/physics/physics_fluid.c
index 76d7faf..4baeea0 100644
--- a/source/blender/editors/physics/physics_fluid.c
+++ b/source/blender/editors/physics/physics_fluid.c
@@ -1180,7 +1180,7 @@ static int manta_sim_step_invoke(bContext *C, wmOperator *op, const wmEvent *UNU
 	SmokeModifierData *smd;
 	Object * smokeDomain = CTX_data_active_object(C);
 	smd = (SmokeModifierData *)modifiers_findByType(smokeDomain, eModifierType_Smoke);
-	smoke_mantaflow_sim_step(smd);
+	smoke_mantaflow_sim_step(scene,smd);
 	/*	return OPERATOR_CANCELLED;*/
 	
 	return OPERATOR_FINISHED;
@@ -1192,7 +1192,7 @@ static int manta_sim_step_exec(bContext *C, wmOperator *op)
 	SmokeModifierData *smd;
 	Object * smokeDomain = CTX_data_active_object(C);
 	smd = (SmokeModifierData *)modifiers_findByType(smokeDomain, eModifierType_Smoke);
-	smoke_mantaflow_sim_step(smd);
+	smoke_mantaflow_sim_step(scene,smd);
 	
 	/*	return OPERATOR_CANCELLED;*/
 	
diff --git a/source/blender/makesdna/DNA_smoke_types.h b/source/blender/makesdna/DNA_smoke_types.h
index 64e3cba..45d3a22 100644
--- a/source/blender/makesdna/DNA_smoke_types.h
+++ b/source/blender/makesdna/DNA_smoke_types.h
@@ -93,6 +93,7 @@ typedef struct SmokeDomainSettings {
 	struct GPUTexture *tex_wt;
 	struct GPUTexture *tex_shadow;
 	struct GPUTexture *tex_flame;
+	struct Object *manta_obj;
 	float *shadow;
 
 	/* simulation data */




More information about the Bf-blender-cvs mailing list