[Bf-blender-cvs] [8ea0a8cbc68] fluid-mantaflow: fix for particle caching and also added more sanity checks in particle getters

Sebastián Barschkis noreply at git.blender.org
Sat Dec 2 16:19:00 CET 2017


Commit: 8ea0a8cbc689c7f572e7b86db1bf09511fd6fcdf
Author: Sebastián Barschkis
Date:   Fri Dec 1 16:35:12 2017 +0100
Branches: fluid-mantaflow
https://developer.blender.org/rB8ea0a8cbc689c7f572e7b86db1bf09511fd6fcdf

fix for particle caching and also added more sanity checks in particle getters

===================================================================

M	intern/mantaflow/intern/FLUID.h
M	source/blender/blenkernel/intern/pointcache.c

===================================================================

diff --git a/intern/mantaflow/intern/FLUID.h b/intern/mantaflow/intern/FLUID.h
index 0362a7f6aa6..7d6c2383fb3 100644
--- a/intern/mantaflow/intern/FLUID.h
+++ b/intern/mantaflow/intern/FLUID.h
@@ -174,31 +174,31 @@ public:
 	inline int getFlipParticleFlagAt(int i) { return (mFlipParticleData) ? ((std::vector<pData>*) mFlipParticleData)->at(i).flag : 0; }
 	inline int getSndParticleFlagAt(int i) { return (mSndParticleData) ? ((std::vector<pData>*) mSndParticleData)->at(i).flag : 0; }
 
-	inline float getFlipParticlePositionXAt(int i) { return (mFlipParticleData) ? mFlipParticleData->at(i).pos[0] : 0.f; }
-	inline float getFlipParticlePositionYAt(int i) { return (mFlipParticleData) ? mFlipParticleData->at(i).pos[1] : 0.f; }
-	inline float getFlipParticlePositionZAt(int i) { return (mFlipParticleData) ? mFlipParticleData->at(i).pos[2] : 0.f; }
+	inline float getFlipParticlePositionXAt(int i) { return (mFlipParticleData && !mFlipParticleData->empty()) ? mFlipParticleData->at(i).pos[0] : 0.f; }
+	inline float getFlipParticlePositionYAt(int i) { return (mFlipParticleData && !mFlipParticleData->empty()) ? mFlipParticleData->at(i).pos[1] : 0.f; }
+	inline float getFlipParticlePositionZAt(int i) { return (mFlipParticleData && !mFlipParticleData->empty()) ? mFlipParticleData->at(i).pos[2] : 0.f; }
 
-	inline float getSndParticlePositionXAt(int i) { return (mSndParticleData) ? mSndParticleData->at(i).pos[0] : 0.f; }
-	inline float getSndParticlePositionYAt(int i) { return (mSndParticleData) ? mSndParticleData->at(i).pos[1] : 0.f; }
-	inline float getSndParticlePositionZAt(int i) { return (mSndParticleData) ? mSndParticleData->at(i).pos[2] : 0.f; }
+	inline float getSndParticlePositionXAt(int i) { return (mSndParticleData && !mSndParticleData->empty()) ? mSndParticleData->at(i).pos[0] : 0.f; }
+	inline float getSndParticlePositionYAt(int i) { return (mSndParticleData && !mSndParticleData->empty()) ? mSndParticleData->at(i).pos[1] : 0.f; }
+	inline float getSndParticlePositionZAt(int i) { return (mSndParticleData && !mSndParticleData->empty()) ? mSndParticleData->at(i).pos[2] : 0.f; }
 
-	inline float getFlipParticleVelocityXAt(int i) { return (mFlipParticleVelocity) ? mFlipParticleVelocity->at(i).pos[0] : 0.f; }
-	inline float getFlipParticleVelocityYAt(int i) { return (mFlipParticleVelocity) ? mFlipParticleVelocity->at(i).pos[1] : 0.f; }
-	inline float getFlipParticleVelocityZAt(int i) { return (mFlipParticleVelocity) ? mFlipParticleVelocity->at(i).pos[2] : 0.f; }
+	inline float getFlipParticleVelocityXAt(int i) { return (mFlipParticleVelocity && !mFlipParticleVelocity->empty()) ? mFlipParticleVelocity->at(i).pos[0] : 0.f; }
+	inline float getFlipParticleVelocityYAt(int i) { return (mFlipParticleVelocity && !mFlipParticleVelocity->empty()) ? mFlipParticleVelocity->at(i).pos[1] : 0.f; }
+	inline float getFlipParticleVelocityZAt(int i) { return (mFlipParticleVelocity && !mFlipParticleVelocity->empty()) ? mFlipParticleVelocity->at(i).pos[2] : 0.f; }
 
