Commit: 72311c6357e07e7bb4dc137c6706d9f510a5bce8
Author: Sebastián Barschkis
Date:   Sat Jul 1 13:59:38 2017 +0200
Branches: fluid-mantaflow
https://developer.blender.org/rB72311c6357e07e7bb4dc137c6706d9f510a5bce8

more improvements for particle caching with pointcache

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

M       intern/mantaflow/extern/manta_fluid_API.h
M       intern/mantaflow/intern/FLUID.cpp
M       intern/mantaflow/intern/FLUID.h
M       intern/mantaflow/intern/manta_fluid_API.cpp
M       source/blender/blenkernel/intern/pointcache.c
M       source/blender/blenkernel/intern/smoke.c

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

diff --git a/intern/mantaflow/extern/manta_fluid_API.h 
b/intern/mantaflow/extern/manta_fluid_API.h
index 96ef02c9b0d..29f749bdc25 100644
--- a/intern/mantaflow/extern/manta_fluid_API.h
+++ b/intern/mantaflow/extern/manta_fluid_API.h
@@ -44,7 +44,7 @@ void smoke_manta_export(struct FLUID* smoke, struct 
SmokeModifierData *smd);
 void smoke_step(struct FLUID *smoke, int framenr);
 void smoke_dissolve(struct FLUID *smoke, int speed, int log);
 void smoke_dissolve_wavelet(struct FLUID *smoke, int speed, int log);
-void smoke_export(struct FLUID *smoke, float *dt, float *dx, float **dens, 
float **react, float **flame, float **fuel, float **heat, float **vx, float 
**vy, float **vz, float **r, float **g, float **b, int **obstacles, float 
**phi, float **pp, float **pvel, int *numParts);
+void smoke_export(struct FLUID *smoke, float *dt, float *dx, float **dens, 
float **react, float **flame, float **fuel, float **heat, float **vx, float 
**vy, float **vz, float **r, float **g, float **b, int **obstacles, float 
**phi, float **pp, float **pvel);
 void smoke_turbulence_export(struct FLUID *smoke, float **dens, float **react, 
float **flame, float **fuel, float **r, float **g, float **b , float **tcu, 
float **tcv, float **tcw, float **tcu2, float **tcv2, float **tcw2);
 float *smoke_get_density(struct FLUID *smoke);
 float *smoke_get_fuel(struct FLUID *smoke);
diff --git a/intern/mantaflow/intern/FLUID.cpp 
b/intern/mantaflow/intern/FLUID.cpp
index 8a9c5503f7c..956407c36c3 100644
--- a/intern/mantaflow/intern/FLUID.cpp
+++ b/intern/mantaflow/intern/FLUID.cpp
@@ -1083,8 +1083,8 @@ void FLUID::updatePointers()
                mPhiOut = (float*) getDataPointer("phiOut" + solver_ext, 
solver);
                mPhi    = (float*) getDataPointer("phi" + solver_ext, solver);
 
-               mParticleData      = (float*) getDataPointer("ppSnd" + 
solver_ext, solver);
-               mParticleVelocity  = (float*) getDataPointer("pVelSnd" + 
parts_ext, parts);
+               mParticleData     = (std::vector<pData>*) 
getDataPointer("ppSnd" + solver_ext, solver);
+               mParticleVelocity = (std::vector<pVel>*) 
getDataPointer("pVelSnd" + parts_ext, parts);
        }
        
        // Smoke
@@ -1148,36 +1148,29 @@ void FLUID::updatePointersHigh()
        }
 }
 
