From 68221b7ebafe58a2bbf612ad8c59e24569489be5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Barschkis?= Date: Fri, 7 Feb 2020 19:37:44 +0100 Subject: 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. --- intern/mantaflow/intern/MANTA_main.cpp | 76 ++++++++++++++++++-------------- intern/mantaflow/intern/MANTA_main.h | 8 ++-- source/blender/blenkernel/intern/fluid.c | 10 ++++- 3 files changed, 56 insertions(+), 38 deletions(-) diff --git a/intern/mantaflow/intern/MANTA_main.cpp b/intern/mantaflow/intern/MANTA_main.cpp index 2cbf058d8de..cd496ac0c01 100644 --- a/intern/mantaflow/intern/MANTA_main.cpp +++ b/intern/mantaflow/intern/MANTA_main.cpp @@ -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, ×tamp, 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(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); diff --git a/intern/mantaflow/intern/MANTA_main.h b/intern/mantaflow/intern/MANTA_main.h index c1c2c042a73..105beaf6e20 100644 --- a/intern/mantaflow/intern/MANTA_main.h +++ b/intern/mantaflow/intern/MANTA_main.h @@ -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 diff --git a/source/blender/blenkernel/intern/fluid.c b/source/blender/blenkernel/intern/fluid.c index 8b959e30aff..ac6ed6b9949 100644 --- a/source/blender/blenkernel/intern/fluid.c +++ b/source/blender/blenkernel/intern/fluid.c @@ -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); -- cgit v1.2.3