[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