Skip to content
Snippets Groups Projects
Commit 53fd499d authored by Miika Hamalainen's avatar Miika Hamalainen
Browse files

Fix: smoke noise tile was saved in Blender executable directory, which is...

Fix: smoke noise tile was saved in Blender executable directory, which is often write protected on modern systems. 

This caused high resolution smoke to always regenerate new tile when domain was reinitialized, slowing down especially adaptive domain simulations. Now noise tile is saved in Blender temp directory instead.
parent 7759b274
No related branches found
No related tags found
No related merge requests found
...@@ -74,7 +74,7 @@ size_t smoke_get_index2d(int x, int max_x, int y); ...@@ -74,7 +74,7 @@ size_t smoke_get_index2d(int x, int max_x, int y);
void smoke_dissolve(struct FLUID_3D *fluid, int speed, int log); void smoke_dissolve(struct FLUID_3D *fluid, int speed, int log);
// wavelet turbulence functions // wavelet turbulence functions
struct WTURBULENCE *smoke_turbulence_init(int *res, int amplify, int noisetype, int use_fire, int use_colors); struct WTURBULENCE *smoke_turbulence_init(int *res, int amplify, int noisetype, const char *noisefile_path, int use_fire, int use_colors);
void smoke_turbulence_free(struct WTURBULENCE *wt); void smoke_turbulence_free(struct WTURBULENCE *wt);
void smoke_turbulence_step(struct WTURBULENCE *wt, struct FLUID_3D *fluid); void smoke_turbulence_step(struct WTURBULENCE *wt, struct FLUID_3D *fluid);
...@@ -89,7 +89,7 @@ float *smoke_turbulence_get_fuel(struct WTURBULENCE *wt); ...@@ -89,7 +89,7 @@ float *smoke_turbulence_get_fuel(struct WTURBULENCE *wt);
float *smoke_turbulence_get_react(struct WTURBULENCE *wt); float *smoke_turbulence_get_react(struct WTURBULENCE *wt);
void smoke_turbulence_get_res(struct WTURBULENCE *wt, int *res); void smoke_turbulence_get_res(struct WTURBULENCE *wt, int *res);
int smoke_turbulence_get_cells(struct WTURBULENCE *wt); int smoke_turbulence_get_cells(struct WTURBULENCE *wt);
void smoke_turbulence_set_noise(struct WTURBULENCE *wt, int type); void smoke_turbulence_set_noise(struct WTURBULENCE *wt, int type, const char *noisefile_path);
void smoke_initWaveletBlenderRNA(struct WTURBULENCE *wt, float *strength); void smoke_initWaveletBlenderRNA(struct WTURBULENCE *wt, float *strength);
void smoke_dissolve_wavelet(struct WTURBULENCE *wt, int speed, int log); void smoke_dissolve_wavelet(struct WTURBULENCE *wt, int speed, int log);
......
...@@ -51,7 +51,7 @@ static const float persistence = 0.56123f; ...@@ -51,7 +51,7 @@ static const float persistence = 0.56123f;
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
// constructor // constructor
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
WTURBULENCE::WTURBULENCE(int xResSm, int yResSm, int zResSm, int amplify, int noisetype, int init_fire, int init_colors) WTURBULENCE::WTURBULENCE(int xResSm, int yResSm, int zResSm, int amplify, int noisetype, const char *noisefile_path, int init_fire, int init_colors)
{ {
// if noise magnitude is below this threshold, its contribution // if noise magnitude is below this threshold, its contribution
// is negilgible, so stop evaluating new octaves // is negilgible, so stop evaluating new octaves
...@@ -131,15 +131,7 @@ WTURBULENCE::WTURBULENCE(int xResSm, int yResSm, int zResSm, int amplify, int no ...@@ -131,15 +131,7 @@ WTURBULENCE::WTURBULENCE(int xResSm, int yResSm, int zResSm, int amplify, int no
// noise tiles // noise tiles
_noiseTile = new float[noiseTileSize * noiseTileSize * noiseTileSize]; _noiseTile = new float[noiseTileSize * noiseTileSize * noiseTileSize];
/* setNoise(noisetype, noisefile_path);
std::string noiseTileFilename = std::string("noise.wavelets");
generateTile_WAVELET(_noiseTile, noiseTileFilename);
*/
setNoise(noisetype);
/*
std::string noiseTileFilename = std::string("noise.fft");
generatTile_FFT(_noiseTile, noiseTileFilename);
*/
} }
void WTURBULENCE::initFire() void WTURBULENCE::initFire()
...@@ -216,13 +208,13 @@ WTURBULENCE::~WTURBULENCE() { ...@@ -216,13 +208,13 @@ WTURBULENCE::~WTURBULENCE() {
// type (1<<1) = FFT / 4 // type (1<<1) = FFT / 4
// type (1<<2) = curl / 8 // type (1<<2) = curl / 8
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
void WTURBULENCE::setNoise(int type) void WTURBULENCE::setNoise(int type, const char *noisefile_path)
{ {
if(type == (1<<1)) // FFT if(type == (1<<1)) // FFT
{ {
#ifdef WITH_FFTW3 #ifdef WITH_FFTW3
// needs fft // needs fft
std::string noiseTileFilename = std::string("noise.fft"); std::string noiseTileFilename = std::string(noisefile_path) + std::string("noise.fft");
generatTile_FFT(_noiseTile, noiseTileFilename); generatTile_FFT(_noiseTile, noiseTileFilename);
return; return;
#else #else
...@@ -237,7 +229,7 @@ void WTURBULENCE::setNoise(int type) ...@@ -237,7 +229,7 @@ void WTURBULENCE::setNoise(int type)
} }
#endif #endif
std::string noiseTileFilename = std::string("noise.wavelets"); std::string noiseTileFilename = std::string(noisefile_path) + std::string("noise.wavelets");
generateTile_WAVELET(_noiseTile, noiseTileFilename); generateTile_WAVELET(_noiseTile, noiseTileFilename);
} }
......
...@@ -36,7 +36,7 @@ struct WTURBULENCE ...@@ -36,7 +36,7 @@ struct WTURBULENCE
{ {
public: public:
// both config files can be NULL, altCfg might override values from noiseCfg // both config files can be NULL, altCfg might override values from noiseCfg
WTURBULENCE(int xResSm, int yResSm, int zResSm, int amplify, int noisetype, int init_fire, int init_colors); WTURBULENCE(int xResSm, int yResSm, int zResSm, int amplify, int noisetype, const char *noisefile_path, int init_fire, int init_colors);
/// destructor /// destructor
virtual ~WTURBULENCE(); virtual ~WTURBULENCE();
...@@ -44,7 +44,7 @@ struct WTURBULENCE ...@@ -44,7 +44,7 @@ struct WTURBULENCE
void initFire(); void initFire();
void initColors(float init_r, float init_g, float init_b); void initColors(float init_r, float init_g, float init_b);
void setNoise(int type); void setNoise(int type, const char *noisefile_path);
void initBlenderRNA(float *strength); void initBlenderRNA(float *strength);
// step more readable version -- no rotation correction // step more readable version -- no rotation correction
......
...@@ -44,10 +44,10 @@ extern "C" FLUID_3D *smoke_init(int *res, float dx, float dtdef, int use_heat, i ...@@ -44,10 +44,10 @@ extern "C" FLUID_3D *smoke_init(int *res, float dx, float dtdef, int use_heat, i
return fluid; return fluid;
} }
extern "C" WTURBULENCE *smoke_turbulence_init(int *res, int amplify, int noisetype, int use_fire, int use_colors) extern "C" WTURBULENCE *smoke_turbulence_init(int *res, int amplify, int noisetype, const char *noisefile_path, int use_fire, int use_colors)
{ {
if (amplify) if (amplify)
return new WTURBULENCE(res[0],res[1],res[2], amplify, noisetype, use_fire, use_colors); return new WTURBULENCE(res[0],res[1],res[2], amplify, noisetype, noisefile_path, use_fire, use_colors);
else else
return NULL; return NULL;
} }
...@@ -436,9 +436,9 @@ extern "C" unsigned char *smoke_get_obstacle_anim(FLUID_3D *fluid) ...@@ -436,9 +436,9 @@ extern "C" unsigned char *smoke_get_obstacle_anim(FLUID_3D *fluid)
} }
#endif #endif
extern "C" void smoke_turbulence_set_noise(WTURBULENCE *wt, int type) extern "C" void smoke_turbulence_set_noise(WTURBULENCE *wt, int type, const char *noisefile_path)
{ {
wt->setNoise(type); wt->setNoise(type, noisefile_path);
} }
extern "C" void flame_get_spectrum(unsigned char *spec, int width, float t1, float t2) extern "C" void flame_get_spectrum(unsigned char *spec, int width, float t1, float t2)
......
...@@ -154,7 +154,7 @@ struct SmokeModifierData; ...@@ -154,7 +154,7 @@ struct SmokeModifierData;
#else /* WITH_SMOKE */ #else /* WITH_SMOKE */
/* Stubs to use when smoke is disabled */ /* Stubs to use when smoke is disabled */
struct WTURBULENCE *smoke_turbulence_init(int *UNUSED(res), int UNUSED(amplify), int UNUSED(noisetype), int UNUSED(use_fire), int UNUSED(use_colors)) { return NULL; } struct WTURBULENCE *smoke_turbulence_init(int *UNUSED(res), int UNUSED(amplify), int UNUSED(noisetype), const char *UNUSED(noisefile_path), int UNUSED(use_fire), int UNUSED(use_colors)) { return NULL; }
//struct FLUID_3D *smoke_init(int *UNUSED(res), float *UNUSED(dx), float *UNUSED(dtdef), int UNUSED(use_heat), int UNUSED(use_fire), int UNUSED(use_colors)) { return NULL; } //struct FLUID_3D *smoke_init(int *UNUSED(res), float *UNUSED(dx), float *UNUSED(dtdef), int UNUSED(use_heat), int UNUSED(use_fire), int UNUSED(use_colors)) { return NULL; }
void smoke_free(struct FLUID_3D *UNUSED(fluid)) {} void smoke_free(struct FLUID_3D *UNUSED(fluid)) {}
float *smoke_get_density(struct FLUID_3D *UNUSED(fluid)) { return NULL; } float *smoke_get_density(struct FLUID_3D *UNUSED(fluid)) { return NULL; }
...@@ -204,7 +204,7 @@ void smoke_reallocate_highres_fluid(SmokeDomainSettings *sds, float dx, int res[ ...@@ -204,7 +204,7 @@ void smoke_reallocate_highres_fluid(SmokeDomainSettings *sds, float dx, int res[
sds->wt = NULL; sds->wt = NULL;
return; return;
} }
sds->wt = smoke_turbulence_init(res, sds->amplify + 1, sds->noise, use_fire, use_colors); sds->wt = smoke_turbulence_init(res, sds->amplify + 1, sds->noise, BLI_temporary_dir(), use_fire, use_colors);
sds->res_wt[0] = res[0] * (sds->amplify + 1); sds->res_wt[0] = res[0] * (sds->amplify + 1);
sds->res_wt[1] = res[1] * (sds->amplify + 1); sds->res_wt[1] = res[1] * (sds->amplify + 1);
sds->res_wt[2] = res[2] * (sds->amplify + 1); sds->res_wt[2] = res[2] * (sds->amplify + 1);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment