[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