[Bf-blender-cvs] [2f96dbd] soc-2014-fluid: invoking BKE_cache_write when read from cached files successful; handling wavelet
Roman Pogribnyi
noreply at git.blender.org
Wed Aug 13 22:31:12 CEST 2014
Commit: 2f96dbd3fc5e4d30b568f9278bf58ed42cecafe9
Author: Roman Pogribnyi
Date: Tue Aug 12 22:42:23 2014 +0200
Branches: soc-2014-fluid
https://developer.blender.org/rB2f96dbd3fc5e4d30b568f9278bf58ed42cecafe9
invoking BKE_cache_write when read from cached files successful; handling wavelet
===================================================================
M intern/smoke/extern/smoke_API.h
M intern/smoke/intern/MANTA.cpp
M intern/smoke/intern/MANTA.h
M intern/smoke/intern/smoke_API.cpp
M source/blender/blenkernel/intern/smoke.c
===================================================================
diff --git a/intern/smoke/extern/smoke_API.h b/intern/smoke/extern/smoke_API.h
index 7ef01cf..f49c144 100644
--- a/intern/smoke/extern/smoke_API.h
+++ b/intern/smoke/extern/smoke_API.h
@@ -114,7 +114,7 @@ void smoke_ensure_fire(struct FLUID_3D *fluid, struct WTURBULENCE *wt);
void smoke_ensure_colors(struct FLUID_3D *fluid, struct WTURBULENCE *wt, float init_r, float init_g, float init_b);
/*Mantaflow functions*/
-int smoke_mantaflow_read(struct FLUID_3D *fluid, char* name); //1:success, 0: no file,error
+int smoke_mantaflow_read(struct SmokeDomainSettings *sds, char* name, bool with_wavelets); //1:success, 0: no file,error
void smoke_mantaflow_write_scene_file(struct Scene *s, struct SmokeModifierData *smd);
void smoke_mantaflow_sim_step(struct Scene *scene, struct SmokeModifierData *smd);
void smoke_mantaflow_stop_sim();
diff --git a/intern/smoke/intern/MANTA.cpp b/intern/smoke/intern/MANTA.cpp
index 9248086..4312f4e 100644
--- a/intern/smoke/intern/MANTA.cpp
+++ b/intern/smoke/intern/MANTA.cpp
@@ -1,5 +1,5 @@
#include "MANTA.h"
-
+#include "WTURBULENCE.h"
//#include "../../../source/blender/blenlib/BLI_fileops.h"
//#include "../../../source/blender/python/manta_pp/pwrapper/pymain.cpp"
@@ -15,7 +15,18 @@ extern "C" bool manta_check_grid_size(struct FLUID_3D *fluid, int dimX, int dimY
return true;
}
-extern "C" int read_mantaflow_sim(struct FLUID_3D *fluid, char *name)
+extern "C" bool manta_check_wavelets_size(struct WTURBULENCE *wt, int dimX, int dimY, int dimZ)
+{
+ if (!(dimX == wt->_xResBig && dimY == wt->_yResBig && dimZ == wt->_zResBig)) {
+ for (int cnt(0); cnt < wt->_totalCellsBig; cnt++)
+ wt->_densityBig[cnt] = 0.0f;
+ return false;
+ }
+ return true;
+}
+
+//PR need SMD data here for wavelets
+extern "C" int read_mantaflow_sim(struct SmokeDomainSettings *sds, char *name, bool reading_wavelets)
{
/*! legacy headers for reading old files */
typedef struct {
@@ -39,40 +50,63 @@ extern "C" int read_mantaflow_sim(struct FLUID_3D *fluid, char *name)
# if NO_ZLIB!=1
gzFile gzf = gzopen(name, "rb");
if (!gzf) {
- for (int cnt(0); cnt < fluid->_totalCells; cnt++)
- fluid->_density[cnt] = 0.0f;
+ if(reading_wavelets){
+ for (int cnt(0); cnt < sds->wt->_totalCellsBig; cnt++)
+ sds->wt->_densityBig[cnt] = 0.0f;
+ }
+ else{
+ for (int cnt(0); cnt < sds->fluid->_totalCells; cnt++)
+ sds->fluid->_density[cnt] = 0.0f;
+ }
return 0;
}
char ID[5] = {0,0,0,0,0};
gzread(gzf, ID, 4);
-
/* legacy file format */
if (!strcmp(ID, "DDF2")) {
UniLegacyHeader head;
gzread(gzf, &head, sizeof(UniLegacyHeader));
- if (!manta_check_grid_size(fluid, head.dimX, head.dimY, head.dimZ)) return 0;
int numEl = head.dimX*head.dimY*head.dimZ;
gzseek(gzf, numEl, SEEK_CUR);
/* actual grid read */
- gzread(gzf, fluid->_density, sizeof(float)*numEl);
- }
+ if ( ! reading_wavelets){
+ if (!manta_check_grid_size(sds->fluid, head.dimX, head.dimY, head.dimZ)) return 0;
+ gzread(gzf, sds->fluid->_density, sizeof(float)*numEl);
+ }
+ else {
+ if (!manta_check_wavelets_size(sds->wt, head.dimX, head.dimY, head.dimZ)) return 0;
+ gzread(gzf, sds->wt->_densityBig, sizeof(float)*numEl);
+ }
+ }
/* legacy file format 2 */
else if (!strcmp(ID, "MNT1")) {
UniLegacyHeader2 head;
gzread(gzf, &head, sizeof(UniLegacyHeader2));
- if (!manta_check_grid_size(fluid, head.dimX, head.dimY, head.dimZ)) return 0;
- /* actual grid read*/
- gzread(gzf, fluid->_density, sizeof(float)*head.dimX*head.dimY*head.dimZ);
- }
+ /* actual grid read*/
+ if ( ! reading_wavelets){
+ if (!manta_check_grid_size(sds->fluid, head.dimX, head.dimY, head.dimZ)) return 0;
+ gzread(gzf, sds->fluid->_density, sizeof(float)*head.dimX*head.dimY*head.dimZ);
+ }
+ else{
+ if (!manta_check_wavelets_size(sds->wt, head.dimX, head.dimY, head.dimZ)) return 0;
+ gzread(gzf, sds->wt->_densityBig, sizeof(float)*head.dimX*head.dimY*head.dimZ);
+ }
+ }
/* current file format*/
else if (!strcmp(ID, "MNT2")) {
UniHeader head;
gzread(gzf, &head, sizeof(UniHeader));
- if (!manta_check_grid_size(fluid, head.dimX, head.dimY, head.dimZ)) return 0;
/* actual grid read */
- gzread(gzf,fluid->_density, sizeof(float)*head.dimX*head.dimY*head.dimZ);
- }
+ if ( ! reading_wavelets){
+ if (!manta_check_grid_size(sds->fluid, head.dimX, head.dimY, head.dimZ)) return 0;
+ gzread(gzf,sds->fluid->_density, sizeof(float)*head.dimX*head.dimY*head.dimZ);
+ }
+ else{
+ if (!manta_check_wavelets_size(sds->wt, head.dimX, head.dimY, head.dimZ)) return 0;
+ gzread(gzf,sds->wt->_densityBig, sizeof(float)*head.dimX*head.dimY*head.dimZ);
+ }
+ }
gzclose(gzf);
return 1;
# endif /*zlib*/
@@ -446,6 +480,7 @@ void generate_manta_sim_file(Scene *scene, SmokeModifierData *smd)
ss << " advectSemiLagrange(flags=xl_flags, vel=xl_vel, grid=xl_density, order=2) \n";
ss << " if (applyInflow): \n";
ss << " densityInflowMesh( flags=xl_flags, density=xl_density, noise=xl_noise, mesh=xl_source, scale=1, sigma=0.5 ) \n";
+ ss << " xl_density.save('densityXl_%04d.uni' % t)\n";
//ss << " densityInflow( flags=xl_flags, density=xl_density, noise=xl_noise, shape=xl_source, scale=1, sigma=0.5 ) \n";
// ss << " xl.step() \n";
}
diff --git a/intern/smoke/intern/MANTA.h b/intern/smoke/intern/MANTA.h
index a04916d..a70b449 100644
--- a/intern/smoke/intern/MANTA.h
+++ b/intern/smoke/intern/MANTA.h
@@ -29,7 +29,7 @@ void runMantaScript(vector<string>& args);//defined in manta_pp/pwrapper/pymain.
extern "C" bool manta_check_grid_size(struct FLUID_3D *fluid, int dimX, int dimY, int dimZ);
-extern "C" int read_mantaflow_sim(struct FLUID_3D *fluid, char *name);
+extern "C" int read_mantaflow_sim(struct SmokeDomainSettings *sds, char *name, bool read_wavelets);
void indent_ss(stringstream& ss, int indent);
diff --git a/intern/smoke/intern/smoke_API.cpp b/intern/smoke/intern/smoke_API.cpp
index 7eb2150..5cce068 100644
--- a/intern/smoke/intern/smoke_API.cpp
+++ b/intern/smoke/intern/smoke_API.cpp
@@ -501,9 +501,9 @@ extern "C" void smoke_ensure_colors(FLUID_3D *fluid, WTURBULENCE *wt, float init
}
/*MantaFlow funcs*/
-extern "C" int smoke_mantaflow_read(struct FLUID_3D *fluid, char* name)
+extern "C" int smoke_mantaflow_read(struct SmokeDomainSettings *sds, char* name, bool with_wavelets)
{
- return read_mantaflow_sim(fluid, name);
+ return read_mantaflow_sim(sds, name, with_wavelets);
}
extern "C" void smoke_mantaflow_write_scene_file(struct Scene *s, struct SmokeModifierData *smd)
diff --git a/source/blender/blenkernel/intern/smoke.c b/source/blender/blenkernel/intern/smoke.c
index 512de1b..46c8263 100644
--- a/source/blender/blenkernel/intern/smoke.c
+++ b/source/blender/blenkernel/intern/smoke.c
@@ -2769,12 +2769,23 @@ static void smokeModifier_process(SmokeModifierData *smd, Scene *scene, Object *
if(smd->domain->flags & MOD_SMOKE_USE_MANTA) /*load manta sim data into fluid object*/
{
+ const char *density_name_format = "./den%04d.uni";
+ const char *wavelets_name_format = "./densityXL_%04d.uni";
char buff[100];
if(smd->domain->manta_start_frame > scene->r.cfra)
return;
- sprintf(buff, "./den%04d.uni", scene->r.cfra - smd->domain->manta_start_frame);
- if (smoke_mantaflow_read(smd->domain->fluid, buff))
- { BKE_ptcache_write(&pid, framenr);
+ sprintf(buff, density_name_format, scene->r.cfra - smd->domain->manta_start_frame);
+ bool read_density = smoke_mantaflow_read(smd->domain, buff, 0);
+ bool read_wavelets = 1;
+ if (smd->domain->flags & MOD_SMOKE_HIGHRES)
+ {
+ /*highdres*/
+ sprintf(buff, wavelets_name_format, scene->r.cfra - smd->domain->manta_start_frame);
+ read_wavelets = smoke_mantaflow_read(smd->domain, buff, 1);
+ }
+ if(read_density && read_wavelets)
+ {
+ BKE_ptcache_write(&pid, framenr);
}
}
More information about the Bf-blender-cvs
mailing list