[Bf-blender-cvs] [ff20f36] soc-2014-fluid: exporting wind force

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


Commit: ff20f36680a162cd075b7fa052d729cff0545980
Author: Roman Pogribnyi
Date:   Thu Aug 7 20:12:38 2014 +0200
Branches: soc-2014-fluid
https://developer.blender.org/rBff20f36680a162cd075b7fa052d729cff0545980

exporting wind force

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

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/python/manta_pp/pwrapper/pymain.cpp

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

diff --git a/intern/smoke/extern/smoke_API.h b/intern/smoke/extern/smoke_API.h
index e57ac43..38b5a05 100644
--- a/intern/smoke/extern/smoke_API.h
+++ b/intern/smoke/extern/smoke_API.h
@@ -118,6 +118,8 @@ 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_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);
 #ifdef __cplusplus
 }
 #endif
diff --git a/intern/smoke/intern/MANTA.cpp b/intern/smoke/intern/MANTA.cpp
index 8d7cfd7..b547744 100644
--- a/intern/smoke/intern/MANTA.cpp
+++ b/intern/smoke/intern/MANTA.cpp
@@ -5,6 +5,8 @@
 
 void runMantaScript(vector<string>& args);//defined in manta_pp/pwrapper/pymain.cpp
 
+void export_force_fields(struct FLUID_3D *fluid);
+
 extern "C" bool manta_check_grid_size(struct FLUID_3D *fluid, int dimX, int dimY, int dimZ)
 {
 	if (!(dimX == fluid->xRes() && dimY == fluid->yRes() && dimZ == fluid->zRes())) {
diff --git a/intern/smoke/intern/MANTA.h b/intern/smoke/intern/MANTA.h
index 7f82a03..42ecb80 100644
--- a/intern/smoke/intern/MANTA.h
+++ b/intern/smoke/intern/MANTA.h
@@ -15,6 +15,8 @@
 //#include "../../../source/blender/blenlib/BLI_fileops.h"
 //#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*/
+
 struct manta_arg_struct {
 //	std::string filepath;
 	SmokeModifierData *smd;
diff --git a/intern/smoke/intern/smoke_API.cpp b/intern/smoke/intern/smoke_API.cpp
index 572861a..51fdeb5 100644
--- a/intern/smoke/intern/smoke_API.cpp
+++ b/intern/smoke/intern/smoke_API.cpp
@@ -508,13 +508,34 @@ extern "C" void smoke_mantaflow_read(struct FLUID_3D *fluid, char* name)
 
 extern "C" void smoke_mantaflow_write_scene_file(struct Scene *s, struct SmokeModifierData *smd)
 {
-	generate_manta_sim_file(s, smd);	
+//	update_effectors(s, NULL, smd->domain, 0.1f);
+//	FLUID_3D *fluid = smd->domain->fluid;
+//	int size_x = fluid->xRes();
+//	int size_y = fluid->yRes();
+//	int size_z = fluid->zRes();
+//	float *force_x = smoke_get_force_x(fluid);
+//	float *force_y = smoke_get_force_y(fluid);
+//	float *force_z = smoke_get_force_z(fluid);
+//	export_force_fields(size_x, size_y, size_z, force_x, force_y, force_z);
+	generate_manta_sim_file(s, smd);
 }
 
 extern "C" void smoke_mantaflow_sim_step(SmokeModifierData *smd)
 {
 	run_manta_scene(smd);
 }
+extern "C" void manta_write_effectors(struct Scene *s, struct SmokeModifierData *smd)
+{
+	/*updateeffectors function already called*/
+	FLUID_3D *fluid = smd->domain->fluid;
+	int size_x = fluid->xRes();
+	int size_y = fluid->yRes();
+	int size_z = fluid->zRes();
+	float *force_x = smoke_get_force_x(fluid);
+	float *force_y = smoke_get_force_y(fluid);
+	float *force_z = smoke_get_force_z(fluid);
+	export_force_fields(size_x, size_y, size_z, force_x, force_y, force_z);
+}
 
 extern "C" void smoke_mantaflow_stop_sim()
 {
diff --git a/source/blender/blenkernel/intern/smoke.c b/source/blender/blenkernel/intern/smoke.c
index e734839..ca4a516 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);
 }
 
-static void update_effectors(Scene *scene, Object *ob, SmokeDomainSettings *sds, float UNUSED(dt))
+void update_effectors(Scene *scene, Object *ob, SmokeDomainSettings *sds, float UNUSED(dt))
 {
 	ListBase *effectors;
 	/* make sure smoke flow influence is 0.0f */
@@ -2411,8 +2411,8 @@ static void update_effectors(Scene *scene, Object *ob, SmokeDomainSettings *sds,
 					float voxelCenter[3] = {0, 0, 0}, vel[3] = {0, 0, 0}, retvel[3] = {0, 0, 0};
 					unsigned int index = smoke_get_index(x, sds->res[0], y, sds->res[1], z);
 
-					if (((fuel ? MAX2(density[index], fuel[index]) : density[index]) < FLT_EPSILON) || obstacle[index])
-						continue;
+//					if (((fuel ? MAX2(density[index], fuel[index]) : density[index]) < FLT_EPSILON) || obstacle[index])
+//						continue;
 
 					vel[0] = velocity_x[index];
 					vel[1] = velocity_y[index];
@@ -2698,6 +2698,8 @@ static void smokeModifier_process(SmokeModifierData *smd, Scene *scene, Object *
 		}
 		if(smd->domain->flags & MOD_SMOKE_USE_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/python/manta_pp/pwrapper/pymain.cpp b/source/blender/python/manta_pp/pwrapper/pymain.cpp
index a392699..a569322 100644
--- a/source/blender/python/manta_pp/pwrapper/pymain.cpp
+++ b/source/blender/python/manta_pp/pwrapper/pymain.cpp
@@ -17,6 +17,8 @@
 #include <stdio.h>
 #include "manta.h"
 #include "../general.h"
+#include "grid.h"
+#include "fileio.h"
 #include "wchar.h"
 using namespace std;
 namespace Manta {
@@ -62,6 +64,27 @@ del_var(tempFlag)\n\
 del_var(sdf_flow)\n\
 del_var(source_shape)";
 const static string clean_code2 = "del s; del noise;";
+
+
+void export_force_fields(int size_x, int size_y, int size_z, float *f_x, float*f_y, float*f_z)
+{
+	assert(size_x>0 && size_y>0 && size_z>0);
+	FluidSolver dummy(Vec3i(size_x,size_y,size_z));
+	Grid<Vec3 > force_fields(&dummy, false);
+	for (int x=0; x < size_x; ++x)
+	{
+		for (int y=0; y < size_y; ++y)
+		{
+			for (int z=0; z < size_z; ++z)
+			{
+				force_fields.get(x, y, z) = Vec3(f_x[x],f_y[y],f_z[z]);
+			}
+		}
+	}
+	writeGridUni("s.uni", &force_fields);
+	writeGridTxt("s.txt", &force_fields);
+}
+		   
 void runMantaScript(vector<string>& args) {
 	string filename = args[0];




More information about the Bf-blender-cvs mailing list