-// TODO (sebbas): Using struct in vectors would be nicer
-//void FLUID::setParticleData(float* buffer, int numParts)
-//{
-//     ((std::vector<FLUID::pData>*) 
mParticleData)->resize(numParts*sizeof(FLUID::pData));
-//     FLUID::pData* bufferPData = (FLUID::pData*) buffer;
-//     for (int i = 0; i < numParts; ++i)
-//             ((std::vector<FLUID::pData>*) 
mParticleData)->push_back(bufferPData[i]);
-//
-//}
-//
-//void FLUID::setParticleVelocity(float* buffer, int numParts)
-//{
-//     ((std::vector<FLUID::pVel>*) 
mParticleVelocity)->resize(numParts*sizeof(FLUID::pVel));
-//     FLUID::pVel* bufferPVel = (FLUID::pVel*) buffer;
-//     for (int i = 0; i < numParts; ++i)
-//             ((std::vector<FLUID::pVel>*) 
mParticleVelocity)->push_back(bufferPVel[i]);
-//}
-
 void FLUID::setParticleData(float* buffer, int numParts)
 {
-       ((std::vector<float>*) mParticleData)->resize(numParts*3);
-       for (int i = 0; i < numParts*3; ++i)
-               ((std::vector<float>*) mParticleData)->push_back(buffer[i]);
+       mParticleData->resize(numParts);
+       FLUID::pData* bufferPData = (FLUID::pData*) buffer;
+       for (std::vector<pData>::iterator it = mParticleData->begin(); it != 
mParticleData->end(); ++it) {
+               it->pos[0] = bufferPData->pos[0];
+               it->pos[1] = bufferPData->pos[1];
+               it->pos[2] = bufferPData->pos[2];
+               it->flag = bufferPData->flag;
+               bufferPData++;
+       }
 }
 
 void FLUID::setParticleVelocity(float* buffer, int numParts)
 {
-       ((std::vector<float>*) mParticleVelocity)->resize(numParts*3);
-       for (int i = 0; i < numParts*3; ++i)
-               ((std::vector<float>*) mParticleVelocity)->push_back(buffer[i]);
+       mParticleVelocity->resize(numParts);
+       FLUID::pVel* bufferPVel = (FLUID::pVel*) buffer;
+       for (std::vector<pVel>::iterator it = mParticleVelocity->begin(); it != 
mParticleVelocity->end(); ++it) {
+               it->pos[0] = bufferPVel->pos[0];
+               it->pos[1] = bufferPVel->pos[1];
+               it->pos[2] = bufferPVel->pos[2];
+               bufferPVel++;
+       }
 }
 
 void FLUID::saveMesh(char *filename)
diff --git a/intern/mantaflow/intern/FLUID.h b/intern/mantaflow/intern/FLUID.h
index 934c433f7c8..02f2a6a1d6a 100644
--- a/intern/mantaflow/intern/FLUID.h
+++ b/intern/mantaflow/intern/FLUID.h
@@ -166,8 +166,8 @@ public:
        inline float getParticleVelocityYAt(int i) { return (mParticleVelocity) 
? ((std::vector<pVel>*) mParticleVelocity)->at(i).pos[1] : 0.f; }
        inline float getParticleVelocityZAt(int i) { return (mParticleVelocity) 
? ((std::vector<pVel>*) mParticleVelocity)->at(i).pos[2] : 0.f; }
 
-       inline float* getParticleData()     { return mParticleData; }
-       inline float* getParticleVelocity() { return mParticleVelocity; }
+       inline float* getParticleData()     { return (float*) 
&mParticleData->front(); }
+       inline float* getParticleVelocity() { return (float*) 
&mParticleVelocity->front(); }
 
        void updateMeshData(const char* filename);
 //     void updateParticleData(const char* filename);
@@ -257,8 +257,8 @@ private:
        std::vector<int> mTrianglesZ;
        
        // Particle fields
-       float* mParticleData;
-       float* mParticleVelocity;
+       std::vector<pData>* mParticleData;
+       std::vector<pVel>* mParticleVelocity;
 
        void initDomain(struct SmokeModifierData *smd);
        void initDomainHigh(struct SmokeModifierData *smd);
