[Bf-blender-cvs] [a975cb92077] master: Fluid: Foundation for new OpenVDB file IO

Sebastián Barschkis noreply at git.blender.org
Sun May 17 17:09:51 CEST 2020


Commit: a975cb920772dcae69dd38ed32cddfd1d647c721
Author: Sebastián Barschkis
Date:   Sun May 17 16:59:48 2020 +0200
Branches: master
https://developer.blender.org/rBa975cb920772dcae69dd38ed32cddfd1d647c721

Fluid: Foundation for new OpenVDB file IO

This commit lays the foundation for support for OpenVDB caching with multiple grids per cache file.

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

M	intern/mantaflow/intern/MANTA_main.cpp
M	intern/mantaflow/intern/MANTA_main.h
M	intern/mantaflow/intern/strings/fluid_script.h
M	intern/mantaflow/intern/strings/smoke_script.h
M	source/blender/blenkernel/intern/fluid.c
M	source/blender/makesdna/DNA_fluid_types.h

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

diff --git a/intern/mantaflow/intern/MANTA_main.cpp b/intern/mantaflow/intern/MANTA_main.cpp
index 133e84d71a7..d3f0a0f2aaa 100644
--- a/intern/mantaflow/intern/MANTA_main.cpp
+++ b/intern/mantaflow/intern/MANTA_main.cpp
@@ -843,6 +843,23 @@ void MANTA::initializeRNAMap(FluidModifierData *mmd)
   mRNAMap["GRAVITY_Y"] = to_string(mds->gravity[1]);
   mRNAMap["GRAVITY_Z"] = to_string(mds->gravity[2]);
   mRNAMap["CACHE_DIR"] = cacheDirectory;
+  mRNAMap["NAME_DENSITY"] = FLUID_GRIDNAME_DENSITY;
+  mRNAMap["NAME_SHADOW"] = FLUID_GRIDNAME_SHADOW;
+  mRNAMap["NAME_HEAT"] = FLUID_GRIDNAME_HEAT;
+  mRNAMap["NAME_VELOCITY"] = FLUID_GRIDNAME_VELOCITY;
+  mRNAMap["NAME_COLORR"] = FLUID_GRIDNAME_COLORR;
+  mRNAMap["NAME_COLORG"] = FLUID_GRIDNAME_COLORG;
+  mRNAMap["NAME_COLORB"] = FLUID_GRIDNAME_COLORB;
+  mRNAMap["NAME_FLAME"] = FLUID_GRIDNAME_FLAME;
+  mRNAMap["NAME_FUEL"] = FLUID_GRIDNAME_FUEL;
+  mRNAMap["NAME_REACT"] = FLUID_GRIDNAME_REACT;
+  mRNAMap["NAME_DENSITYNOISE"] = FLUID_GRIDNAME_DENSITYNOISE;
+  mRNAMap["NAME_COLORRNOISE"] = FLUID_GRIDNAME_COLORRNOISE;
+  mRNAMap["NAME_COLORGNOISE"] = FLUID_GRIDNAME_COLORGNOISE;
+  mRNAMap["NAME_COLORBNOISE"] = FLUID_GRIDNAME_COLORBNOISE;
+  mRNAMap["NAME_FLAMENOISE"] = FLUID_GRIDNAME_FLAMENOISE;
+  mRNAMap["NAME_FUELNOISE"] = FLUID_GRIDNAME_FUELNOISE;
+  mRNAMap["NAME_REACTNOISE"] = FLUID_GRIDNAME_REACTNOISE;
 }
 
 string MANTA::getRealValue(const string &varName)
@@ -933,8 +950,7 @@ bool MANTA::updateFlipStructures(FluidModifierData *mmd, int framenr)
   mFlipParticleVelocity->clear();
 
   string pformat = getCacheFileEnding(mds->cache_particle_format);
-  string file = getFile(
-      mmd, FLUID_DOMAIN_DIR_DATA, FLUID_DOMAIN_FILE_PP, pformat.c_str(), framenr);
+  string file = getFile(mmd, FLUID_DOMAIN_DIR_DATA, FLUID_FILENAME_PP, pformat, framenr);
 
   expected += 1;
   if (BLI_exists(file.c_str())) {
@@ -942,7 +958,7 @@ bool MANTA::updateFlipStructures(FluidModifierData *mmd, int framenr)
     assert(result == expected);
   }
 
-  file = getFile(mmd, FLUID_DOMAIN_DIR_DATA, FLUID_DOMAIN_FILE_PVEL, pformat.c_str(), framenr);
+  file = getFile(mmd, FLUID_DOMAIN_DIR_DATA, FLUID_FILENAME_PVEL, pformat, framenr);
   expected += 1;
   if (BLI_exists(file.c_str())) {
     result += updateParticlesFromFile(file, false, true);
@@ -980,7 +996,7 @@ bool MANTA::updateMeshStructures(FluidModifierData *mmd, int framenr)
 
   string mformat = getCacheFileEnding(mds->cache_mesh_format);
   string dformat = getCacheFileEnding(mds->cache_data_format);
-  string file = getFile(mmd, FLUID_DOMAIN_DIR_MESH, FLUID_DOMAIN_FILE_MESH, mformat, framenr);
+  string file = getFile(mmd, FLUID_DOMAIN_DIR_MESH, FLUID_FILENAME_MESH, mformat, framenr);
 
   expected += 1;
   if (BLI_exists(file.c_str())) {
@@ -989,7 +1005,7 @@ bool MANTA::updateMeshStructures(FluidModifierData *mmd, int framenr)
   }
 
   if (mUsingMVel) {
-    file = getFile(mmd, FLUID_DOMAIN_DIR_MESH, FLUID_DOMAIN_FILE_MESHVEL, dformat, framenr);
+    file = getFile(mmd, FLUID_DOMAIN_DIR_MESH, FLUID_FILENAME_MESHVEL, dformat, framenr);
     expected += 1;
     if (BLI_exists(file.c_str())) {
       result += updateMeshFromFile(file);
@@ -1025,8 +1041,7 @@ bool MANTA::updateParticleStructures(FluidModifierData *mmd, int framenr)
   mSndParticleLife->clear();
 
   string pformat = getCacheFileEnding(mds->cache_particle_format);
-  string file = getFile(
-      mmd, FLUID_DOMAIN_DIR_PARTICLES, FLUID_DOMAIN_FILE_PPSND, pformat, framenr);
+  string file = getFile(mmd, FLUID_DOMAIN_DIR_PARTICLES, FLUID_FILENAME_PPSND, pformat, framenr);
 
   expected += 1;
   if (BLI_exists(file.c_str())) {
@@ -1034,14 +1049,14 @@ bool MANTA::updateParticleStructures(FluidModifierData *mmd, int framenr)
     assert(result == expected);
   }
 
-  file = getFile(mmd, FLUID_DOMAIN_DIR_PARTICLES, FLUID_DOMAIN_FILE_PVELSND, pformat, framenr);
+  file = getFile(mmd, FLUID_DOMAIN_DIR_PARTICLES, FLUID_FILENAME_PVELSND, pformat, framenr);
   expected += 1;
   if (BLI_exists(file.c_str())) {
     result += updateParticlesFromFile(file, true, true);
     assert(result == expected);
   }
 
-  file = getFile(mmd, FLUID_DOMAIN_DIR_PARTICLES, FLUID_DOMAIN_FILE_PLIFESND, pformat, framenr);
+  file = getFile(mmd, FLUID_DOMAIN_DIR_PARTICLES, FLUID_FILENAME_PLIFESND, pformat, framenr);
   expected += 1;
   if (BLI_exists(file.c_str())) {
     result += updateParticlesFromFile(file, true, false);
@@ -1051,6 +1066,26 @@ bool MANTA::updateParticleStructures(FluidModifierData *mmd, int framenr)
   return mParticlesFromFile = (result == expected);
 }
 
+static void assertGridItems(vector<MANTA::GridItem> gList)
+{
+  vector<MANTA::GridItem>::iterator gIter = gList.begin();
+  int *resPrev = (*gIter).res;
+
+  for (vector<MANTA::GridItem>::iterator it = gList.begin(); it != gList.end(); ++it) {
+    MANTA::GridItem item = *it;
+    assert(
+        ELEM(item.type, FLUID_DOMAIN_GRID_FLOAT, FLUID_DOMAIN_GRID_INT, FLUID_DOMAIN_GRID_VEC3F));
+    assert(item.pointer[0]);
+    if (item.type == FLUID_DOMAIN_GRID_VEC3F) {
+      assert(item.pointer[1] && item.pointer[2]);
+    }
+    assert(item.res[0] == resPrev[0] && item.res[1] == resPrev[1] && item.res[2] == resPrev[2]);
+    assert((item.name).compare("") != 0);
+  }
+
+  UNUSED_VARS(resPrev);
+}
+
 bool MANTA::updateSmokeStructures(FluidModifierData *mmd, int framenr)
 {
   if (MANTA::with_debug)
@@ -1065,80 +1100,106 @@ bool MANTA::updateSmokeStructures(FluidModifierData *mmd, int framenr)
     return false;
 
   int result = 0;
-  int expected = 0; /* Expected number of read successes for this frame. */
-
   string dformat = getCacheFileEnding(mds->cache_data_format);
-  string file = getFile(mmd, FLUID_DOMAIN_DIR_DATA, FLUID_DOMAIN_FILE_DENSITY, dformat, framenr);
-
-  expected += 1;
-  if (BLI_exists(file.c_str())) {
-    result += updateGridFromFile(file, mDensity, false);
-    assert(result == expected);
-  }
-
-  file = getFile(mmd, FLUID_DOMAIN_DIR_DATA, FLUID_DOMAIN_FILE_SHADOW, dformat, framenr);
-  expected += 1;
-  if (BLI_exists(file.c_str())) {
-    result += updateGridFromFile(file, mShadow, false);
-    assert(result == expected);
-  }
-
-  if (mUsingHeat) {
-    file = getFile(mmd, FLUID_DOMAIN_DIR_DATA, FLUID_DOMAIN_FILE_HEAT, dformat, framenr);
-    expected += 1;
-    if (BLI_exists(file.c_str())) {
-      result += updateGridFromFile(file, mHeat, false);
-      assert(result == expected);
-    }
-  }
 
-  if (mUsingColors) {
-    file = getFile(mmd, FLUID_DOMAIN_DIR_DATA, FLUID_DOMAIN_FILE_COLORR, dformat, framenr);
-    expected += 1;
-    if (BLI_exists(file.c_str())) {
-      result += updateGridFromFile(file, mColorR, false);
-      assert(result == expected);
+  vector<FileItem> filesData;
+  vector<GridItem> gridsData;
+
+  int res[] = {mResX, mResY, mResZ};
+
+  /* Put grid pointers into pointer lists, some grids have more than 1 pointer. */
+  void *aDensity[] = {mDensity};
+  void *aShadow[] = {mShadow};
+  void *aVelocities[] = {mVelocityX, mVelocityY, mVelocityZ};
+  void *aHeat[] = {mHeat};
+  void *aColorR[] = {mColorR};
+  void *aColorG[] = {mColorG};
+  void *aColorB[] = {mColorB};
+  void *aFlame[] = {mFlame};
+  void *aFuel[] = {mFuel};
+  void *aReact[] = {mReact};
+
+  /* File names for grids. */
+  string fDensity = getFile(mmd, FLUID_DOMAIN_DIR_DATA, FLUID_FILENAME_DENSITY, dformat, framenr);
+  string fShadow = getFile(mmd, FLUID_DOMAIN_DIR_DATA, FLUID_FILENAME_SHADOW, dformat, framenr);
+  string fVel = getFile(mmd, FLUID_DOMAIN_DIR_DATA, FLUID_FILENAME_VELOCITY, dformat, framenr);
+  string fHeat = getFile(mmd, FLUID_DOMAIN_DIR_DATA, FLUID_FILENAME_HEAT, dformat, framenr);
+  string fColorR = getFile(mmd, FLUID_DOMAIN_DIR_DATA, FLUID_FILENAME_COLORR, dformat, framenr);
+  string fColorG = getFile(mmd, FLUID_DOMAIN_DIR_DATA, FLUID_FILENAME_COLORG, dformat, framenr);
+  string fColorB = getFile(mmd, FLUID_DOMAIN_DIR_DATA, FLUID_FILENAME_COLORB, dformat, framenr);
+  string fFlame = getFile(mmd, FLUID_DOMAIN_DIR_DATA, FLUID_FILENAME_FLAME, dformat, framenr);
+  string fFuel = getFile(mmd, FLUID_DOMAIN_DIR_DATA, FLUID_FILENAME_FUEL, dformat, framenr);
+  string fReact = getFile(mmd, FLUID_DOMAIN_DIR_DATA, FLUID_FILENAME_REACT, dformat, framenr);
+  string fFluid = getFile(mmd, FLUID_DOMAIN_DIR_DATA, FLUID_FILENAME_DATA, dformat, framenr);
+
+  /* Prepare grid info containers. */
+  GridItem gDensity = {aDensity, FLUID_DOMAIN_GRID_FLOAT, res, FLUID_GRIDNAME_DENSITY};
+  GridItem gShadow = {aShadow, FLUID_DOMAIN_GRID_FLOAT, res, FLUID_GRIDNAME_SHADOW};
+  GridItem gVel = {aVelocities, FLUID_DOMAIN_GRID_VEC3F, res, FLUID_GRIDNAME_VELOCITY};
+  GridItem gHeat = {aHeat, FLUID_DOMAIN_GRID_FLOAT, res, FLUID_GRIDNAME_HEAT};
+  GridItem gColorR = {aColorR, FLUID_DOMAIN_GRID_FLOAT, res, FLUID_GRIDNAME_COLORR};
+  GridItem gColorG = {aColorG, FLUID_DOMAIN_GRID_FLOAT, res, FLUID_GRIDNAME_COLORG};
+  GridItem gColorB = {aColorB, FLUID_DOMAIN_GRID_FLOAT, res, FLUID_GRIDNAME_COLORB};
+  GridItem gFlame = {aFlame, FLUID_DOMAIN_GRID_FLOAT, res, FLUID_GRIDNAME_FLAME};
+  GridItem gFuel = {aFuel, FLUID_DOMAIN_GRID_FLOAT, res, FLUID_GRIDNAME_FUEL};
+  GridItem gReact = {aReact, FLUID_DOMAIN_GRID_FLOAT, res, FLUID_GRIDNAME_REACT};
+
+  /* TODO (sebbas): For now, only allow single file mode. Combined grid file export is todo. */
+  const int fileMode = FLUID_DOMAIN_CACHE_FILES_SINGLE;
+  if (fileMode == FLUID_DOMAIN_CACHE_FILES_SINGLE) {
+
+    filesData.push_back((FileItem){fDensity, {gDensity}});
+    filesData.push_back((FileItem){fShadow, {gShadow}});
+    filesData.push_back((FileItem){fVel, {gVel}});
+    if (mUsingHeat) {
+      filesData.push_back((FileItem){fHeat, {gHeat}});
     }
-
-    file = getFile(mmd, FLUID_DOMAIN_DIR_DATA, FLUID_DOMAIN_FILE_COLORG, dformat, framenr);
-    expected += 1;
-    if (BLI_exists(file.c_str())) {
-      result += updateGridFromFile(file, mColorG, false);
-      assert(result == expected);
+    if (mUsingColors) {
+      filesData.push_back((FileItem){fColorR, {gColorR}});
+      filesData.push_back((FileItem){fColorG, {gColorG}});
+      filesData.push_back((FileItem){fColorB, {gColorB}});
     }
-
-    file = getFile(mmd, FLUID_DOMAIN_DIR_DATA, FLUID_DOMAIN_FILE_COLORB, dformat, framenr);
-    expecte

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list