From 56144ee59df392c3b35db17bd1c7aaad84284722 Mon Sep 17 00:00:00 2001 From: Bartosz Kosiorek Date: Tue, 6 May 2025 19:04:10 +0200 Subject: [PATCH] Fix #80529: Smoke dissolve rate affected by time steps Now results are similar under different time steps. Additionally it is now working correctly with different time scale, where smoke lifetime is proportional to time scale. Pull Request: https://projects.blender.org/blender/blender/pulls/138347 --- extern/mantaflow/README.blender | 1 + .../patches/smoke-dissolve-rate.patch | 38 +++++++++++++++++++ .../preprocessed/plugin/extforces.cpp | 10 +++-- .../mantaflow/intern/strings/smoke_script.h | 6 ++- 4 files changed, 49 insertions(+), 6 deletions(-) create mode 100644 extern/mantaflow/patches/smoke-dissolve-rate.patch diff --git a/extern/mantaflow/README.blender b/extern/mantaflow/README.blender index 0a019f09d50..123b517bb7f 100644 --- a/extern/mantaflow/README.blender +++ b/extern/mantaflow/README.blender @@ -9,3 +9,4 @@ Local modifications: * ./patches/precision-of-4d-vector.patch to increase precision of 4D vector normalization functions. * ./patches/liquid-mesh-performance.patch improve liquid mesh generation by puting calculation of inverse radius outside for loops. * ./patches/liquid-performance.patch improve liquid generation (without mesh) by precalculate sum of vectors and put it outside for loop. +* ./patches/smoke-dissolve-rate.patch Dissolve smoke independently from number of timesteps in Frame. diff --git a/extern/mantaflow/patches/smoke-dissolve-rate.patch b/extern/mantaflow/patches/smoke-dissolve-rate.patch new file mode 100644 index 00000000000..9ed64dcb72d --- /dev/null +++ b/extern/mantaflow/patches/smoke-dissolve-rate.patch @@ -0,0 +1,38 @@ +commit 4a2c116053be7d445f061bee074796dc87529b3f +Author: Bartosz Kosiorek +Date: Fri May 2 19:59:49 2025 +0200 + + Physics: Dissolve smoke independently from number of timesteps in Frame + + Fixes: 80529 + +diff --git a/extern/mantaflow/preprocessed/plugin/extforces.cpp b/extern/mantaflow/preprocessed/plugin/extforces.cpp +index 88935fa7ae9..eaf3e7d39f4 100644 +--- a/extern/mantaflow/preprocessed/plugin/extforces.cpp ++++ b/extern/mantaflow/preprocessed/plugin/extforces.cpp +@@ -1652,10 +1652,11 @@ void dissolveSmoke(const FlagGrid &flags, + Grid *green = nullptr, + Grid *blue = nullptr, + int speed = 5, +- bool logFalloff = true) ++ bool logFalloff = true, ++ const float dissolveScale = 1.0) + { +- float dydx = 1.0f / (float)speed; // max density/speed = dydx +- float fac = 1.0f - dydx; ++ const float dydx = dissolveScale / (float)speed; // max density (1.0) * scale / speed = dydx ++ const float fac = 1.0f - dydx; + KnDissolveSmoke(flags, density, heat, red, green, blue, speed, logFalloff, dydx, fac); + } + static PyObject *_W_11(PyObject *_self, PyObject *_linargs, PyObject *_kwds) +@@ -1676,8 +1677,9 @@ static PyObject *_W_11(PyObject *_self, PyObject *_linargs, PyObject *_kwds) + Grid *blue = _args.getPtrOpt>("blue", 5, nullptr, &_lock); + int speed = _args.getOpt("speed", 6, 5, &_lock); + bool logFalloff = _args.getOpt("logFalloff", 7, true, &_lock); ++ const float dissolveScale = _args.getOpt("dissolveScale", 8, 1.0, &_lock); + _retval = getPyNone(); +- dissolveSmoke(flags, density, heat, red, green, blue, speed, logFalloff); ++ dissolveSmoke(flags, density, heat, red, green, blue, speed, logFalloff, dissolveScale); + _args.check(); + } + pbFinalizePlugin(parent, "dissolveSmoke", !noTiming); diff --git a/extern/mantaflow/preprocessed/plugin/extforces.cpp b/extern/mantaflow/preprocessed/plugin/extforces.cpp index 88935fa7ae9..eaf3e7d39f4 100644 --- a/extern/mantaflow/preprocessed/plugin/extforces.cpp +++ b/extern/mantaflow/preprocessed/plugin/extforces.cpp @@ -1652,10 +1652,11 @@ void dissolveSmoke(const FlagGrid &flags, Grid *green = nullptr, Grid *blue = nullptr, int speed = 5, - bool logFalloff = true) + bool logFalloff = true, + const float dissolveScale = 1.0) { - float dydx = 1.0f / (float)speed; // max density/speed = dydx - float fac = 1.0f - dydx; + const float dydx = dissolveScale / (float)speed; // max density (1.0) * scale / speed = dydx + const float fac = 1.0f - dydx; KnDissolveSmoke(flags, density, heat, red, green, blue, speed, logFalloff, dydx, fac); } static PyObject *_W_11(PyObject *_self, PyObject *_linargs, PyObject *_kwds) @@ -1676,8 +1677,9 @@ static PyObject *_W_11(PyObject *_self, PyObject *_linargs, PyObject *_kwds) Grid *blue = _args.getPtrOpt>("blue", 5, nullptr, &_lock); int speed = _args.getOpt("speed", 6, 5, &_lock); bool logFalloff = _args.getOpt("logFalloff", 7, true, &_lock); + const float dissolveScale = _args.getOpt("dissolveScale", 8, 1.0, &_lock); _retval = getPyNone(); - dissolveSmoke(flags, density, heat, red, green, blue, speed, logFalloff); + dissolveSmoke(flags, density, heat, red, green, blue, speed, logFalloff, dissolveScale); _args.check(); } pbFinalizePlugin(parent, "dissolveSmoke", !noTiming); diff --git a/intern/mantaflow/intern/strings/smoke_script.h b/intern/mantaflow/intern/strings/smoke_script.h index fed1ab2270c..ba287a02043 100644 --- a/intern/mantaflow/intern/strings/smoke_script.h +++ b/intern/mantaflow/intern/strings/smoke_script.h @@ -336,7 +336,8 @@ def smoke_step_$ID$():\n\ \n\ if using_dissolve_s$ID$:\n\ mantaMsg('Dissolving smoke')\n\ - dissolveSmoke(flags=flags_s$ID$, density=density_s$ID$, heat=heat_s$ID$, red=color_r_s$ID$, green=color_g_s$ID$, blue=color_b_s$ID$, speed=dissolveSpeed_s$ID$, logFalloff=using_logdissolve_s$ID$)\n\ + dissolveSmoke(flags=flags_s$ID$, density=density_s$ID$, heat=heat_s$ID$, red=color_r_s$ID$, green=color_g_s$ID$, blue=color_b_s$ID$, \ + speed=dissolveSpeed_s$ID$, logFalloff=using_logdissolve_s$ID$, dissolveScale=s$ID$.timestep / frameLengthUnscaled_s$ID$)\n\ \n\ mantaMsg('Advecting density')\n\ advectSemiLagrange(flags=flags_s$ID$, vel=vel_s$ID$, grid=density_s$ID$, order=2)\n\ @@ -469,7 +470,8 @@ def step_noise_$ID$():\n\ \n\ if using_dissolve_s$ID$:\n\ mantaMsg('Dissolving noise')\n\ - dissolveSmoke(flags=flags_sn$ID$, density=density_sn$ID$, heat=None, red=color_r_sn$ID$, green=color_g_sn$ID$, blue=color_b_sn$ID$, speed=dissolveSpeed_s$ID$, logFalloff=using_logdissolve_s$ID$)\n\ + dissolveSmoke(flags=flags_sn$ID$, density=density_sn$ID$, heat=None, red=color_r_sn$ID$, green=color_g_sn$ID$, blue=color_b_sn$ID$, \ + speed=dissolveSpeed_s$ID$, logFalloff=using_logdissolve_s$ID$, dissolveScale=s$ID$.timestep / frameLengthUnscaled_s$ID$)\n\ \n\ mantaMsg('Advecting UVs and updating UV weight')\n\ advectSemiLagrange(flags=flags_s$ID$, vel=vel_s$ID$, grid=uvGrid0_s$ID$, order=2)\n\