Fluid: Cleanup and improved readability
A collection of multiple changes that had been living in my stash: - Use nullptr instead of NULL in C++ files - Removed unused/deprecated functions from headers - Cleared animatable flag in cache UI - Comment cleanups
This commit is contained in:
@@ -27,10 +27,6 @@
|
||||
#include <sstream>
|
||||
#include <zlib.h>
|
||||
|
||||
#if OPENVDB == 1
|
||||
# include "openvdb/openvdb.h"
|
||||
#endif
|
||||
|
||||
#include "MANTA_main.h"
|
||||
#include "Python.h"
|
||||
#include "fluid_script.h"
|
||||
@@ -60,13 +56,6 @@ using std::to_string;
|
||||
atomic<int> MANTA::solverID(0);
|
||||
int MANTA::with_debug(0);
|
||||
|
||||
/* Number of particles that the cache reads at once (with zlib). */
|
||||
#define PARTICLE_CHUNK 20000
|
||||
/* Number of mesh nodes that the cache reads at once (with zlib). */
|
||||
#define NODE_CHUNK 20000
|
||||
/* Number of mesh triangles that the cache reads at once (with zlib). */
|
||||
#define TRIANGLE_CHUNK 20000
|
||||
|
||||
MANTA::MANTA(int *res, FluidModifierData *fmd) : mCurrentID(++solverID)
|
||||
{
|
||||
if (with_debug)
|
||||
@@ -96,8 +85,7 @@ MANTA::MANTA(int *res, FluidModifierData *fmd) : mCurrentID(++solverID)
|
||||
mUsingInvel = (fds->active_fields & FLUID_DOMAIN_ACTIVE_INVEL);
|
||||
mUsingOutflow = (fds->active_fields & FLUID_DOMAIN_ACTIVE_OUTFLOW);
|
||||
|
||||
// Simulation constants
|
||||
mTempAmb = 0; // TODO: Maybe use this later for buoyancy calculation
|
||||
/* Simulation constants. */
|
||||
mResX = res[0];
|
||||
mResY = res[1];
|
||||
mResZ = res[2];
|
||||
@@ -105,7 +93,7 @@ MANTA::MANTA(int *res, FluidModifierData *fmd) : mCurrentID(++solverID)
|
||||
mTotalCells = mResX * mResY * mResZ;
|
||||
mResGuiding = fds->res;
|
||||
|
||||
// Smoke low res grids
|
||||
/* Smoke low res grids. */
|
||||
mDensity = nullptr;
|
||||
mShadow = nullptr;
|
||||
mHeat = nullptr;
|
||||
@@ -131,7 +119,7 @@ MANTA::MANTA(int *res, FluidModifierData *fmd) : mCurrentID(++solverID)
|
||||
mReactIn = nullptr;
|
||||
mEmissionIn = nullptr;
|
||||
|
||||
// Smoke high res grids
|
||||
/* Smoke high res grids. */
|
||||
mDensityHigh = nullptr;
|
||||
mFlameHigh = nullptr;
|
||||
mFuelHigh = nullptr;
|
||||
@@ -146,19 +134,19 @@ MANTA::MANTA(int *res, FluidModifierData *fmd) : mCurrentID(++solverID)
|
||||
mTextureV2 = nullptr;
|
||||
mTextureW2 = nullptr;
|
||||
|
||||
// Fluid low res grids
|
||||
/* Fluid low res grids. */
|
||||
mPhiIn = nullptr;
|
||||
mPhiStaticIn = nullptr;
|
||||
mPhiOutIn = nullptr;
|
||||
mPhiOutStaticIn = nullptr;
|
||||
mPhi = nullptr;
|
||||
|
||||
// Mesh
|
||||
/* Mesh. */
|
||||
mMeshNodes = nullptr;
|
||||
mMeshTriangles = nullptr;
|
||||
mMeshVelocities = nullptr;
|
||||
|
||||
// Fluid obstacle
|
||||
/* Fluid obstacle. */
|
||||
mPhiObsIn = nullptr;
|
||||
mPhiObsStaticIn = nullptr;
|
||||
mNumObstacle = nullptr;
|
||||
@@ -166,39 +154,39 @@ MANTA::MANTA(int *res, FluidModifierData *fmd) : mCurrentID(++solverID)
|
||||
mObVelocityY = nullptr;
|
||||
mObVelocityZ = nullptr;
|
||||
|
||||
// Fluid guiding
|
||||
/* Fluid guiding. */
|
||||
mPhiGuideIn = nullptr;
|
||||
mNumGuide = nullptr;
|
||||
mGuideVelocityX = nullptr;
|
||||
mGuideVelocityY = nullptr;
|
||||
mGuideVelocityZ = nullptr;
|
||||
|
||||
// Fluid initial velocity
|
||||
/* Fluid initial velocity. */
|
||||
mInVelocityX = nullptr;
|
||||
mInVelocityY = nullptr;
|
||||
mInVelocityZ = nullptr;
|
||||
|
||||
// Secondary particles
|
||||
/* Secondary particles. */
|
||||
mFlipParticleData = nullptr;
|
||||
mFlipParticleVelocity = nullptr;
|
||||
mSndParticleData = nullptr;
|
||||
mSndParticleVelocity = nullptr;
|
||||
mSndParticleLife = nullptr;
|
||||
mParticleData = nullptr;
|
||||
mParticleVelocity = nullptr;
|
||||
mParticleLife = nullptr;
|
||||
|
||||
// Cache read success indicators
|
||||
/* Cache read success indicators. */
|
||||
mFlipFromFile = false;
|
||||
mMeshFromFile = false;
|
||||
mParticlesFromFile = false;
|
||||
|
||||
// Setup Mantaflow in Python
|
||||
/* Setup Mantaflow in Python. */
|
||||
initializeMantaflow();
|
||||
|
||||
// Initializa RNA map with values that Python will need
|
||||
/* Initializa RNA map with values that Python will need. */
|
||||
initializeRNAMap(fmd);
|
||||
|
||||
bool initSuccess = true;
|
||||
// Initialize Mantaflow variables in Python
|
||||
// Liquid
|
||||
/* Initialize Mantaflow variables in Python. */
|
||||
/* Liquid. */
|
||||
if (mUsingLiquid) {
|
||||
initSuccess &= initDomain();
|
||||
initSuccess &= initLiquid();
|
||||
@@ -227,7 +215,7 @@ MANTA::MANTA(int *res, FluidModifierData *fmd) : mCurrentID(++solverID)
|
||||
mResZMesh = mUpresMesh * mResZ;
|
||||
mTotalCellsMesh = mResXMesh * mResYMesh * mResZMesh;
|
||||
|
||||
// Initialize Mantaflow variables in Python
|
||||
/* Initialize Mantaflow variables in Python. */
|
||||
initSuccess &= initMesh();
|
||||
initSuccess &= initLiquidMesh();
|
||||
}
|
||||
@@ -245,7 +233,7 @@ MANTA::MANTA(int *res, FluidModifierData *fmd) : mCurrentID(++solverID)
|
||||
}
|
||||
}
|
||||
|
||||
// Smoke
|
||||
/* Smoke. */
|
||||
if (mUsingSmoke) {
|
||||
initSuccess &= initDomain();
|
||||
initSuccess &= initSmoke();
|
||||
@@ -274,7 +262,7 @@ MANTA::MANTA(int *res, FluidModifierData *fmd) : mCurrentID(++solverID)
|
||||
mResZNoise = amplify * mResZ;
|
||||
mTotalCellsHigh = mResXNoise * mResYNoise * mResZNoise;
|
||||
|
||||
// Initialize Mantaflow variables in Python
|
||||
/* Initialize Mantaflow variables in Python. */
|
||||
initSuccess &= initNoise();
|
||||
initSuccess &= initSmokeNoise();
|
||||
if (mUsingFire)
|
||||
@@ -290,17 +278,17 @@ MANTA::MANTA(int *res, FluidModifierData *fmd) : mCurrentID(++solverID)
|
||||
|
||||
bool MANTA::initDomain(FluidModifierData *fmd)
|
||||
{
|
||||
// Vector will hold all python commands that are to be executed
|
||||
/* Vector will hold all python commands that are to be executed. */
|
||||
vector<string> pythonCommands;
|
||||
|
||||
// Set manta debug level first
|
||||
/* Set manta debug level first. */
|
||||
pythonCommands.push_back(manta_import + manta_debuglevel);
|
||||
|
||||
ostringstream ss;
|
||||
ss << "set_manta_debuglevel(" << with_debug << ")";
|
||||
pythonCommands.push_back(ss.str());
|
||||
|
||||
// Now init basic fluid domain
|
||||
/* Now init basic fluid domain. */
|
||||
string tmpString = fluid_variables + fluid_solver + fluid_alloc + fluid_cache_helper +
|
||||
fluid_bake_multiprocessing + fluid_bake_data + fluid_bake_noise +
|
||||
fluid_bake_mesh + fluid_bake_particles + fluid_bake_guiding +
|
||||
@@ -541,7 +529,7 @@ bool MANTA::initSndParts(FluidModifierData *fmd)
|
||||
|
||||
bool MANTA::initLiquidSndParts(FluidModifierData *fmd)
|
||||
{
|
||||
if (!mSndParticleData) {
|
||||
if (!mParticleData) {
|
||||
vector<string> pythonCommands;
|
||||
string tmpString = liquid_alloc_particles + liquid_variables_particles +
|
||||
liquid_step_particles + fluid_with_sndparts + liquid_load_particles +
|
||||
@@ -560,7 +548,7 @@ MANTA::~MANTA()
|
||||
cout << "~FLUID: " << mCurrentID << " with res(" << mResX << ", " << mResY << ", " << mResZ
|
||||
<< ")" << endl;
|
||||
|
||||
// Destruction string for Python
|
||||
/* Destruction string for Python. */
|
||||
string tmpString = "";
|
||||
vector<string> pythonCommands;
|
||||
bool result = false;
|
||||
@@ -568,10 +556,10 @@ MANTA::~MANTA()
|
||||
tmpString += manta_import;
|
||||
tmpString += fluid_delete_all;
|
||||
|
||||
// Initializa RNA map with values that Python will need
|
||||
/* Initializa RNA map with values that Python will need. */
|
||||
initializeRNAMap();
|
||||
|
||||
// Leave out fmd argument in parseScript since only looking up IDs
|
||||
/* Leave out fmd argument in parseScript since only looking up IDs. */
|
||||
string finalString = parseScript(tmpString);
|
||||
pythonCommands.push_back(finalString);
|
||||
result = runPythonString(pythonCommands);
|
||||
@@ -633,10 +621,10 @@ void MANTA::initializeMantaflow()
|
||||
string filename = "manta_scene_" + to_string(mCurrentID) + ".py";
|
||||
vector<string> fill = vector<string>();
|
||||
|
||||
// Initialize extension classes and wrappers
|
||||
/* Initialize extension classes and wrappers. */
|
||||
srand(0);
|
||||
PyGILState_STATE gilstate = PyGILState_Ensure();
|
||||
Pb::setup(filename, fill); // Namespace from Mantaflow (registry)
|
||||
Pb::setup(filename, fill); /* Namespace from Mantaflow (registry). */
|
||||
PyGILState_Release(gilstate);
|
||||
}
|
||||
|
||||
@@ -646,7 +634,7 @@ void MANTA::terminateMantaflow()
|
||||
cout << "Fluid: Releasing Mantaflow framework" << endl;
|
||||
|
||||
PyGILState_STATE gilstate = PyGILState_Ensure();
|
||||
Pb::finalize(); // Namespace from Mantaflow (registry)
|
||||
Pb::finalize(); /* Namespace from Mantaflow (registry). */
|
||||
PyGILState_Release(gilstate);
|
||||
}
|
||||
|
||||
@@ -1087,7 +1075,7 @@ string MANTA::parseScript(const string &setup_string, FluidModifierData *fmd)
|
||||
ostringstream res;
|
||||
string line = "";
|
||||
|
||||
// Update RNA map if modifier data is handed over
|
||||
/* Update RNA map if modifier data is handed over. */
|
||||
if (fmd) {
|
||||
initializeRNAMap(fmd);
|
||||
}
|
||||
@@ -1125,7 +1113,8 @@ bool MANTA::writeConfiguration(FluidModifierData *fmd, int framenr)
|
||||
/* Create 'config' subdir if it does not exist already. */
|
||||
BLI_dir_create_recursive(directory.c_str());
|
||||
|
||||
gzFile gzf = (gzFile)BLI_gzopen(file.c_str(), "wb1"); // do some compression
|
||||
/* Open new file with some compression. */
|
||||
gzFile gzf = (gzFile)BLI_gzopen(file.c_str(), "wb1");
|
||||
if (!gzf) {
|
||||
cerr << "Fluid Error -- Cannot open file " << file << endl;
|
||||
return false;
|
||||
@@ -1629,10 +1618,10 @@ void MANTA::exportSmokeScript(FluidModifierData *fmd)
|
||||
|
||||
string manta_script;
|
||||
|
||||
// Libraries
|
||||
/* Libraries. */
|
||||
manta_script += header_libraries + manta_import;
|
||||
|
||||
// Variables
|
||||
/* Variables. */
|
||||
manta_script += header_variables + fluid_variables + smoke_variables;
|
||||
if (noise) {
|
||||
manta_script += fluid_variables_noise + smoke_variables_noise;
|
||||
@@ -1640,14 +1629,14 @@ void MANTA::exportSmokeScript(FluidModifierData *fmd)
|
||||
if (guiding)
|
||||
manta_script += fluid_variables_guiding;
|
||||
|
||||
// Solvers
|
||||
/* Solvers. */
|
||||
manta_script += header_solvers + fluid_solver;
|
||||
if (noise)
|
||||
manta_script += fluid_solver_noise;
|
||||
if (guiding)
|
||||
manta_script += fluid_solver_guiding;
|
||||
|
||||
// Grids
|
||||
/* Grids. */
|
||||
manta_script += header_grids + fluid_alloc + smoke_alloc;
|
||||
if (noise) {
|
||||
manta_script += smoke_alloc_noise;
|
||||
@@ -1671,36 +1660,36 @@ void MANTA::exportSmokeScript(FluidModifierData *fmd)
|
||||
if (outflow)
|
||||
manta_script += fluid_alloc_outflow;
|
||||
|
||||
// Noise field
|
||||
/* Noise field. */
|
||||
if (noise)
|
||||
manta_script += smoke_wavelet_noise;
|
||||
|
||||
// Time
|
||||
/* Time. */
|
||||
manta_script += header_time + fluid_time_stepping + fluid_adapt_time_step;
|
||||
|
||||
// Import
|
||||
/* Import. */
|
||||
manta_script += header_import + fluid_file_import + fluid_cache_helper + smoke_load_data;
|
||||
if (noise)
|
||||
manta_script += smoke_load_noise;
|
||||
if (guiding)
|
||||
manta_script += fluid_load_guiding;
|
||||
|
||||
// Pre/Post Steps
|
||||
/* Pre/Post Steps. */
|
||||
manta_script += header_prepost + fluid_pre_step + fluid_post_step;
|
||||
|
||||
// Steps
|
||||
/* Steps. */
|
||||
manta_script += header_steps + smoke_adaptive_step + smoke_step;
|
||||
if (noise) {
|
||||
manta_script += smoke_step_noise;
|
||||
}
|
||||
|
||||
// Main
|
||||
/* Main. */
|
||||
manta_script += header_main + smoke_standalone + fluid_standalone;
|
||||
|
||||
// Fill in missing variables in script
|
||||
/* Fill in missing variables in script. */
|
||||
string final_script = MANTA::parseScript(manta_script, fmd);
|
||||
|
||||
// Write script
|
||||
/* Write script. */
|
||||
ofstream myfile;
|
||||
myfile.open(cacheDirScript);
|
||||
myfile << final_script;
|
||||
@@ -1739,10 +1728,10 @@ void MANTA::exportLiquidScript(FluidModifierData *fmd)
|
||||
|
||||
string manta_script;
|
||||
|
||||
// Libraries
|
||||
/* Libraries. */
|
||||
manta_script += header_libraries + manta_import;
|
||||
|
||||
// Variables
|
||||
/* Variables. */
|
||||
manta_script += header_variables + fluid_variables + liquid_variables;
|
||||
if (mesh)
|
||||
manta_script += fluid_variables_mesh;
|
||||
@@ -1751,7 +1740,7 @@ void MANTA::exportLiquidScript(FluidModifierData *fmd)
|
||||
if (guiding)
|
||||
manta_script += fluid_variables_guiding;
|
||||
|
||||
// Solvers
|
||||
/* Solvers. */
|
||||
manta_script += header_solvers + fluid_solver;
|
||||
if (mesh)
|
||||
manta_script += fluid_solver_mesh;
|
||||
@@ -1760,7 +1749,7 @@ void MANTA::exportLiquidScript(FluidModifierData *fmd)
|
||||
if (guiding)
|
||||
manta_script += fluid_solver_guiding;
|
||||
|
||||
// Grids
|
||||
/* Grids. */
|
||||
manta_script += header_grids + fluid_alloc + liquid_alloc;
|
||||
if (mesh)
|
||||
manta_script += liquid_alloc_mesh;
|
||||
@@ -1777,13 +1766,13 @@ void MANTA::exportLiquidScript(FluidModifierData *fmd)
|
||||
if (outflow)
|
||||
manta_script += fluid_alloc_outflow;
|
||||
|
||||
// Domain init
|
||||
/* Domain init. */
|
||||
manta_script += header_gridinit + liquid_init_phi;
|
||||
|
||||
// Time
|
||||
/* Time. */
|
||||
manta_script += header_time + fluid_time_stepping + fluid_adapt_time_step;
|
||||
|
||||
// Import
|
||||
/* Import. */
|
||||
manta_script += header_import + fluid_file_import + fluid_cache_helper + liquid_load_data;
|
||||
if (mesh)
|
||||
manta_script += liquid_load_mesh;
|
||||
@@ -1792,23 +1781,23 @@ void MANTA::exportLiquidScript(FluidModifierData *fmd)
|
||||
if (guiding)
|
||||
manta_script += fluid_load_guiding;
|
||||
|
||||
// Pre/Post Steps
|
||||
/* Pre/Post Steps. */
|
||||
manta_script += header_prepost + fluid_pre_step + fluid_post_step;
|
||||
|
||||
// Steps
|
||||
/* Steps. */
|
||||
manta_script += header_steps + liquid_adaptive_step + liquid_step;
|
||||
if (mesh)
|
||||
manta_script += liquid_step_mesh;
|
||||
if (drops || bubble || floater || tracer)
|
||||
manta_script += liquid_step_particles;
|
||||
|
||||
// Main
|
||||
/* Main. */
|
||||
manta_script += header_main + liquid_standalone + fluid_standalone;
|
||||
|
||||
// Fill in missing variables in script
|
||||
/* Fill in missing variables in script. */
|
||||
string final_script = MANTA::parseScript(manta_script, fmd);
|
||||
|
||||
// Write script
|
||||
/* Write script. */
|
||||
ofstream myfile;
|
||||
myfile.open(cacheDirScript);
|
||||
myfile << final_script;
|
||||
@@ -2108,9 +2097,9 @@ void MANTA::updatePointers(FluidModifierData *fmd)
|
||||
mMeshVelocities = (meshvel) ? getPointer<vector<pVel>>("mVel" + mesh_ext, func) : nullptr;
|
||||
|
||||
/* Secondary particles. */
|
||||
mSndParticleData = (parts) ? getPointer<vector<pData>>("ppSnd" + snd_ext, func) : nullptr;
|
||||
mSndParticleVelocity = (parts) ? getPointer<vector<pVel>>("pVelSnd" + pp_ext, func) : nullptr;
|
||||
mSndParticleLife = (parts) ? getPointer<vector<float>>("pLifeSnd" + pp_ext, func) : nullptr;
|
||||
mParticleData = (parts) ? getPointer<vector<pData>>("ppSnd" + snd_ext, func) : nullptr;
|
||||
mParticleVelocity = (parts) ? getPointer<vector<pVel>>("pVelSnd" + pp_ext, func) : nullptr;
|
||||
mParticleLife = (parts) ? getPointer<vector<float>>("pLifeSnd" + pp_ext, func) : nullptr;
|
||||
|
||||
mFlipFromFile = false;
|
||||
mMeshFromFile = false;
|
||||
|
@@ -41,7 +41,7 @@ struct MANTA {
|
||||
MANTA(){};
|
||||
virtual ~MANTA();
|
||||
|
||||
// Mirroring Mantaflow structures for particle data (pVel also used for mesh vert vels)
|
||||
/* Mirroring Mantaflow structures for particle data (pVel also used for mesh vert vels). */
|
||||
typedef struct PData {
|
||||
float pos[3];
|
||||
int flag;
|
||||
@@ -50,7 +50,7 @@ struct MANTA {
|
||||
float pos[3];
|
||||
} pVel;
|
||||
|
||||
// Mirroring Mantaflow structures for meshes
|
||||
/* Mirroring Mantaflow structures for meshes. */
|
||||
typedef struct Node {
|
||||
int flags;
|
||||
float pos[3], normal[3];
|
||||
@@ -60,36 +60,33 @@ struct MANTA {
|
||||
int flags;
|
||||
} Triangle;
|
||||
|
||||
// Manta step, handling everything
|
||||
void step(struct FluidModifierData *fmd, int startFrame);
|
||||
/* Grid initialization functions. */
|
||||
bool initHeat(struct FluidModifierData *fmd = nullptr);
|
||||
bool initFire(struct FluidModifierData *fmd = nullptr);
|
||||
bool initColors(struct FluidModifierData *fmd = nullptr);
|
||||
bool initFireHigh(struct FluidModifierData *fmd = nullptr);
|
||||
bool initColorsHigh(struct FluidModifierData *fmd = nullptr);
|
||||
bool initLiquid(FluidModifierData *fmd = nullptr);
|
||||
bool initLiquidMesh(FluidModifierData *fmd = nullptr);
|
||||
bool initObstacle(FluidModifierData *fmd = nullptr);
|
||||
bool initCurvature(FluidModifierData *fmd = nullptr);
|
||||
bool initGuiding(FluidModifierData *fmd = nullptr);
|
||||
bool initFractions(FluidModifierData *fmd = nullptr);
|
||||
bool initInVelocity(FluidModifierData *fmd = nullptr);
|
||||
bool initOutflow(FluidModifierData *fmd = nullptr);
|
||||
bool initSndParts(FluidModifierData *fmd = nullptr);
|
||||
bool initLiquidSndParts(FluidModifierData *fmd = nullptr);
|
||||
|
||||
// Grid initialization functions
|
||||
bool initHeat(struct FluidModifierData *fmd = NULL);
|
||||
bool initFire(struct FluidModifierData *fmd = NULL);
|
||||
bool initColors(struct FluidModifierData *fmd = NULL);
|
||||
bool initFireHigh(struct FluidModifierData *fmd = NULL);
|
||||
bool initColorsHigh(struct FluidModifierData *fmd = NULL);
|
||||
bool initLiquid(FluidModifierData *fmd = NULL);
|
||||
bool initLiquidMesh(FluidModifierData *fmd = NULL);
|
||||
bool initObstacle(FluidModifierData *fmd = NULL);
|
||||
bool initCurvature(FluidModifierData *fmd = NULL);
|
||||
bool initGuiding(FluidModifierData *fmd = NULL);
|
||||
bool initFractions(FluidModifierData *fmd = NULL);
|
||||
bool initInVelocity(FluidModifierData *fmd = NULL);
|
||||
bool initOutflow(FluidModifierData *fmd = NULL);
|
||||
bool initSndParts(FluidModifierData *fmd = NULL);
|
||||
bool initLiquidSndParts(FluidModifierData *fmd = NULL);
|
||||
|
||||
// Pointer transfer: Mantaflow -> Blender
|
||||
/* Pointer transfer: Mantaflow -> Blender. */
|
||||
void updatePointers(FluidModifierData *fmd);
|
||||
|
||||
// Write cache
|
||||
/* Write cache. */
|
||||
bool writeConfiguration(FluidModifierData *fmd, int framenr);
|
||||
bool writeData(FluidModifierData *fmd, int framenr);
|
||||
bool writeNoise(FluidModifierData *fmd, int framenr);
|
||||
// write calls for mesh and particles were left in bake calls for now
|
||||
|
||||
// Read cache (via Manta save/load)
|
||||
/* Read cache (via Python). */
|
||||
bool readConfiguration(FluidModifierData *fmd, int framenr);
|
||||
bool readData(FluidModifierData *fmd, int framenr, bool resumable);
|
||||
bool readNoise(FluidModifierData *fmd, int framenr, bool resumable);
|
||||
@@ -97,26 +94,21 @@ struct MANTA {
|
||||
bool readParticles(FluidModifierData *fmd, int framenr, bool resumable);
|
||||
bool readGuiding(FluidModifierData *fmd, int framenr, bool sourceDomain);
|
||||
|
||||
// Read cache (via file read functions in MANTA - e.g. read .bobj.gz meshes, .uni particles)
|
||||
bool updateMeshStructures(FluidModifierData *fmd, int framenr);
|
||||
bool updateFlipStructures(FluidModifierData *fmd, int framenr);
|
||||
bool updateParticleStructures(FluidModifierData *fmd, int framenr);
|
||||
bool updateSmokeStructures(FluidModifierData *fmd, int framenr);
|
||||
bool updateNoiseStructures(FluidModifierData *fmd, int framenr);
|
||||
/* Propagate variable changes from RNA to Python. */
|
||||
bool updateVariables(FluidModifierData *fmd);
|
||||
|
||||
// Bake cache
|
||||
/* Bake cache. */
|
||||
bool bakeData(FluidModifierData *fmd, int framenr);
|
||||
bool bakeNoise(FluidModifierData *fmd, int framenr);
|
||||
bool bakeMesh(FluidModifierData *fmd, int framenr);
|
||||
bool bakeParticles(FluidModifierData *fmd, int framenr);
|
||||
bool bakeGuiding(FluidModifierData *fmd, int framenr);
|
||||
|
||||
// IO for Mantaflow scene script
|
||||
/* IO for Mantaflow scene script. */
|
||||
void exportSmokeScript(struct FluidModifierData *fmd);
|
||||
void exportLiquidScript(struct FluidModifierData *fmd);
|
||||
|
||||
// Check cache status by frame
|
||||
/* Check cache status by frame. */
|
||||
bool hasConfig(FluidModifierData *fmd, int framenr);
|
||||
bool hasData(FluidModifierData *fmd, int framenr);
|
||||
bool hasNoise(FluidModifierData *fmd, int framenr);
|
||||
@@ -193,7 +185,7 @@ struct MANTA {
|
||||
return mUpresParticle;
|
||||
}
|
||||
|
||||
// Smoke getters
|
||||
/* Smoke getters. */
|
||||
inline float *getDensity()
|
||||
{
|
||||
return mDensity;
|
||||
@@ -422,9 +414,9 @@ struct MANTA {
|
||||
}
|
||||
|
||||
static atomic<int> solverID;
|
||||
static int with_debug; // on or off (1 or 0), also sets manta debug level
|
||||
static int with_debug; /* On or off (1 or 0), also sets manta debug level. */
|
||||
|
||||
// Mesh getters
|
||||
/* Mesh getters. */
|
||||
inline int getNumVertices()
|
||||
{
|
||||
return (mMeshNodes && !mMeshNodes->empty()) ? mMeshNodes->size() : 0;
|
||||
@@ -563,9 +555,9 @@ struct MANTA {
|
||||
inline int getSndParticleFlagAt(int i)
|
||||
{
|
||||
assert(i >= 0);
|
||||
if (mSndParticleData && !mSndParticleData->empty()) {
|
||||
assert(i < mSndParticleData->size());
|
||||
return (*mSndParticleData)[i].flag;
|
||||
if (mParticleData && !mParticleData->empty()) {
|
||||
assert(i < mParticleData->size());
|
||||
return (*mParticleData)[i].flag;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -601,27 +593,27 @@ struct MANTA {
|
||||
inline float getSndParticlePositionXAt(int i)
|
||||
{
|
||||
assert(i >= 0);
|
||||
if (mSndParticleData && !mSndParticleData->empty()) {
|
||||
assert(i < mSndParticleData->size());
|
||||
return (*mSndParticleData)[i].pos[0];
|
||||
if (mParticleData && !mParticleData->empty()) {
|
||||
assert(i < mParticleData->size());
|
||||
return (*mParticleData)[i].pos[0];
|
||||
}
|
||||
return 0.0f;
|
||||
}
|
||||
inline float getSndParticlePositionYAt(int i)
|
||||
{
|
||||
assert(i >= 0);
|
||||
if (mSndParticleData && !mSndParticleData->empty()) {
|
||||
assert(i < mSndParticleData->size());
|
||||
return (*mSndParticleData)[i].pos[1];
|
||||
if (mParticleData && !mParticleData->empty()) {
|
||||
assert(i < mParticleData->size());
|
||||
return (*mParticleData)[i].pos[1];
|
||||
}
|
||||
return 0.0f;
|
||||
}
|
||||
inline float getSndParticlePositionZAt(int i)
|
||||
{
|
||||
assert(i >= 0);
|
||||
if (mSndParticleData && !mSndParticleData->empty()) {
|
||||
assert(i < mSndParticleData->size());
|
||||
return (*mSndParticleData)[i].pos[2];
|
||||
if (mParticleData && !mParticleData->empty()) {
|
||||
assert(i < mParticleData->size());
|
||||
return (*mParticleData)[i].pos[2];
|
||||
}
|
||||
return 0.0f;
|
||||
}
|
||||
@@ -657,27 +649,27 @@ struct MANTA {
|
||||
inline float getSndParticleVelocityXAt(int i)
|
||||
{
|
||||
assert(i >= 0);
|
||||
if (mSndParticleVelocity && !mSndParticleVelocity->empty()) {
|
||||
assert(i < mSndParticleVelocity->size());
|
||||
return (*mSndParticleVelocity)[i].pos[0];
|
||||
if (mParticleVelocity && !mParticleVelocity->empty()) {
|
||||
assert(i < mParticleVelocity->size());
|
||||
return (*mParticleVelocity)[i].pos[0];
|
||||
}
|
||||
return 0.0f;
|
||||
}
|
||||
inline float getSndParticleVelocityYAt(int i)
|
||||
{
|
||||
assert(i >= 0);
|
||||
if (mSndParticleVelocity && !mSndParticleVelocity->empty()) {
|
||||
assert(i < mSndParticleVelocity->size());
|
||||
return (*mSndParticleVelocity)[i].pos[1];
|
||||
if (mParticleVelocity && !mParticleVelocity->empty()) {
|
||||
assert(i < mParticleVelocity->size());
|
||||
return (*mParticleVelocity)[i].pos[1];
|
||||
}
|
||||
return 0.0f;
|
||||
}
|
||||
inline float getSndParticleVelocityZAt(int i)
|
||||
{
|
||||
assert(i >= 0);
|
||||
if (mSndParticleVelocity && !mSndParticleVelocity->empty()) {
|
||||
assert(i < mSndParticleVelocity->size());
|
||||
return (*mSndParticleVelocity)[i].pos[2];
|
||||
if (mParticleVelocity && !mParticleVelocity->empty()) {
|
||||
assert(i < mParticleVelocity->size());
|
||||
return (*mParticleVelocity)[i].pos[2];
|
||||
}
|
||||
return 0.0f;
|
||||
}
|
||||
@@ -686,30 +678,28 @@ struct MANTA {
|
||||
{
|
||||
return (mFlipParticleData && !mFlipParticleData->empty()) ?
|
||||
(float *)&mFlipParticleData->front() :
|
||||
NULL;
|
||||
nullptr;
|
||||
}
|
||||
inline float *getSndParticleData()
|
||||
{
|
||||
return (mSndParticleData && !mSndParticleData->empty()) ? (float *)&mSndParticleData->front() :
|
||||
NULL;
|
||||
return (mParticleData && !mParticleData->empty()) ? (float *)&mParticleData->front() : nullptr;
|
||||
}
|
||||
|
||||
inline float *getFlipParticleVelocity()
|
||||
{
|
||||
return (mFlipParticleVelocity && !mFlipParticleVelocity->empty()) ?
|
||||
(float *)&mFlipParticleVelocity->front() :
|
||||
NULL;
|
||||
nullptr;
|
||||
}
|
||||
inline float *getSndParticleVelocity()
|
||||
{
|
||||
return (mSndParticleVelocity && !mSndParticleVelocity->empty()) ?
|
||||
(float *)&mSndParticleVelocity->front() :
|
||||
NULL;
|
||||
return (mParticleVelocity && !mParticleVelocity->empty()) ?
|
||||
(float *)&mParticleVelocity->front() :
|
||||
nullptr;
|
||||
}
|
||||
inline float *getSndParticleLife()
|
||||
{
|
||||
return (mSndParticleLife && !mSndParticleLife->empty()) ? (float *)&mSndParticleLife->front() :
|
||||
NULL;
|
||||
return (mParticleLife && !mParticleLife->empty()) ? (float *)&mParticleLife->front() : nullptr;
|
||||
}
|
||||
|
||||
inline int getNumFlipParticles()
|
||||
@@ -718,7 +708,7 @@ struct MANTA {
|
||||
}
|
||||
inline int getNumSndParticles()
|
||||
{
|
||||
return (mSndParticleData && !mSndParticleData->empty()) ? mSndParticleData->size() : 0;
|
||||
return (mParticleData && !mParticleData->empty()) ? mParticleData->size() : 0;
|
||||
}
|
||||
|
||||
inline bool usingFlipFromFile()
|
||||
@@ -734,7 +724,7 @@ struct MANTA {
|
||||
return mParticlesFromFile;
|
||||
}
|
||||
|
||||
// Direct access to solver time attributes
|
||||
/* Direct access to solver time attributes. */
|
||||
int getFrame();
|
||||
float getTimestep();
|
||||
void adaptTimestep();
|
||||
@@ -742,7 +732,7 @@ struct MANTA {
|
||||
bool needsRealloc(FluidModifierData *fmd);
|
||||
|
||||
private:
|
||||
// simulation constants
|
||||
/* Simulation constants. */
|
||||
size_t mTotalCells;
|
||||
size_t mTotalCellsHigh;
|
||||
size_t mTotalCellsMesh;
|
||||
@@ -750,6 +740,7 @@ struct MANTA {
|
||||
|
||||
unordered_map<string, string> mRNAMap;
|
||||
|
||||
/* The ID of the solver objects will be incremented for every new object. */
|
||||
int mCurrentID;
|
||||
|
||||
bool mUsingHeat;
|
||||
@@ -796,10 +787,7 @@ struct MANTA {
|
||||
int mUpresMesh;
|
||||
int mUpresParticle;
|
||||
|
||||
float mTempAmb; /* ambient temperature */
|
||||
float mConstantScaling;
|
||||
|
||||
// Fluid grids
|
||||
/* Fluid grids. */
|
||||
float *mVelocityX;
|
||||
float *mVelocityY;
|
||||
float *mVelocityZ;
|
||||
@@ -819,7 +807,7 @@ struct MANTA {
|
||||
float *mNumObstacle;
|
||||
float *mNumGuide;
|
||||
|
||||
// Smoke grids
|
||||
/* Smoke grids. */
|
||||
float *mDensity;
|
||||
float *mHeat;
|
||||
float *mFlame;
|
||||
@@ -851,7 +839,7 @@ struct MANTA {
|
||||
float *mTextureV2;
|
||||
float *mTextureW2;
|
||||
|
||||
// Liquid grids
|
||||
/* Liquid grids. */
|
||||
float *mPhiIn;
|
||||
float *mPhiStaticIn;
|
||||
float *mPhiObsIn;
|
||||
@@ -861,31 +849,31 @@ struct MANTA {
|
||||
float *mPhiOutStaticIn;
|
||||
float *mPhi;
|
||||
|
||||
// Mesh fields
|
||||
/* Mesh fields. */
|
||||
vector<Node> *mMeshNodes;
|
||||
vector<Triangle> *mMeshTriangles;
|
||||
vector<pVel> *mMeshVelocities;
|
||||
|
||||
// Particle fields
|
||||
/* Particle fields. */
|
||||
vector<pData> *mFlipParticleData;
|
||||
vector<pVel> *mFlipParticleVelocity;
|
||||
|
||||
vector<pData> *mSndParticleData;
|
||||
vector<pVel> *mSndParticleVelocity;
|
||||
vector<float> *mSndParticleLife;
|
||||
vector<pData> *mParticleData;
|
||||
vector<pVel> *mParticleVelocity;
|
||||
vector<float> *mParticleLife;
|
||||
|
||||
void initializeRNAMap(struct FluidModifierData *doRnaRefresh = NULL);
|
||||
bool initDomain(struct FluidModifierData *doRnaRefresh = NULL);
|
||||
bool initNoise(struct FluidModifierData *doRnaRefresh = NULL);
|
||||
bool initMesh(struct FluidModifierData *doRnaRefresh = NULL);
|
||||
bool initSmoke(struct FluidModifierData *doRnaRefresh = NULL);
|
||||
bool initSmokeNoise(struct FluidModifierData *doRnaRefresh = NULL);
|
||||
void initializeRNAMap(struct FluidModifierData *doRnaRefresh = nullptr);
|
||||
bool initDomain(struct FluidModifierData *doRnaRefresh = nullptr);
|
||||
bool initNoise(struct FluidModifierData *doRnaRefresh = nullptr);
|
||||
bool initMesh(struct FluidModifierData *doRnaRefresh = nullptr);
|
||||
bool initSmoke(struct FluidModifierData *doRnaRefresh = nullptr);
|
||||
bool initSmokeNoise(struct FluidModifierData *doRnaRefresh = nullptr);
|
||||
void initializeMantaflow();
|
||||
void terminateMantaflow();
|
||||
bool runPythonString(vector<string> commands);
|
||||
string getRealValue(const string &varName);
|
||||
string parseLine(const string &line);
|
||||
string parseScript(const string &setup_string, FluidModifierData *fmd = NULL);
|
||||
string parseScript(const string &setup_string, FluidModifierData *fmd = nullptr);
|
||||
string getDirectory(struct FluidModifierData *fmd, string subdirectory);
|
||||
string getFile(struct FluidModifierData *fmd,
|
||||
string subdirectory,
|
||||
|
@@ -2596,7 +2596,7 @@ static void ensure_flowsfields(FluidDomainSettings *fds)
|
||||
manta_smoke_ensure_fire(fds->fluid, fds->fmd);
|
||||
}
|
||||
if (fds->active_fields & FLUID_DOMAIN_ACTIVE_COLORS) {
|
||||
/* initialize all smoke with "active_color" */
|
||||
/* Initialize all smoke with "active_color". */
|
||||
manta_smoke_ensure_colors(fds->fluid, fds->fmd);
|
||||
}
|
||||
if (fds->type == FLUID_DOMAIN_TYPE_LIQUID &&
|
||||
@@ -2617,7 +2617,7 @@ static void update_flowsflags(FluidDomainSettings *fds, Object **flowobjs, int n
|
||||
FLUID_DOMAIN_ACTIVE_HEAT | FLUID_DOMAIN_ACTIVE_FIRE);
|
||||
active_fields &= ~prev_flags;
|
||||
|
||||
/* Monitor active fields based on flow settings */
|
||||
/* Monitor active fields based on flow settings. */
|
||||
for (flow_index = 0; flow_index < numflowobj; flow_index++) {
|
||||
Object *flow_ob = flowobjs[flow_index];
|
||||
FluidModifierData *fmd2 = (FluidModifierData *)BKE_modifiers_findby_type(flow_ob,
|
||||
@@ -2628,6 +2628,7 @@ static void update_flowsflags(FluidDomainSettings *fds, Object **flowobjs, int n
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Activate specific grids if at least one flow object requires this grid. */
|
||||
if ((fmd2->type & MOD_FLUID_TYPE_FLOW) && fmd2->flow) {
|
||||
FluidFlowSettings *ffs = fmd2->flow;
|
||||
if (!ffs) {
|
||||
@@ -2648,17 +2649,17 @@ static void update_flowsflags(FluidDomainSettings *fds, Object **flowobjs, int n
|
||||
continue;
|
||||
}
|
||||
|
||||
/* activate heat field if flow produces any heat */
|
||||
if (ffs->temperature) {
|
||||
/* Activate heat field if a flow object produces any heat. */
|
||||
if (ffs->temperature != 0.0) {
|
||||
active_fields |= FLUID_DOMAIN_ACTIVE_HEAT;
|
||||
}
|
||||
/* activate fuel field if flow adds any fuel */
|
||||
if (ffs->fuel_amount &&
|
||||
(ffs->type == FLUID_FLOW_TYPE_FIRE || ffs->type == FLUID_FLOW_TYPE_SMOKEFIRE)) {
|
||||
/* Activate fuel field if a flow object is of fire type. */
|
||||
if (ffs->fuel_amount != 0.0 || ffs->type == FLUID_FLOW_TYPE_FIRE ||
|
||||
ffs->type == FLUID_FLOW_TYPE_SMOKEFIRE) {
|
||||
active_fields |= FLUID_DOMAIN_ACTIVE_FIRE;
|
||||
}
|
||||
/* activate color field if flows add smoke with varying colors */
|
||||
if (ffs->density &&
|
||||
/* Activate color field if flows add smoke with varying colors. */
|
||||
if (ffs->density != 0.0 &&
|
||||
(ffs->type == FLUID_FLOW_TYPE_SMOKE || ffs->type == FLUID_FLOW_TYPE_SMOKEFIRE)) {
|
||||
if (!(active_fields & FLUID_DOMAIN_ACTIVE_COLOR_SET)) {
|
||||
copy_v3_v3(fds->active_color, ffs->color);
|
||||
@@ -2671,11 +2672,11 @@ static void update_flowsflags(FluidDomainSettings *fds, Object **flowobjs, int n
|
||||
}
|
||||
}
|
||||
}
|
||||
/* Monitor active fields based on domain settings */
|
||||
/* Monitor active fields based on domain settings. */
|
||||
if (fds->type == FLUID_DOMAIN_TYPE_GAS && active_fields & FLUID_DOMAIN_ACTIVE_FIRE) {
|
||||
/* heat is always needed for fire */
|
||||
/* Heat is always needed for fire. */
|
||||
active_fields |= FLUID_DOMAIN_ACTIVE_HEAT;
|
||||
/* also activate colors if domain smoke color differs from active color */
|
||||
/* Also activate colors if domain smoke color differs from active color. */
|
||||
if (!(active_fields & FLUID_DOMAIN_ACTIVE_COLOR_SET)) {
|
||||
copy_v3_v3(fds->active_color, fds->flame_smoke_color);
|
||||
active_fields |= FLUID_DOMAIN_ACTIVE_COLOR_SET;
|
||||
|
@@ -2048,6 +2048,7 @@ static void rna_def_fluid_domain_settings(BlenderRNA *brna)
|
||||
prop,
|
||||
"Start",
|
||||
"Frame on which the simulation starts. This is the first frame that will be baked");
|
||||
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
|
||||
|
||||
prop = RNA_def_property(srna, "cache_frame_end", PROP_INT, PROP_TIME);
|
||||
RNA_def_property_int_sdna(prop, NULL, "cache_frame_end");
|
||||
@@ -2057,6 +2058,7 @@ static void rna_def_fluid_domain_settings(BlenderRNA *brna)
|
||||
prop,
|
||||
"End",
|
||||
"Frame on which the simulation stops. This is the last frame that will be baked");
|
||||
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
|
||||
|
||||
prop = RNA_def_property(srna, "cache_frame_offset", PROP_INT, PROP_TIME);
|
||||
RNA_def_property_int_sdna(prop, NULL, "cache_frame_offset");
|
||||
@@ -2066,6 +2068,7 @@ static void rna_def_fluid_domain_settings(BlenderRNA *brna)
|
||||
"Offset",
|
||||
"Frame offset that is used when loading the simulation from the cache. It is not considered "
|
||||
"when baking the simulation, only when loading it");
|
||||
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
|
||||
|
||||
prop = RNA_def_property(srna, "cache_frame_pause_data", PROP_INT, PROP_TIME);
|
||||
RNA_def_property_int_sdna(prop, NULL, "cache_frame_pause_data");
|
||||
@@ -2089,6 +2092,7 @@ static void rna_def_fluid_domain_settings(BlenderRNA *brna)
|
||||
prop, NULL, "rna_Fluid_cachetype_mesh_set", "rna_Fluid_cachetype_mesh_itemf");
|
||||
RNA_def_property_ui_text(
|
||||
prop, "File Format", "Select the file format to be used for caching surface data");
|
||||
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
|
||||
RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_meshcache_reset");
|
||||
|
||||
prop = RNA_def_property(srna, "cache_data_format", PROP_ENUM, PROP_NONE);
|
||||
@@ -2098,6 +2102,7 @@ static void rna_def_fluid_domain_settings(BlenderRNA *brna)
|
||||
prop, NULL, "rna_Fluid_cachetype_data_set", "rna_Fluid_cachetype_volume_itemf");
|
||||
RNA_def_property_ui_text(
|
||||
prop, "File Format", "Select the file format to be used for caching volumetric data");
|
||||
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
|
||||
RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
|
||||
|
||||
prop = RNA_def_property(srna, "cache_particle_format", PROP_ENUM, PROP_NONE);
|
||||
@@ -2107,6 +2112,7 @@ static void rna_def_fluid_domain_settings(BlenderRNA *brna)
|
||||
prop, NULL, "rna_Fluid_cachetype_particle_set", "rna_Fluid_cachetype_particle_itemf");
|
||||
RNA_def_property_ui_text(
|
||||
prop, "File Format", "Select the file format to be used for caching particle data");
|
||||
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
|
||||
RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_particlescache_reset");
|
||||
|
||||
prop = RNA_def_property(srna, "cache_noise_format", PROP_ENUM, PROP_NONE);
|
||||
@@ -2116,6 +2122,7 @@ static void rna_def_fluid_domain_settings(BlenderRNA *brna)
|
||||
prop, NULL, "rna_Fluid_cachetype_noise_set", "rna_Fluid_cachetype_volume_itemf");
|
||||
RNA_def_property_ui_text(
|
||||
prop, "File Format", "Select the file format to be used for caching noise data");
|
||||
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
|
||||
RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_noisecache_reset");
|
||||
|
||||
prop = RNA_def_property(srna, "cache_type", PROP_ENUM, PROP_NONE);
|
||||
@@ -2123,6 +2130,7 @@ static void rna_def_fluid_domain_settings(BlenderRNA *brna)
|
||||
RNA_def_property_enum_items(prop, cache_types);
|
||||
RNA_def_property_enum_funcs(prop, NULL, "rna_Fluid_cachetype_set", NULL);
|
||||
RNA_def_property_ui_text(prop, "Type", "Change the cache type of the simulation");
|
||||
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
|
||||
RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Fluid_domain_data_reset");
|
||||
|
||||
prop = RNA_def_property(srna, "cache_resumable", PROP_BOOLEAN, PROP_NONE);
|
||||
@@ -2133,6 +2141,7 @@ static void rna_def_fluid_domain_settings(BlenderRNA *brna)
|
||||
"Additional data will be saved so that the bake jobs can be resumed after pausing. Because "
|
||||
"more data will be written to disk it is recommended to avoid enabling this option when "
|
||||
"baking at high resolutions");
|
||||
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
|
||||
RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
|
||||
|
||||
prop = RNA_def_property(srna, "cache_directory", PROP_STRING, PROP_DIRPATH);
|
||||
|
Reference in New Issue
Block a user