diff --git a/intern/mantaflow/intern/manta_fluid_API.cpp 
b/intern/mantaflow/intern/manta_fluid_API.cpp
index d59cea908bc..0effdcadc57 100644
--- a/intern/mantaflow/intern/manta_fluid_API.cpp
+++ b/intern/mantaflow/intern/manta_fluid_API.cpp
@@ -134,7 +134,7 @@ extern "C" void smoke_dissolve_wavelet(FLUID *smoke, int 
speed, int log)
 }
 
 extern "C" void smoke_export(FLUID *smoke, float *dt, float *dx, float **dens, 
float **react, float **flame, float **fuel, float **heat, 
-                                                        float **vx, float 
**vy, float **vz, float **r, float **g, float **b, int **obstacle, float **phi, 
float **pp, float **pvel, int *numParts)
+                                                        float **vx, float 
**vy, float **vz, float **r, float **g, float **b, int **obstacle, float **phi, 
float **pp, float **pvel)
 {
        *dens = smoke->getDensity();
        if (fuel)
@@ -161,8 +161,6 @@ extern "C" void smoke_export(FLUID *smoke, float *dt, float 
*dx, float **dens, f
                *phi = smoke->getPhi();
        if (pp)
                *pp = smoke->getParticleData();
-       if (numParts)
-               *numParts = smoke->getNumParticles();
        if (pvel)
                *pvel = smoke->getParticleVelocity();
 }
diff --git a/source/blender/blenkernel/intern/pointcache.c 
b/source/blender/blenkernel/intern/pointcache.c
index b979e85ec89..53e0543b0b2 100644
--- a/source/blender/blenkernel/intern/pointcache.c
+++ b/source/blender/blenkernel/intern/pointcache.c
@@ -606,7 +606,8 @@ static int ptcache_smoke_write(PTCacheFile *pf, void 
*smoke_v)
                int mode=1;             // light
                if (sds->cache_comp == SM_CACHE_HEAVY) mode=2;  // heavy
 
-               smoke_export(sds->fluid, &dt, &dx, &dens, &react, &flame, 
&fuel, &heat, &vx, &vy, &vz, &r, &g, &b, &obstacles, &phi, &pp, &pvel, 
&numParts);
+               smoke_export(sds->fluid, &dt, &dx, &dens, &react, &flame, 
&fuel, &heat, &vx, &vy, &vz, &r, &g, &b, &obstacles, &phi, &pp, &pvel);
+               numParts = liquid_get_num_particles(sds->fluid);
 
                if (dens) {
                        ptcache_file_compressed_write(pf, (unsigned char 
*)sds->shadow, in_len, out, mode);
@@ -632,9 +633,6 @@ static int ptcache_smoke_write(PTCacheFile *pf, void 
*smoke_v)
                if (phi) {
                        ptcache_file_compressed_write(pf, (unsigned char *)phi, 
in_len, out, mode);
                }
-               if (phi) {
-                       ptcache_file_compressed_write(pf, (unsigned char *)phi, 
in_len, out, mode);
-               }
                ptcache_file_write(pf, &dt, 1, sizeof(float));
                ptcache_file_write(pf, &dx, 1, sizeof(float));
                ptcache_file_write(pf, &sds->p0, 3, sizeof(float));
@@ -643,10 +641,11 @@ static int ptcache_smoke_write(PTCacheFile *pf, void 
*smoke_v)
                ptcache_file_write(pf, &sds->shift, 3, sizeof(int));
                ptcache_file_write(pf, &sds->obj_shift_f, 3, sizeof(float));
                ptcache_file_write(pf, &sds->obmat, 16, sizeof(float));
-//             ptcache_file_write(pf, &sds->base_res, 3, sizeof(int));
+               ptcache_file_write(pf, &sds->base_res, 3, sizeof(int));
                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));
+               ptcache_file_write(pf, &numParts, 1, sizeof(int));
                if (pp && numParts) {
                        MEM_freeN(out);
                        printf("write numParts is %d\n", numParts);
@@ -741,7 +740,7 @@ static int ptcache_smoke_read_old(PTCacheFile *pf, void 
*smoke_v)
                sds->active_color[2] = 0.7f;
                
                // TODO (sebbas): add support for liquid caching
-               smoke_export(sds->fluid, &dt, &dx, &dens, NULL, NULL, NULL, 
&heat, &vx, &vy, &vz, NULL, NULL, NULL, &obstacles, NULL, NULL, NULL, NULL);
+               smoke_export(sds->fluid, &dt, &dx, &dens, NULL, NULL, NULL, 
&heat, &vx, &vy, &vz, NULL, NULL, NULL, &obstacles, NULL, NULL, NULL);
 
                ptcache_file_compressed_read(pf, (unsigned char *)sds->shadow, 
out_len);
                ptcache_file_compressed_read(pf, (unsigned char*)dens, out_len);
@@ -861,11 +860,11 @@ static int ptcache_smoke_read(PTCacheFile *pf, void 
*smoke_v)
        
        if (sds->fluid) {
                size_t res = sds->res[0]*sds->res[1]*sds->res[2];
-               float dt, dx, *dens, *react, *fuel, *flame, *heat, *vx, *vy, 
*vz, *r, *g, *b, *phi, *pp, *pvel;
+               float dt, dx, *dens, *react, *fuel, *flame, *heat, *vx, *vy, 
*vz, *r, *g, *b, *phi;
                int *obstacles, numParts;
                unsigned int out_len = (unsigned int)res * sizeof(float);
                
-               smoke_export(sds->fluid, &dt, &dx, &dens, &react, &flame, 
&fuel, &heat, &vx, &vy, &vz, &r, &g, &b, &obstacles, &phi, &pp, &pvel, 
&numParts);
+               smoke_export(sds->fluid, &dt, &dx, &dens, &react, &flame, 
&fuel, &heat, &vx, &vy, &vz, &r, &g, &b, &obstacles, &phi, NULL, NULL);
 
                if (dens) {
                        ptcache_file_compressed_read(pf, (unsigned char 
*)sds->shadow, out_len);
@@ -899,12 +898,12 @@ static int ptcache_smoke_read(PTCacheFile *pf, void 
*smoke_v)
                ptcache_file_read(pf, &sds->shift, 3, sizeof(int));
                ptcache_file_read(pf, &sds->obj_shift_f, 3, sizeof(float));
                ptcache_file_read(pf, &sds->obmat, 16, sizeof(float));
-//             ptcache_file_read(pf, &sds->base_res, 3, sizeof(int));
+               ptcache_file_read(pf, &sds->base_res, 3, sizeof(int));
                ptcache_file_read(pf, &sds->res

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to