[Bf-blender-cvs] [4a838321206] master: Fix T74828: Fluid: Crash with Fire/Smoke Noise

Sebastián Barschkis noreply at git.blender.org
Tue Apr 7 14:31:41 CEST 2020


Commit: 4a83832120647044908898a9afc5e54028d78617
Author: Sebastián Barschkis
Date:   Tue Apr 7 14:22:56 2020 +0200
Branches: master
https://developer.blender.org/rB4a83832120647044908898a9afc5e54028d78617

Fix T74828: Fluid: Crash with Fire/Smoke Noise

Issue was that the noise simulation was trying to bake with a minimized domain size (adaptive domain initializes domain with size (1,1,1)). Similarly to the base resolution bake, there should be no noise baking happening at those domain sizes - a domain at this size is considered empty.

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

M	intern/mantaflow/extern/manta_fluid_API.h
M	intern/mantaflow/intern/MANTA_main.cpp
M	intern/mantaflow/intern/MANTA_main.h
M	intern/mantaflow/intern/manta_fluid_API.cpp
M	source/blender/blenkernel/intern/fluid.c

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

diff --git a/intern/mantaflow/extern/manta_fluid_API.h b/intern/mantaflow/extern/manta_fluid_API.h
index 939f24fbeef..85cc04b4a52 100644
--- a/intern/mantaflow/extern/manta_fluid_API.h
+++ b/intern/mantaflow/extern/manta_fluid_API.h
@@ -39,6 +39,7 @@ void manta_ensure_invelocity(struct MANTA *fluid, struct FluidModifierData *mmd)
 void manta_ensure_outflow(struct MANTA *fluid, struct FluidModifierData *mmd);
 int manta_write_config(struct MANTA *fluid, struct FluidModifierData *mmd, int framenr);
 int manta_write_data(struct MANTA *fluid, struct FluidModifierData *mmd, int framenr);
+int manta_write_noise(struct MANTA *fluid, struct FluidModifierData *mmd, int framenr);
 int manta_read_config(struct MANTA *fluid, struct FluidModifierData *mmd, int framenr);
 int manta_read_data(struct MANTA *fluid, struct FluidModifierData *mmd, int framenr);
 int manta_read_noise(struct MANTA *fluid, struct FluidModifierData *mmd, int framenr);
diff --git a/intern/mantaflow/intern/MANTA_main.cpp b/intern/mantaflow/intern/MANTA_main.cpp
index 95487ff3bd0..293abae1b3a 100644
--- a/intern/mantaflow/intern/MANTA_main.cpp
+++ b/intern/mantaflow/intern/MANTA_main.cpp
@@ -1441,6 +1441,29 @@ bool MANTA::writeData(FluidModifierData *mmd, int framenr)
   return runPythonString(pythonCommands);
 }
 
+bool MANTA::writeNoise(FluidModifierData *mmd, int framenr)
+{
+  if (with_debug)
+    std::cout << "MANTA::writeNoise()" << std::endl;
+
+  std::ostringstream ss;
+  std::vector<std::string> pythonCommands;
+
+  std::string directory = getDirectory(mmd, FLUID_DOMAIN_DIR_NOISE);
+  std::string nformat = getCacheFileEnding(mmd->domain->cache_noise_format);
+
+  bool final_cache = (mmd->domain->cache_type == FLUID_DOMAIN_CACHE_FINAL);
+  std::string resumable_cache = (final_cache) ? "False" : "True";
+
+  if (mUsingSmoke && mUsingNoise) {
+    ss.str("");
+    ss << "smoke_save_noise_" << mCurrentID << "('" << escapeSlashes(directory) << "', " << framenr
+       << ", '" << nformat << "', " << resumable_cache << ")";
+    pythonCommands.push_back(ss.str());
+  }
+  return runPythonString(pythonCommands);
+}
+
 bool MANTA::readConfiguration(FluidModifierData *mmd, int framenr)
 {
   if (with_debug)
diff --git a/intern/mantaflow/intern/MANTA_main.h b/intern/mantaflow/intern/MANTA_main.h
index f4699e857ff..caac63d8e39 100644
--- a/intern/mantaflow/intern/MANTA_main.h
+++ b/intern/mantaflow/intern/MANTA_main.h
@@ -79,7 +79,8 @@ struct MANTA {
   // Write cache
   bool writeConfiguration(FluidModifierData *mmd, int framenr);
   bool writeData(FluidModifierData *mmd, int framenr);
-  // write call for noise, mesh and particles were left in bake calls for now
+  bool writeNoise(FluidModifierData *mmd, int framenr);
+  // write calls for mesh and particles were left in bake calls for now
 
   // Read cache (via Manta save/load)
   bool readConfiguration(FluidModifierData *mmd, int framenr);
diff --git a/intern/mantaflow/intern/manta_fluid_API.cpp b/intern/mantaflow/intern/manta_fluid_API.cpp
index 594f7a44e7f..b4582051c3c 100644
--- a/intern/mantaflow/intern/manta_fluid_API.cpp
+++ b/intern/mantaflow/intern/manta_fluid_API.cpp
@@ -80,6 +80,13 @@ int manta_write_data(MANTA *fluid, FluidModifierData *mmd, int framenr)
   return fluid->writeData(mmd, framenr);
 }
 
+int manta_write_noise(MANTA *fluid, FluidModifierData *mmd, int framenr)
+{
+  if (!fluid || !mmd)
+    return 0;
+  return fluid->writeNoise(mmd, framenr);
+}
+
 int manta_read_config(MANTA *fluid, FluidModifierData *mmd, int framenr)
 {
   if (!fluid || !mmd)
diff --git a/source/blender/blenkernel/intern/fluid.c b/source/blender/blenkernel/intern/fluid.c
index cbb933725eb..985d0a79b23 100644
--- a/source/blender/blenkernel/intern/fluid.c
+++ b/source/blender/blenkernel/intern/fluid.c
@@ -3999,7 +3999,11 @@ static void BKE_fluid_modifier_processDomain(FluidModifierData *mmd,
     }
     if (has_data || baking_data) {
       if (baking_noise && with_smoke && with_noise) {
-        manta_bake_noise(mds->fluid, mmd, scene_framenr);
+        /* Ensure that no bake occurs if domain was minimized by adaptive domain. */
+        if (mds->total_cells > 1) {
+          manta_bake_noise(mds->fluid, mmd, scene_framenr);
+        }
+        manta_write_noise(mds->fluid, mmd, scene_framenr);
       }
       if (baking_mesh && with_liquid && with_mesh) {
         manta_bake_mesh(mds->fluid, mmd, scene_framenr);



More information about the Bf-blender-cvs mailing list