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.
This commit is contained in:
Sebastián Barschkis 2020-04-07 14:22:56 +02:00
parent ea78f9922e
commit 4a83832120
Notes: blender-bot 2023-02-14 04:31:04 +01:00
Referenced by issue #74828, Fluid: Crash with Fire/Smoke Noise
5 changed files with 38 additions and 2 deletions

View File

@ -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);

View File

@ -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)

View File

@ -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);

View File

@ -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)

View File

@ -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);