-	inline float getSndParticleVelocityXAt(int i) { return (mSndParticleVelocity) ? mSndParticleVelocity->at(i).pos[0] : 0.f; }
-	inline float getSndParticleVelocityYAt(int i) { return (mSndParticleVelocity) ? mSndParticleVelocity->at(i).pos[1] : 0.f; }
-	inline float getSndParticleVelocityZAt(int i) { return (mSndParticleVelocity) ? mSndParticleVelocity->at(i).pos[2] : 0.f; }
+	inline float getSndParticleVelocityXAt(int i) { return (mSndParticleVelocity && !mSndParticleVelocity->empty()) ? mSndParticleVelocity->at(i).pos[0] : 0.f; }
+	inline float getSndParticleVelocityYAt(int i) { return (mSndParticleVelocity && !mSndParticleVelocity->empty()) ? mSndParticleVelocity->at(i).pos[1] : 0.f; }
+	inline float getSndParticleVelocityZAt(int i) { return (mSndParticleVelocity && !mSndParticleVelocity->empty()) ? mSndParticleVelocity->at(i).pos[2] : 0.f; }
 
-	inline float* getFlipParticleData() { return (mFlipParticleData) ? (float*) &mFlipParticleData->front() : NULL; }
-	inline float* getSndParticleData()  { return (mSndParticleData) ? (float*) &mSndParticleData->front() : NULL; }
+	inline float* getFlipParticleData() { return (mFlipParticleData && !mFlipParticleData->empty()) ? (float*) &mFlipParticleData->front() : NULL; }
+	inline float* getSndParticleData()  { return (mSndParticleData && !mSndParticleData->empty()) ? (float*) &mSndParticleData->front() : NULL; }
 
-	inline float* getFlipParticleVelocity() { return (mFlipParticleVelocity) ? (float*) &mFlipParticleVelocity->front() : NULL; }
-	inline float* getSndParticleVelocity()  { return (mSndParticleVelocity) ? (float*) &mSndParticleVelocity->front() : NULL; }
-	inline float* getSndParticleLife()      { return (mSndParticleLife) ? (float*) &mSndParticleLife->front() : NULL; }
+	inline float* getFlipParticleVelocity() { return (mFlipParticleVelocity && !mFlipParticleVelocity->empty()) ? (float*) &mFlipParticleVelocity->front() : NULL; }
+	inline float* getSndParticleVelocity()  { return (mSndParticleVelocity && !mSndParticleVelocity->empty()) ? (float*) &mSndParticleVelocity->front() : NULL; }
+	inline float* getSndParticleLife()      { return (mSndParticleLife && !mSndParticleLife->empty()) ? (float*) &mSndParticleLife->front() : NULL; }
 
-	inline int getNumFlipParticles() { return (mFlipParticleData) ? mFlipParticleData->size() : 0; }
-	inline int getNumSndParticles() { return (mSndParticleData) ? mSndParticleData->size() : 0; }
+	inline int getNumFlipParticles() { return (mFlipParticleData && !mFlipParticleData->empty()) ? mFlipParticleData->size() : 0; }
+	inline int getNumSndParticles() { return (mSndParticleData && !mSndParticleData->empty()) ? mSndParticleData->size() : 0; }
 
 	void updateMeshData(const char* filename);
 //	void updateParticleData(const char* filename);
diff --git a/source/blender/blenkernel/intern/pointcache.c b/source/blender/blenkernel/intern/pointcache.c
index 10e3bff8110..5199c27834e 100644
--- a/source/blender/blenkernel/intern/pointcache.c
+++ b/source/blender/blenkernel/intern/pointcache.c
@@ -650,13 +650,15 @@ static int ptcache_smoke_write(PTCacheFile *pf, void *smoke_v)
 		ptcache_file_write(pf, &sds->res_min, 3, sizeof(int));
 		ptcache_file_write(pf, &sds->res_max, 3, sizeof(int));
 		ptcache_file_write(pf, &sds->active_color, 3, sizeof(float));
