[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