Commit: d06aedc2451ff2c4adfd12cf38cf30f61e469f38 Author: Sebastián Barschkis Date: Fri May 10 19:59:32 2019 +0200 Branches: fluid-mantaflow https://developer.blender.org/rBd06aedc2451ff2c4adfd12cf38cf30f61e469f38
Mantaflow: Fix for smoke emission from particles =================================================================== 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_develop/preprocessed/omp/gitinfo.h M intern/mantaflow/intern/manta_develop/preprocessed/omp/plugin/initplugins.cpp M intern/mantaflow/intern/manta_develop/preprocessed/tbb/gitinfo.h M intern/mantaflow/intern/manta_develop/preprocessed/tbb/plugin/initplugins.cpp M intern/mantaflow/intern/manta_fluid_API.cpp M intern/mantaflow/intern/strings/liquid_script.h M intern/mantaflow/intern/strings/smoke_script.h M source/blender/blenkernel/intern/smoke.c =================================================================== diff --git a/intern/mantaflow/extern/manta_fluid_API.h b/intern/mantaflow/extern/manta_fluid_API.h index af352765e8e..dab80f3d7f1 100644 --- a/intern/mantaflow/extern/manta_fluid_API.h +++ b/intern/mantaflow/extern/manta_fluid_API.h @@ -160,6 +160,7 @@ float *smoke_get_color_g_in(struct FLUID *smoke); float *smoke_get_color_b_in(struct FLUID *smoke); float *smoke_get_fuel_in(struct FLUID *smoke); float *smoke_get_react_in(struct FLUID *smoke); +float *smoke_get_emission_in(struct FLUID *smoke); int smoke_has_heat(struct FLUID *smoke); int smoke_has_fuel(struct FLUID *smoke); int smoke_has_colors(struct FLUID *smoke); diff --git a/intern/mantaflow/intern/FLUID.cpp b/intern/mantaflow/intern/FLUID.cpp index 25b175a3cdc..fc3f1045c08 100644 --- a/intern/mantaflow/intern/FLUID.cpp +++ b/intern/mantaflow/intern/FLUID.cpp @@ -112,6 +112,7 @@ FLUID::FLUID(int *res, SmokeModifierData *smd) : mCurrentID(++solverID) mColorBIn = NULL; mFuelIn = NULL; mReactIn = NULL; + mEmissionIn = NULL; // Smoke high res grids mDensityHigh = NULL; @@ -2339,6 +2340,8 @@ void FLUID::updatePointers() pyObjectToString(callPythonFunction("densityIn" + solver_ext, func))); mShadow = (float *)stringToPointer( pyObjectToString(callPythonFunction("shadow" + solver_ext, func))); + mEmissionIn = (float *)stringToPointer( + pyObjectToString(callPythonFunction("emissionIn" + solver_ext, func))); if (mUsingHeat) { mHeat = (float *)stringToPointer( diff --git a/intern/mantaflow/intern/FLUID.h b/intern/mantaflow/intern/FLUID.h index 1b0ad95ed01..bb9330b43a6 100644 --- a/intern/mantaflow/intern/FLUID.h +++ b/intern/mantaflow/intern/FLUID.h @@ -315,6 +315,10 @@ struct FLUID { { return mReactIn; } + inline float *getEmissionIn() + { + return mEmissionIn; + } inline float *getDensityHigh() { @@ -706,6 +710,7 @@ struct FLUID { float *mHeatIn; float *mFuelIn; float *mReactIn; + float *mEmissionIn; float *mColorRIn; float *mColorGIn; float *mColorBIn; diff --git a/intern/mantaflow/intern/manta_develop/preprocessed/omp/gitinfo.h b/intern/mantaflow/intern/manta_develop/preprocessed/omp/gitinfo.h index 909d5d4705c..36fec6f4536 100644 --- a/intern/mantaflow/intern/manta_develop/preprocessed/omp/gitinfo.h +++ b/intern/mantaflow/intern/manta_develop/preprocessed/omp/gitinfo.h @@ -1,4 +1,4 @@ -#define MANTA_GIT_VERSION "commit 502e822aabe6f7aec7cc84525fb42b778b452704" +#define MANTA_GIT_VERSION "commit 992e0d22b10e7a67da0941e0892dbf27863a5048" diff --git a/intern/mantaflow/intern/manta_develop/preprocessed/omp/plugin/initplugins.cpp b/intern/mantaflow/intern/manta_develop/preprocessed/omp/plugin/initplugins.cpp index 895bc2d8596..1678c1c90c9 100644 --- a/intern/mantaflow/intern/manta_develop/preprocessed/omp/plugin/initplugins.cpp +++ b/intern/mantaflow/intern/manta_develop/preprocessed/omp/plugin/initplugins.cpp @@ -324,13 +324,14 @@ extern "C" { struct KnApplyEmission : public KernelBase { - KnApplyEmission(const FlagGrid& flags, Grid<Real>& target, const Grid<Real>& source, bool isAbsolute, int type) : KernelBase(&flags,0) ,flags(flags),target(target),source(source),isAbsolute(isAbsolute),type(type) { + KnApplyEmission(const FlagGrid& flags, Grid<Real>& target, const Grid<Real>& source, const Grid<Real>* emissionTexture, bool isAbsolute, int type) : KernelBase(&flags,0) ,flags(flags),target(target),source(source),emissionTexture(emissionTexture),isAbsolute(isAbsolute),type(type) { runMessage(); run(); } - inline void op(int i, int j, int k, const FlagGrid& flags, Grid<Real>& target, const Grid<Real>& source, bool isAbsolute, int type ) { - // if type is given, ony check apply emission when celltype matches type from flaggrid + inline void op(int i, int j, int k, const FlagGrid& flags, Grid<Real>& target, const Grid<Real>& source, const Grid<Real>* emissionTexture, bool isAbsolute, int type ) { + // if type is given, only apply emission when celltype matches type from flaggrid + // and if emission texture is given, only apply emission when some emission is present at cell (important for emit from particles) bool isInflow = (type & FlagGrid::TypeInflow && flags.isInflow(i,j,k)); bool isOutflow = (type & FlagGrid::TypeOutflow && flags.isOutflow(i,j,k)); - if (type && !isInflow && !isOutflow) return; + if ( (type && !isInflow && !isOutflow) && (emissionTexture && !(*emissionTexture)(i,j,k)) ) return; if (isAbsolute) target(i,j,k) = source(i,j,k); @@ -342,18 +343,20 @@ extern "C" { return target; } typedef Grid<Real> type1;inline const Grid<Real>& getArg2() { return source; } - typedef Grid<Real> type2;inline bool& getArg3() { + typedef Grid<Real> type2;inline const Grid<Real>* getArg3() { + return emissionTexture; } + typedef Grid<Real> type3;inline bool& getArg4() { return isAbsolute; } - typedef bool type3;inline int& getArg4() { + typedef bool type4;inline int& getArg5() { return type; } - typedef int type4; void runMessage() { debMsg("Executing kernel KnApplyEmission ", 3); debMsg("Kernel range" << " x "<< maxX << " y "<< maxY << " z "<< minZ<<" - "<< maxZ << " " , 4); }; void run() { + typedef int type5; void runMessage() { debMsg("Executing kernel KnApplyEmission ", 3); debMsg("Kernel range" << " x "<< maxX << " y "<< maxY << " z "<< minZ<<" - "<< maxZ << " " , 4); }; void run() { const int _maxX = maxX; const int _maxY = maxY; if (maxZ > 1) { #pragma omp parallel { #pragma omp for - for (int k=minZ; k < maxZ; k++) for (int j=0; j < _maxY; j++) for (int i=0; i < _maxX; i++) op(i,j,k,flags,target,source,isAbsolute,type); } + for (int k=minZ; k < maxZ; k++) for (int j=0; j < _maxY; j++) for (int i=0; i < _maxX; i++) op(i,j,k,flags,target,source,emissionTexture,isAbsolute,type); } } else { const int k=0; @@ -361,20 +364,20 @@ extern "C" { { #pragma omp for - for (int j=0; j < _maxY; j++) for (int i=0; i < _maxX; i++) op(i,j,k,flags,target,source,isAbsolute,type); } + for (int j=0; j < _maxY; j++) for (int i=0; i < _maxX; i++) op(i,j,k,flags,target,source,emissionTexture,isAbsolute,type); } } } - const FlagGrid& flags; Grid<Real>& target; const Grid<Real>& source; bool isAbsolute; int type; } + const FlagGrid& flags; Grid<Real>& target; const Grid<Real>& source; const Grid<Real>* emissionTexture; bool isAbsolute; int type; } ; //! Add emission values //isAbsolute: whether to add emission values to existing, or replace -void applyEmission(FlagGrid& flags, Grid<Real>& target, Grid<Real>& source, bool isAbsolute=true, int type=0) { - KnApplyEmission(flags, target, source, isAbsolute, type); +void applyEmission(FlagGrid& flags, Grid<Real>& target, Grid<Real>& source, Grid<Real>* emissionTexture=NULL, bool isAbsolute=true, int type=0) { + KnApplyEmission(flags, target, source, emissionTexture, isAbsolute, type); } static PyObject* _W_7 (PyObject* _self, PyObject* _linargs, PyObject* _kwds) { try { PbArgs _args(_linargs, _kwds); FluidSolver *parent = _args.obtainParent(); bool noTiming = _args.getOpt<bool>("notiming", -1, 0); pbPreparePlugin(parent, "applyEmission" , !noTiming ); PyObject *_retval = 0; { - ArgLocker _lock; FlagGrid& flags = *_args.getPtr<FlagGrid >("flags",0,&_lock); Grid<Real>& target = *_args.getPtr<Grid<Real> >("target",1,&_lock); Grid<Real>& source = *_args.getPtr<Grid<Real> >("source",2,&_lock); bool isAbsolute = _args.getOpt<bool >("isAbsolute",3,true,&_lock); int type = _args.getOpt<int >("type",4,0,&_lock); _retval = getPyNone(); applyEmission(flags,target,source,isAbsolute,type); _args.check(); } + ArgLocker _lock; FlagGrid& flags = *_args.getPtr<FlagGrid >("flags",0,&_lock); Grid<Real>& target = *_args.getPtr<Grid<Real> >("target",1,&_lock); Grid<Real>& source = *_args.getPtr<Grid<Real> >("source",2,&_lock); Grid<Real>* emissionTexture = _args.getPtrOpt<Grid<Real> >("emissionTexture",3,NULL,&_lock); bool isAbsolute = _args.getOpt<bool >("isAbsolute",4,true,&_lock); int type = _args.getOpt<int >("type",5,0,&_lock); _retval = getPyNone(); applyEmission(flags,target,source,emissio [...] pbFinalizePlugin(parent,"applyEmission", !noTiming ); return _retval; } catch(std::exception& e) { pbSetError("applyEmission",e.what()); return 0; } diff --git a/intern/mantaflow/intern/manta_develop/preprocessed/tbb/gitinfo.h b/intern/mantaflow/intern/manta_develop/preprocessed/tbb/gitinfo.h index 909d5d4705c..36fec6f4536 100644 --- a/intern/mantaflow/intern/manta_develop/preprocessed/tbb/gitinfo.h +++ b/intern/mantaflow/intern/manta_develop/preprocessed/tbb/gitinfo.h @@ -1,4 +1,4 @@ -#define MANTA_GIT_VERSION "commit 502e822aabe6f7aec7cc84525fb42b778b452704" +#define MANTA_GIT_VERSION "commit 992e0d22b10e7a67da0941e0892dbf27863a5048" diff --git a/intern/mantaflow/intern/manta_develop/preprocessed/tbb/plugin/initplugins.cpp b/intern/mantaflow/intern/manta_develop/preprocessed/tbb/plugin/initplugins.cpp index 32a8c2ab2c2..49c93c94d00 100644 --- a/intern/mantaflow/intern/manta_develop/preprocessed/tbb/plugin/initplugins.cpp +++ b/intern/mantaflow/intern/manta_develop/preprocessed/tbb/plugin/initplugins.cpp @@ -296,13 +296,14 @@ extern "C" { struct KnApplyEmission : public KernelBase { - KnApplyEmission(const FlagGrid& flags, Grid<Real>& target, const Grid<Real>& source, bool isAbsolute, int type) : KernelBase(&flags,0) ,flags(flags),target(target),source(source),isAbsolute(isAbsolute),type(type) { + KnApplyEmission(const FlagGrid& flags, Grid<Real>& target, const Grid<Real>& source, const Grid<Real>* emissionTexture, bool isAbsolute, int type) : KernelBase(&flags,0) ,flags(flags),target(target),source(source),emissionTexture(emissionTexture),isAbsolute(isAbsolute),type(type) { runMessage(); run(); } - inline void op(int i, int j, int k, const FlagGrid& flags, Grid<Real>& target, const Grid<Real>& source, bool isAbsolute, int type ) const { - // if type is given, ony check apply emission when celltype matches type from flaggrid + inline void op(int i, int j, int k, const FlagGrid& flags, Grid<Real>& target, const Grid<Real>& source, const Grid<Real>* emissionTexture, bool isAbsolute, int type ) cons @@ 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