Commit: 2c4b5e620719097232595b79d974cea35cd472cb Author: Sebastián Barschkis Date: Tue Mar 13 13:57:44 2018 +0100 Branches: fluid-mantaflow https://developer.blender.org/rB2c4b5e620719097232595b79d974cea35cd472cb
added first version of decoupled cache - breaks compatibility, blender not fully working right now =================================================================== M intern/mantaflow/extern/manta_fluid_API.h M intern/mantaflow/intern/FLUID.cpp M intern/mantaflow/intern/FLUID.h M intern/mantaflow/intern/manta_fluid_API.cpp M intern/mantaflow/intern/strings/liquid_script.h M intern/mantaflow/intern/strings/shared_script.h M intern/mantaflow/intern/strings/smoke_script.h M release/scripts/startup/bl_ui/properties_physics_smoke.py M source/blender/blenkernel/intern/smoke.c M source/blender/editors/physics/physics_fluid.c M source/blender/editors/physics/physics_intern.h M source/blender/editors/physics/physics_ops.c M source/blender/makesdna/DNA_smoke_types.h M source/blender/makesrna/intern/rna_smoke.c =================================================================== diff --git a/intern/mantaflow/extern/manta_fluid_API.h b/intern/mantaflow/extern/manta_fluid_API.h index 9b688bf6306..79ff2a9622e 100644 --- a/intern/mantaflow/extern/manta_fluid_API.h +++ b/intern/mantaflow/extern/manta_fluid_API.h @@ -41,7 +41,7 @@ void smoke_free(struct FLUID *smoke); size_t smoke_get_index(int x, int max_x, int y, int max_y, int z /*, int max_z */); size_t smoke_get_index2d(int x, int max_x, int y /*, int max_y, int z, int max_z */); void smoke_manta_export(struct FLUID* smoke, struct SmokeModifierData *smd); -void smoke_step(struct FLUID *smoke, int framenr); +void smoke_step(struct FLUID *smoke, struct SmokeModifierData *smd, int framenr); void smoke_dissolve(struct FLUID *smoke, int speed, int log); void smoke_dissolve_wavelet(struct FLUID *smoke, int speed, int log); void smoke_export(struct FLUID *smoke, float *dt, float *dx, float **dens, float **react, float **flame, float **fuel, float **heat, float **vx, float **vy, float **vz, float **r, float **g, float **b, int **obstacles); @@ -166,6 +166,20 @@ void fluid_ensure_obstacle(struct FLUID *fluid, struct SmokeModifierData *smd); void fluid_ensure_guiding(struct FLUID *fluid, struct SmokeModifierData *smd); void fluid_ensure_invelocity(struct FLUID *fluid, struct SmokeModifierData *smd); void fluid_ensure_sndparts(struct FLUID *fluid, struct SmokeModifierData *smd); +int fluid_read_cache(struct FLUID* fluid, struct SmokeModifierData *smd, int framenr); +void fluid_free_geometry(struct FLUID* fluid, struct SmokeModifierData *smd); +void fluid_bake_low(struct FLUID* fluid, struct SmokeModifierData *smd); +void fluid_free_low(struct FLUID* fluid, struct SmokeModifierData *smd); +void fluid_bake_high(struct FLUID* fluid, struct SmokeModifierData *smd); +void fluid_free_high(struct FLUID* fluid, struct SmokeModifierData *smd); +void fluid_bake_mesh_low(struct FLUID* fluid, struct SmokeModifierData *smd); +void fluid_free_mesh_low(struct FLUID* fluid, struct SmokeModifierData *smd); +void fluid_bake_mesh_high(struct FLUID* fluid, struct SmokeModifierData *smd); +void fluid_free_mesh_high(struct FLUID* fluid, struct SmokeModifierData *smd); +void fluid_bake_particles_low(struct FLUID* fluid, struct SmokeModifierData *smd); +void fluid_free_particles_low(struct FLUID* fluid, struct SmokeModifierData *smd); +void fluid_bake_particles_high(struct FLUID* fluid, struct SmokeModifierData *smd); +void fluid_free_particles_high(struct FLUID* fluid, struct SmokeModifierData *smd); #ifdef __cplusplus } diff --git a/intern/mantaflow/intern/FLUID.cpp b/intern/mantaflow/intern/FLUID.cpp index 630e700c1e1..630cc769462 100644 --- a/intern/mantaflow/intern/FLUID.cpp +++ b/intern/mantaflow/intern/FLUID.cpp @@ -241,6 +241,24 @@ void FLUID::initDomain(SmokeModifierData *smd) std::string tmpString = fluid_variables_low + fluid_solver_low + fluid_alloc_low + + fluid_bake_helper + + fluid_bake_geometry + + fluid_free_geometry + + fluid_bake_low + + fluid_free_low + + fluid_bake_high + + fluid_free_high + + fluid_bake_mesh_low + + fluid_free_mesh_low + + fluid_bake_mesh_high + + fluid_free_mesh_high + + fluid_bake_particles_low + + fluid_free_particles_low + + fluid_bake_particles_high + + fluid_free_particles_high + + fluid_save_geometry_low + + fluid_save_data_low + + fluid_load_data_low + fluid_obstacle_export_low + fluid_guiding_export_low + fluid_invel_export_low @@ -259,6 +277,8 @@ void FLUID::initDomainHigh(SmokeModifierData *smd) + fluid_solver_high + fluid_alloc_high + fluid_adapt_time_step_high + + fluid_save_data_high + + fluid_load_data_high + fluid_adaptive_time_stepping_high; std::string finalString = parseScript(tmpString, smd); mCommands.clear(); @@ -272,8 +292,9 @@ void FLUID::initSmoke(SmokeModifierData *smd) std::string tmpString = smoke_alloc_low + smoke_variables_low + smoke_bounds_low - + smoke_adaptive_step - + smoke_export_low + + smoke_adaptive_step_low + + smoke_save_geometry_low + + smoke_save_data_low + smoke_pre_step_low + smoke_step_low + smoke_post_step_low; @@ -290,7 +311,8 @@ void FLUID::initSmokeHigh(SmokeModifierData *smd) + smoke_variables_high + smoke_bounds_high + smoke_wavelet_turbulence_noise - + smoke_export_high + + smoke_adaptive_step_high + + smoke_save_data_high + smoke_pre_step_high + smoke_step_high + smoke_post_step_high; @@ -380,15 +402,18 @@ void FLUID::initLiquid(SmokeModifierData *smd) std::string tmpString = liquid_alloc_low + liquid_variables_low + liquid_init_phi + + liquid_save_geometry_low + liquid_save_mesh_low + liquid_save_particles_low - + liquid_save_particle_velocities - + liquid_export_low - + liquid_import_low - + liquid_adaptive_step + + liquid_save_data_low + + liquid_load_mesh_low + + liquid_load_particles_low + + liquid_load_data_low + + liquid_adaptive_step_low + liquid_pre_step_low + liquid_step_low - + liquid_post_step_low; + + liquid_post_step_low + + liquid_step_particles_low; std::string finalString = parseScript(tmpString, smd); mCommands.clear(); mCommands.push_back(finalString); @@ -403,8 +428,8 @@ void FLUID::initLiquidHigh(SmokeModifierData *smd) std::string tmpString = liquid_alloc_high + liquid_variables_high + liquid_save_mesh_high - + liquid_export_high - + liquid_import_high + + liquid_load_mesh_high + + liquid_adaptive_step_high + liquid_step_high; std::string finalString = parseScript(tmpString, smd); mCommands.clear(); @@ -469,13 +494,23 @@ void FLUID::initSndParts(SmokeModifierData *smd) } } -void FLUID::step(int framenr) +void FLUID::step(SmokeModifierData *smd, int framenr) { + // TODO (sebbas): Use geometry bake instead of fluid_step +// std::string path(smd->domain->cache_directory); +// +// mCommands.clear(); +// std::ostringstream ss; +// ss << "bake_geometry_" << mCurrentID << "(r'" << path << "'," << framenr << ")"; +// mCommands.push_back(ss.str()); +// +// runPythonString(mCommands); + // Run manta step: regular step or init only (sets up geometry only, no vel update, for first frame) mCommands.clear(); - std::ostringstream manta_step; - manta_step << "manta_step_" << mCurrentID << "(" << framenr << ")"; - mCommands.push_back(manta_step.str()); + std::ostringstream ss; + ss << "fluid_step_low_" << mCurrentID << "(" << framenr << ")"; + mCommands.push_back(ss.str()); runPythonString(mCommands); } @@ -634,7 +669,11 @@ std::string FLUID::getRealValue(const std::string& varName, SmokeModifierData * md = ((ModifierData*) smd); } - if (varName == "USING_COLORS") + if (varName == "USING_SMOKE") + ss << ((smd->domain->type == MOD_SMOKE_DOMAIN_TYPE_GAS) ? "True" : "False"); + else if (varName == "USING_LIQUID") + ss << ((smd->domain->type == MOD_SMOKE_DOMAIN_TYPE_LIQUID) ? "True" : "False"); + else if (varName == "USING_COLORS") ss << (smd->domain->active_fields & SM_ACTIVE_COLORS ? "True" : "False"); else if (varName == "USING_HEAT") ss << (smd->domain->active_fields & SM_ACTIVE_HEAT ? "True" : "False"); @@ -906,7 +945,7 @@ void FLUID::exportSmokeScript(SmokeModifierData *smd) manta_script += smoke_alloc_fire_high; } - manta_script += smoke_import_low; + manta_script += smoke_load_data_low; if (obstacle) manta_script += fluid_obstacle_import_low; if (guiding) @@ -914,7 +953,7 @@ void FLUID::exportSmokeScript(SmokeModifierData *smd) if (invel) manta_script += fluid_invel_import_low; if (highres) - manta_script += smoke_import_high; + manta_script += smoke_load_data_high; manta_script += smoke_pre_step_low; if (highres) @@ -932,7 +971,7 @@ void FLUID::exportSmokeScript(SmokeModifierData *smd) if (highres) manta_script += smoke_step_high; - manta_script += smoke_adaptive_step + manta_script += smoke_adaptive_step_low + smoke_inflow_low + smoke_standalone_load + fluid_standalone_load @@ -948,6 +987,208 @@ void FLUID::exportSmokeScript(SmokeModifierData *smd) myfile.close(); } +/* BEGIN TODO (sebbas): read decoupled uni cache */ +int FLUID::readCache(SmokeModifierData *smd, int framenr) +{ + std::string path(smd->domain->cache_directory); + std::ostringstream ss; + + try { + mCommands.clear(); + ss << "fluid_load_data_low_" << mCurrentID << "(r'" << path << "'," << framenr << ")"; + mCommands.push_back(ss.str()); + + if (mUsingSmoke) { + ss.str(""); + ss << "smoke_load_data_low_" << mCurrentID << "(r'" << path << "'," << framenr << ")"; + mCommands.push_back(ss.str()); + } + + if (mUsingLiquid) { + ss.str(""); + ss << "liquid_load_data_low_" << mCurrentID << "(r'" << path << "'," << framenr << ")"; + mCommands.push_back(ss.str()); + } + + mCommands.push_back(ss.str()); + + runPythonString(mCommands); + } catch (const std::runtime_error& error) { + std::cout << "Missing cache files. Continue with simulation" << std::endl; + return 0; + } + return 1; +} + +void FLUID::freeGeometry(SmokeModifierData *smd) +{ + std::string path(smd->domain->cache_directory); + + mCommands.clear(); + std::ostringstream ss; + ss << "free_geometry_" << mCurrentID << "(r'" << path << "')"; + mCommands.push_back(ss.str()); + + runPythonString(mCommands); +} +/* END TODO (sebbas) */ + +void FLUID::bakeSimulationLow(SmokeModifierData *smd) +{ + int start_frame = smd->domain->cache_frame_start; + int end_frame = smd->domain->cache_frame_end; + std::string path(smd->domain->cache_directory); + + mCommands.clear(); + std::ostringstream ss; + ss << "bake_fluid_low_" << mCurrentID << "(r'" << path << "'," << start_frame << ", " << end_frame << ")"; + mCommands.push_back(ss.str()); + + runPythonString(mCommands); +} + +void FLUID::freeSimulationLow(SmokeModifierData *smd) +{ + std::string path(smd->domain->cache_directory); + + mCommands.clear(); + std::ostringstream ss; + ss << "free_fluid_low_" << mCurrentID << "(r'" << path << "')"; + mCommands.push_back(ss.str()); + + runPythonString(mCommands); +} + +void FLUID::bakeSimulationHigh(SmokeModifierData *smd) +{ + int start_frame = smd->domain->cache_frame_start; + int end_frame = smd->domain->cache_frame_end; + std::string path(smd->domain->cache_directory); + + mCommands.clear(); + std::o @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs