Fluid: Fixed cache reading issue with larger resolution noise grids

Important fix that needs to go into the release. The upscaled noise cache was not read into upscaled grids.
This commit is contained in:
Sebastián Barschkis
2020-02-07 19:37:44 +01:00
parent ffcccf654c
commit 68221b7eba
3 changed files with 56 additions and 38 deletions

View File

@@ -1204,7 +1204,7 @@ int MANTA::updateSmokeStructures(FluidModifierData *mmd, int framenr)
if (!BLI_exists(targetFile)) {
return 0;
}
result += updateGridFromFile(targetFile, mDensity);
result += updateGridFromFile(targetFile, mDensity, false);
expected += 1;
ss.str("");
@@ -1214,7 +1214,7 @@ int MANTA::updateSmokeStructures(FluidModifierData *mmd, int framenr)
if (!BLI_exists(targetFile)) {
return 0;
}
result += updateGridFromFile(targetFile, mShadow);
result += updateGridFromFile(targetFile, mShadow, false);
if (mUsingHeat) {
expected += 1;
@@ -1225,7 +1225,7 @@ int MANTA::updateSmokeStructures(FluidModifierData *mmd, int framenr)
if (!BLI_exists(targetFile)) {
return 0;
}
result += updateGridFromFile(targetFile, mHeat);
result += updateGridFromFile(targetFile, mHeat, false);
}
if (mUsingColors) {
@@ -1237,7 +1237,7 @@ int MANTA::updateSmokeStructures(FluidModifierData *mmd, int framenr)
if (!BLI_exists(targetFile)) {
return 0;
}
result += updateGridFromFile(targetFile, mColorR);
result += updateGridFromFile(targetFile, mColorR, false);
ss.str("");
ss << "color_g_####" << dformat;
@@ -1246,7 +1246,7 @@ int MANTA::updateSmokeStructures(FluidModifierData *mmd, int framenr)
if (!BLI_exists(targetFile)) {
return 0;
}
result += updateGridFromFile(targetFile, mColorG);
result += updateGridFromFile(targetFile, mColorG, false);
ss.str("");
ss << "color_b_####" << dformat;
@@ -1255,7 +1255,7 @@ int MANTA::updateSmokeStructures(FluidModifierData *mmd, int framenr)
if (!BLI_exists(targetFile)) {
return 0;
}
result += updateGridFromFile(targetFile, mColorB);
result += updateGridFromFile(targetFile, mColorB, false);
}
if (mUsingFire) {
@@ -1267,7 +1267,7 @@ int MANTA::updateSmokeStructures(FluidModifierData *mmd, int framenr)
if (!BLI_exists(targetFile)) {
return 0;
}
result += updateGridFromFile(targetFile, mFlame);
result += updateGridFromFile(targetFile, mFlame, false);
ss.str("");
ss << "fuel_####" << dformat;
@@ -1276,7 +1276,7 @@ int MANTA::updateSmokeStructures(FluidModifierData *mmd, int framenr)
if (!BLI_exists(targetFile)) {
return 0;
}
result += updateGridFromFile(targetFile, mFuel);
result += updateGridFromFile(targetFile, mFuel, false);
ss.str("");
ss << "react_####" << dformat;
@@ -1285,7 +1285,7 @@ int MANTA::updateSmokeStructures(FluidModifierData *mmd, int framenr)
if (!BLI_exists(targetFile)) {
return 0;
}
result += updateGridFromFile(targetFile, mReact);
result += updateGridFromFile(targetFile, mReact, false);
}
mSmokeFromFile = true;
@@ -1334,7 +1334,7 @@ int MANTA::updateNoiseStructures(FluidModifierData *mmd, int framenr)
if (!BLI_exists(targetFile)) {
return 0;
}
result += updateGridFromFile(targetFile, mDensityHigh);
result += updateGridFromFile(targetFile, mDensityHigh, true);
expected += 1;
ss.str("");
@@ -1344,7 +1344,7 @@ int MANTA::updateNoiseStructures(FluidModifierData *mmd, int framenr)
if (!BLI_exists(targetFile)) {
return 0;
}
result += updateGridFromFile(targetFile, mShadow);
result += updateGridFromFile(targetFile, mShadow, false);
if (mUsingColors) {
expected += 3;
@@ -1355,7 +1355,7 @@ int MANTA::updateNoiseStructures(FluidModifierData *mmd, int framenr)
if (!BLI_exists(targetFile)) {
return 0;
}
result += updateGridFromFile(targetFile, mColorRHigh);
result += updateGridFromFile(targetFile, mColorRHigh, true);
ss.str("");
ss << "color_g_noise_####" << nformat;
@@ -1364,7 +1364,7 @@ int MANTA::updateNoiseStructures(FluidModifierData *mmd, int framenr)
if (!BLI_exists(targetFile)) {
return 0;
}
result += updateGridFromFile(targetFile, mColorGHigh);
result += updateGridFromFile(targetFile, mColorGHigh, true);
ss.str("");
ss << "color_b_noise_####" << nformat;
@@ -1373,7 +1373,7 @@ int MANTA::updateNoiseStructures(FluidModifierData *mmd, int framenr)
if (!BLI_exists(targetFile)) {
return 0;
}
result += updateGridFromFile(targetFile, mColorBHigh);
result += updateGridFromFile(targetFile, mColorBHigh, true);
}
if (mUsingFire) {
@@ -1385,7 +1385,7 @@ int MANTA::updateNoiseStructures(FluidModifierData *mmd, int framenr)
if (!BLI_exists(targetFile)) {
return 0;
}
result += updateGridFromFile(targetFile, mFlameHigh);
result += updateGridFromFile(targetFile, mFlameHigh, true);
ss.str("");
ss << "fuel_noise_####" << nformat;
@@ -1394,7 +1394,7 @@ int MANTA::updateNoiseStructures(FluidModifierData *mmd, int framenr)
if (!BLI_exists(targetFile)) {
return 0;
}
result += updateGridFromFile(targetFile, mFuelHigh);
result += updateGridFromFile(targetFile, mFuelHigh, true);
ss.str("");
ss << "react_noise_####" << nformat;
@@ -1403,7 +1403,7 @@ int MANTA::updateNoiseStructures(FluidModifierData *mmd, int framenr)
if (!BLI_exists(targetFile)) {
return 0;
}
result += updateGridFromFile(targetFile, mReactHigh);
result += updateGridFromFile(targetFile, mReactHigh, true);
}
mNoiseFromFile = true;
@@ -2778,7 +2778,7 @@ void MANTA::updateParticlesFromUni(const char *filename, bool isSecondarySys, bo
gzclose(gzf);
}
int MANTA::updateGridFromFile(const char *filename, float *grid)
int MANTA::updateGridFromFile(const char *filename, float *grid, bool isNoise)
{
if (with_debug)
std::cout << "MANTA::updateGridFromFile()" << std::endl;
@@ -2797,13 +2797,13 @@ int MANTA::updateGridFromFile(const char *filename, float *grid)
std::string extension = fname.substr(idx + 1);
if (extension.compare("uni") == 0)
return updateGridFromUni(filename, grid);
#ifdef WITH_OPENVDB
return updateGridFromUni(filename, grid, isNoise);
#if OPENVDB == 1
else if (extension.compare("vdb") == 0)
return updateGridFromVDB(filename, grid);
return updateGridFromVDB(filename, grid, isNoise);
#endif
else if (extension.compare("raw") == 0)
return updateGridFromRaw(filename, grid);
return updateGridFromRaw(filename, grid, isNoise);
else
std::cerr << "MANTA::updateGridFromFile(): invalid file extension in file: " << filename
<< std::endl;
@@ -2815,7 +2815,7 @@ int MANTA::updateGridFromFile(const char *filename, float *grid)
}
}
int MANTA::updateGridFromUni(const char *filename, float *grid)
int MANTA::updateGridFromUni(const char *filename, float *grid, bool isNoise)
{
if (with_debug)
std::cout << "MANTA::updateGridFromUni()" << std::endl;
@@ -2863,13 +2863,17 @@ int MANTA::updateGridFromUni(const char *filename, float *grid)
gzread(gzf, &dimT, sizeof(int));
gzread(gzf, &timestamp, sizeof(unsigned long long));
int resX = (isNoise) ? mResXNoise : mResX;
int resY = (isNoise) ? mResYNoise : mResY;
int resZ = (isNoise) ? mResZNoise : mResZ;
if (with_debug)
std::cout << "read " << ibuffer[3] << " grid type in file: " << filename << std::endl;
// Sanity checks
if (ibuffer[0] != mResX || ibuffer[1] != mResY || ibuffer[2] != mResZ) {
if (ibuffer[0] != resX || ibuffer[1] != resY || ibuffer[2] != resZ) {
std::cout << "grid dim doesn't match, read: (" << ibuffer[0] << ", " << ibuffer[1] << ", "
<< ibuffer[2] << ") vs setup: (" << mResX << ", " << mResY << ", " << mResZ << ")"
<< ibuffer[2] << ") vs setup: (" << resX << ", " << resY << ", " << resZ << ")"
<< std::endl;
return 0;
}
@@ -2886,8 +2890,8 @@ int MANTA::updateGridFromUni(const char *filename, float *grid)
return 1;
}
#ifdef WITH_OPENVDB
int MANTA::updateGridFromVDB(const char *filename, float *grid)
#if OPENVDB == 1
int MANTA::updateGridFromVDB(const char *filename, float *grid, bool isNoise)
{
if (with_debug)
std::cout << "MANTA::updateGridFromVDB()" << std::endl;
@@ -2913,10 +2917,14 @@ int MANTA::updateGridFromVDB(const char *filename, float *grid)
openvdb::FloatGrid::Ptr gridVDB = openvdb::gridPtrCast<openvdb::FloatGrid>(baseGrid);
openvdb::FloatGrid::Accessor accessor = gridVDB->getAccessor();
int resX = (isNoise) ? mResXNoise : mResX;
int resY = (isNoise) ? mResYNoise : mResY;
int resZ = (isNoise) ? mResZNoise : mResZ;
size_t index = 0;
for (int z = 0; z < mResZ; ++z) {
for (int y = 0; y < mResY; ++y) {
for (int x = 0; x < mResX; ++x, ++index) {
for (int z = 0; z < resZ; ++z) {
for (int y = 0; y < resY; ++y) {
for (int x = 0; x < resX; ++x, ++index) {
openvdb::Coord xyz(x, y, z);
float v = accessor.getValue(xyz);
grid[index] = v;
@@ -2927,7 +2935,7 @@ int MANTA::updateGridFromVDB(const char *filename, float *grid)
}
#endif
int MANTA::updateGridFromRaw(const char *filename, float *grid)
int MANTA::updateGridFromRaw(const char *filename, float *grid, bool isNoise)
{
if (with_debug)
std::cout << "MANTA::updateGridFromRaw()" << std::endl;
@@ -2941,7 +2949,11 @@ int MANTA::updateGridFromRaw(const char *filename, float *grid)
return 0;
}
expectedBytes = sizeof(float) * mResX * mResY * mResZ;
int resX = (isNoise) ? mResXNoise : mResX;
int resY = (isNoise) ? mResYNoise : mResY;
int resZ = (isNoise) ? mResZNoise : mResZ;
expectedBytes = sizeof(float) * resX * resY * resZ;
readBytes = gzread(gzf, grid, expectedBytes);
assert(expectedBytes == readBytes);

View File

@@ -856,12 +856,12 @@ struct MANTA {
void updateMeshFromObj(const char *filename);
void updateMeshFromUni(const char *filename);
void updateParticlesFromUni(const char *filename, bool isSecondarySys, bool isVelData);
int updateGridFromUni(const char *filename, float *grid);
int updateGridFromVDB(const char *filename, float *grid);
int updateGridFromRaw(const char *filename, float *grid);
int updateGridFromUni(const char *filename, float *grid, bool isNoise);
int updateGridFromVDB(const char *filename, float *grid, bool isNoise);
int updateGridFromRaw(const char *filename, float *grid, bool isNoise);
void updateMeshFromFile(const char *filename);
void updateParticlesFromFile(const char *filename, bool isSecondarySys, bool isVelData);
int updateGridFromFile(const char *filename, float *grid);
int updateGridFromFile(const char *filename, float *grid, bool isNoise);
};
#endif

View File

@@ -3526,8 +3526,8 @@ static void BKE_fluid_modifier_processDomain(FluidModifierData *mmd,
}
}
if (!baking_data && !baking_noise && !mode_replay) {
/* There is no need to call manta_update_smoke_structures() here.
* The noise cache has already been read with manta_update_noise_structures(). */
/* TODO (sebbas): Confirm if this read call is really needed or not. */
has_data = manta_update_smoke_structures(mds->fluid, mmd, data_frame);
}
else {
has_data = manta_read_data(mds->fluid, mmd, data_frame);
@@ -4448,9 +4448,15 @@ void BKE_fluid_modifier_create_type_data(struct FluidModifierData *mmd)
mmd->domain->cache_flag = 0;
mmd->domain->cache_type = FLUID_DOMAIN_CACHE_MODULAR;
mmd->domain->cache_mesh_format = FLUID_DOMAIN_FILE_BIN_OBJECT;
#ifdef WITH_OPENVDB
mmd->domain->cache_data_format = FLUID_DOMAIN_FILE_OPENVDB;
mmd->domain->cache_particle_format = FLUID_DOMAIN_FILE_OPENVDB;
mmd->domain->cache_noise_format = FLUID_DOMAIN_FILE_OPENVDB;
#else
mmd->domain->cache_data_format = FLUID_DOMAIN_FILE_UNI;
mmd->domain->cache_particle_format = FLUID_DOMAIN_FILE_UNI;
mmd->domain->cache_noise_format = FLUID_DOMAIN_FILE_UNI;
#endif
modifier_path_init(mmd->domain->cache_directory,
sizeof(mmd->domain->cache_directory),
FLUID_DOMAIN_DIR_DEFAULT);