-		if (pp && numParts) {
+
+		if (pp) {
 			MEM_freeN(out);
 			out = (unsigned char *)MEM_callocN(numParts*sizeof(float)*3 + numParts*sizeof(int), "pointcache_lzo_buffer");
 			ptcache_file_compressed_write(pf, (unsigned char *) pp, numParts*sizeof(float)*3 + numParts*sizeof(int), out, mode);
 			ptcache_file_compressed_write(pf, (unsigned char *) pvel, numParts*sizeof(float)*3, out, mode);
 		}
-		if (ppSnd && numPartsSnd) {
+
+		if (ppSnd) {
 			MEM_freeN(out);
 			out = (unsigned char *)MEM_callocN(numPartsSnd*sizeof(float)*3 + numPartsSnd*sizeof(int), "pointcache_lzo_buffer");
 			ptcache_file_compressed_write(pf, (unsigned char *) ppSnd, numPartsSnd*sizeof(float)*3 + numPartsSnd*sizeof(int), out, mode);
@@ -874,7 +876,6 @@ static int ptcache_smoke_read(PTCacheFile *pf, void *smoke_v)
 		int *obstacles, numParts = 0, numPartsSnd = 0;
 		unsigned int out_len = (unsigned int)res * sizeof(float);
 		unsigned char *buffer;
-		int readPP = 0, readPPSnd = 0; // Set if successfully read pp / ppSnd size
 
 		smoke_export(sds->fluid, &dt, &dx, &dens, &react, &flame, &fuel, &heat, &vx, &vy, &vz, &r, &g, &b, &obstacles);
 		liquid_export(sds->fluid, &phi, &pp, &pvel, &ppSnd, &pvelSnd, &plifeSnd);
@@ -902,8 +903,8 @@ static int ptcache_smoke_read(PTCacheFile *pf, void *smoke_v)
 		ptcache_file_compressed_read(pf, (unsigned char *)obstacles, (unsigned int)res);
 		if (phi) {
 			ptcache_file_compressed_read(pf, (unsigned char *)phi, out_len);
-			readPP = ptcache_file_read(pf, &numParts, 1, sizeof(int));
-			readPPSnd = ptcache_file_read(pf, &numPartsSnd, 1, sizeof(int));
+			ptcache_file_read(pf, &numParts, 1, sizeof(int));
+			ptcache_file_read(pf, &numPartsSnd, 1, sizeof(int));
 		}
 		ptcache_file_read(pf, &dt, 1, sizeof(float));
 		ptcache_file_read(pf, &dx, 1, sizeof(float));
@@ -917,7 +918,8 @@ static int ptcache_smoke_read(PTCacheFile *pf, void *smoke_v)
 		ptcache_file_read(pf, &sds->res_min, 3, sizeof(int));
 		ptcache_file_read(pf, &sds->res_max, 3, sizeof(int));
 		ptcache_file_read(pf, &sds->active_color, 3, sizeof(float));
-		if (readPP) { // cannot use pp in this if since pp vector is still empty
+
+		if (numParts) {
 			buffer = (unsigned char *)MEM_callocN(numParts*sizeof(float)*3 + numParts*sizeof(int), "pointcache_lzo_buffer");
 
 			ptcache_file_compressed_read(pf, (unsigned char *)buffer, numParts*sizeof(float)*3 + numParts*sizeof(int));
@@ -927,8 +929,7 @@ static int ptcache_smoke_read(PTCacheFile *pf, void *smoke_v)
 			liquid_set_flip_particle_velocity(sds->fluid, (float *) buffer, numParts);
 			MEM_freeN(buffer);
 		}
-
-		if (readPPSnd) { // cannot use ppSnd in this if since pp vector is still empty
+		if (numPartsSnd) {
 			buffer = (unsigned char *)MEM_callocN(numPartsSnd*sizeof(float)*3 + numPartsSnd*sizeof(int), "pointcache_lo_buffer");
 
 			ptcache_file_compressed_read(pf, (unsigned char *)buffer, numPartsSnd*sizeof(float)*3 + numPartsSnd*sizeof(int));



More information about the Bf-blender-cvs mailing list