[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