Revision: 22457
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=22457
Author:   genscher
Date:     2009-08-14 19:39:27 +0200 (Fri, 14 Aug 2009)

Log Message:
-----------
Pointcache:
* prepare pointcache for smoke (smoke doesn't use it yet, commit follows later)

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/blenkernel/BKE_pointcache.h
    branches/blender2.5/blender/source/blender/blenkernel/intern/pointcache.c

Modified: branches/blender2.5/blender/source/blender/blenkernel/BKE_pointcache.h
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/BKE_pointcache.h      
2009-08-14 17:16:16 UTC (rev 22456)
+++ branches/blender2.5/blender/source/blender/blenkernel/BKE_pointcache.h      
2009-08-14 17:39:27 UTC (rev 22457)
@@ -57,9 +57,11 @@
 #define PTCACHE_FILE_WRITE     1
 
 /* PTCacheID types */
-#define PTCACHE_TYPE_SOFTBODY  0
-#define PTCACHE_TYPE_PARTICLES 1
-#define PTCACHE_TYPE_CLOTH             2
+#define PTCACHE_TYPE_SOFTBODY                  0
+#define PTCACHE_TYPE_PARTICLES                 1
+#define PTCACHE_TYPE_CLOTH                             2
+#define PTCACHE_TYPE_SMOKE_DOMAIN_LOW  3
+#define PTCACHE_TYPE_SMOKE_DOMAIN_HIGH 4
 
 /* PTCache read return code */
 #define PTCACHE_READ_EXACT                             1
@@ -112,8 +114,12 @@
 
        /* copies point data to cache data */
        int (*write_elem)(int index, void *calldata, void **data);
+       /* copies point data to cache data */
+       int (*write_stream)(PTCacheFile *pf, void *calldata);
        /* copies cache cata to point data */
        void (*read_elem)(int index, void *calldata, void **data, float 
frs_sec, float cfra, float *old_data);
+       /* copies cache cata to point data */
+       void (*read_stream)(PTCacheFile *pf, void *calldata);
        /* interpolated between previously read point data and cache data */
        void (*interpolate_elem)(int index, void *calldata, void **data, float 
frs_sec, float cfra, float cfra1, float cfra2, float *old_data);
 
@@ -151,6 +157,7 @@
 void BKE_ptcache_id_from_softbody(PTCacheID *pid, struct Object *ob, struct 
SoftBody *sb);
 void BKE_ptcache_id_from_particles(PTCacheID *pid, struct Object *ob, struct 
ParticleSystem *psys);
 void BKE_ptcache_id_from_cloth(PTCacheID *pid, struct Object *ob, struct 
ClothModifierData *clmd);
+void BKE_ptcache_id_from_smoke(PTCacheID *pid, struct Object *ob, struct 
SmokeModifierData *smd, int num);
 
 void BKE_ptcache_ids_from_object(struct ListBase *lb, struct Object *ob);
 

Modified: 
branches/blender2.5/blender/source/blender/blenkernel/intern/pointcache.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/pointcache.c   
2009-08-14 17:16:16 UTC (rev 22456)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/pointcache.c   
2009-08-14 17:39:27 UTC (rev 22457)
@@ -39,6 +39,7 @@
 #include "DNA_object_force.h"
 #include "DNA_particle_types.h"
 #include "DNA_scene_types.h"
+#include "DNA_smoke_types.h"
 
 #include "BLI_blenlib.h"
 
@@ -52,11 +53,14 @@
 #include "BKE_particle.h"
 #include "BKE_pointcache.h"
 #include "BKE_scene.h"
+#include "BKE_smoke.h"
 #include "BKE_softbody.h"
 #include "BKE_utildefines.h"
 
 #include "BLI_blenlib.h"
 
+#include "smoke_API.h"
+
 /* needed for directory lookup */
 #ifndef WIN32
   #include <dirent.h>
@@ -305,6 +309,7 @@
 
        return totwrite;
 }
+
 /* Cloth functions */
 static int ptcache_write_cloth(int index, void *cloth_v, void **data)
 {
@@ -376,6 +381,7 @@
        ClothModifierData *clmd= cloth_v;
        return clmd->clothObject->numverts;
 }
+
 /* Creating ID's */
 void BKE_ptcache_id_from_softbody(PTCacheID *pid, Object *ob, SoftBody *sb)
 {
@@ -394,6 +400,8 @@
        pid->totpoint= pid->totwrite= ptcache_totpoint_softbody;
 
        pid->write_elem= ptcache_write_softbody;
+       pid->write_stream = NULL;
+       pid->read_stream = NULL;
        pid->read_elem= ptcache_read_softbody;
        pid->interpolate_elem= ptcache_interpolate_softbody;
 
@@ -432,6 +440,8 @@
        pid->ptcaches= &psys->ptcaches;
 
        pid->write_elem= ptcache_write_particle;
+       pid->write_stream = NULL;
+       pid->read_stream = NULL;
        pid->read_elem= ptcache_read_particle;
        pid->interpolate_elem= ptcache_interpolate_particle;
 
@@ -459,6 +469,110 @@
        pid->info_types= (1<<BPHYS_DATA_TIMES);
 }
 
+/* Smoke functions */
+static int ptcache_totpoint_smoke(void *smoke_v)
+{
+       SmokeModifierData *smd= (SmokeModifierData *)smoke_v;
+       SmokeDomainSettings *sds = smd->domain;
+       
+       if(sds->fluid)
+       {
+               return sds->res[0]*sds->res[1]*sds->res[2];
+       }
+       else
+               return 0;
+}
+
+// forward decleration
+static int ptcache_file_write(PTCacheFile *pf, void *f, size_t tot, int size);
+
+static int ptcache_write_smoke(PTCacheFile *pf, void *smoke_v)
+{
+       SmokeModifierData *smd= (SmokeModifierData *)smoke_v;
+       SmokeDomainSettings *sds = smd->domain;
+       
+       if(sds->fluid)
+       {
+               size_t res = sds->res[0]*sds->res[1]*sds->res[2];
+               float *dens, *densold, *heat, *heatold, *vx, *vy, *vz;
+               
+               smoke_export(sds->fluid, &dens, &densold, &heat, &heatold, &vx, 
&vy, &vz);
+               
+               ptcache_file_write(pf, dens, res, sizeof(float));
+               ptcache_file_write(pf, densold, res, sizeof(float));
+               ptcache_file_write(pf, heat, res, sizeof(float));
+               ptcache_file_write(pf, heatold, res, sizeof(float));
+               ptcache_file_write(pf, vx, res, sizeof(float));
+               ptcache_file_write(pf, vy, res, sizeof(float));
+               ptcache_file_write(pf, vz, res, sizeof(float));
+               
+               return 1;
+       }
+
+       return 0;
+}
+
+// forward decleration
+static int ptcache_file_read(PTCacheFile *pf, void *f, size_t tot, int size);
+
+static void ptcache_read_smoke(PTCacheFile *pf, void *smoke_v)
+{
+       SmokeModifierData *smd= (SmokeModifierData *)smoke_v;
+       SmokeDomainSettings *sds = smd->domain;
+       
+       if(sds->fluid)
+       {
+               size_t res = sds->res[0]*sds->res[1]*sds->res[2];
+               float *dens, *densold, *heat, *heatold, *vx, *vy, *vz;
+               
+               smoke_export(sds->fluid, &dens, &densold, &heat, &heatold, &vx, 
&vy, &vz);
+
+               ptcache_file_read(pf, dens, res, sizeof(float));
+               ptcache_file_read(pf, densold, res, sizeof(float));
+               ptcache_file_read(pf, heat, res, sizeof(float));
+               ptcache_file_read(pf, heatold, res, sizeof(float));
+               ptcache_file_read(pf, vx, res, sizeof(float));
+               ptcache_file_read(pf, vy, res, sizeof(float));
+               ptcache_file_read(pf, vz, res, sizeof(float));
+               
+       }
+}
+void BKE_ptcache_id_from_smoke(PTCacheID *pid, struct Object *ob, struct 
SmokeModifierData *smd, int num)
+{
+       SmokeDomainSettings *sds = smd->domain;
+
+       memset(pid, 0, sizeof(PTCacheID));
+
+       pid->ob= ob;
+       pid->calldata= smd;
+       
+       // if(num == 0)
+       pid->type= PTCACHE_TYPE_SMOKE_DOMAIN_LOW;
+       // else if(num == 1)
+       //      pid->type= PTCACHE_TYPE_SMOKE_DOMAIN_HIGH;
+
+       pid->stack_index= modifiers_indexInObject(ob, (ModifierData *)smd);
+
+       pid->cache= sds->point_cache;
+       pid->cache_ptr= &sds->point_cache;
+       pid->ptcaches= &sds->ptcaches;
+
+       
+       pid->totpoint= pid->totwrite= ptcache_totpoint_smoke;
+
+       pid->write_elem= NULL;
+       pid->read_elem= NULL;
+       pid->read_stream = ptcache_read_smoke;
+       pid->write_stream = ptcache_write_smoke;
+       pid->interpolate_elem= NULL;
+
+       pid->write_header= ptcache_write_basic_header;
+       pid->read_header= ptcache_read_basic_header;
+
+       pid->data_types= (1<<BPHYS_DATA_LOCATION); // bogus values tot make 
pointcache happy
+       pid->info_types= 0;
+}
+
 void BKE_ptcache_id_from_cloth(PTCacheID *pid, Object *ob, ClothModifierData 
*clmd)
 {
        memset(pid, 0, sizeof(PTCacheID));
@@ -473,6 +587,8 @@
        pid->totpoint= pid->totwrite= ptcache_totpoint_cloth;
 
        pid->write_elem= ptcache_write_cloth;
+       pid->write_stream = NULL;
+       pid->read_stream = NULL;
        pid->read_elem= ptcache_read_cloth;
        pid->interpolate_elem= ptcache_interpolate_cloth;
 
@@ -515,6 +631,18 @@
                        BKE_ptcache_id_from_cloth(pid, ob, 
(ClothModifierData*)md);
                        BLI_addtail(lb, pid);
                }
+               /*
+               // enabled on next commit 
+               if(md->type == eModifierType_Smoke) {
+                       SmokeModifierData *smd = (SmokeModifierData *)md;
+                       if(smd->type & MOD_SMOKE_TYPE_DOMAIN)
+                       {
+                               pid= MEM_callocN(sizeof(PTCacheID), 
"PTCacheID");
+                               BKE_ptcache_id_from_smoke(pid, ob, 
(SmokeModifierData*)md, 0);
+                               BLI_addtail(lb, pid);
+                       }
+               }
+               */
        }
 }
 
@@ -533,7 +661,7 @@
 static int ptcache_path(PTCacheID *pid, char *filename)
 {
        Library *lib;
-       int i;
+       size_t i;
 
        lib= (pid)? pid->ob->id.lib: NULL;
 
@@ -591,7 +719,7 @@
                }
        }
        else {
-               int temp = strlen(pid->cache->name); 
+               int temp = (int)strlen(pid->cache->name); 
                strcpy(newname, pid->cache->name); 
                newname+=temp;
                len += temp;
@@ -653,11 +781,11 @@
        MEM_freeN(pf);
 }
 
-static int ptcache_file_read(PTCacheFile *pf, void *f, int tot, int size)
+static int ptcache_file_read(PTCacheFile *pf, void *f, size_t tot, int size)
 {
        return (fread(f, size, tot, pf->fp) == tot);
 }
-static int ptcache_file_write(PTCacheFile *pf, void *f, int tot, int size)
+static int ptcache_file_write(PTCacheFile *pf, void *f, size_t tot, int size)
 {
        return (fwrite(f, size, tot, pf->fp) == tot);
 }
@@ -988,56 +1116,93 @@
        if(cfra1 && cfra1==cfra2)
                error = 1;
 
+       if(!error) 
+       {
+               if(pf && pid->read_stream) {
+                       if(totpoint != pid->totpoint(pid->calldata))
+                               error = 1;
+                       else
+                       {
+                               // we have stream writing here
+                               pid->read_stream(pf, pid->calldata);
+                       }
+               }
+       }
+
        totpoint = MIN2(totpoint, pid->totpoint(pid->calldata));
-       totpoint2 = MIN2(totpoint2, pid->totpoint(pid->calldata));
 
-       if(!error) for(i=0; i<totpoint; i++) {
-               /* read old cache file format */
-               if(use_old) {
-                       if(ptcache_file_read(pf, (void*)old_data1, 1, 
old_elemsize))
-                               pid->read_elem(i, pid->calldata, NULL, frs_sec, 
cfra, old_data1);
-                       else
-                               { error = 1; break; }
+       if(!error) 
+       {       
+               for(i=0; i<totpoint; i++) {
+                       /* read old cache file format */
+                       if(use_old) {
+                               if(pid->read_elem && ptcache_file_read(pf, 
(void*)old_data1, 1, old_elemsize))
+                                       pid->read_elem(i, pid->calldata, NULL, 
frs_sec, cfra, old_data1);
+                               else
+                                       { error = 1; break; }
+                       }
+                       else {
+                               if(pid->read_elem && (pm || 
ptcache_file_read_data(pf)))
+                                       pid->read_elem(*index, pid->calldata, 
pm ? pm->cur : pf->cur, frs_sec, cfra1 ? (float)cfra1 : (float)cfrai, NULL);
+                               else
+                                       { error = 1; break; }
+                       }
+
+                       if(pm) {
+                               ptcache_mem_incr_pointers(pm);
+                               index = pm->data_types & (1<<BPHYS_DATA_INDEX) 
? pm->cur[BPHYS_DATA_INDEX] : &i;
+                       }
                }
-               else {
-                       if(pm || ptcache_file_read_data(pf))
-                               pid->read_elem(*index, pid->calldata, pm ? 
pm->cur : pf->cur, frs_sec, cfra1 ? (float)cfra1 : (float)cfrai, NULL);
+       }
+
+       if(!error) 
+       {
+               if(pf2 && pid->read_stream) {
+                       if(totpoint2 != pid->totpoint(pid->calldata))
+                               error = 1;
                        else
-                               { error = 1; break; }
+                       {
+                               // we have stream writing here
+                               pid->read_stream(pf2, pid->calldata);
+                       }
                }
-
-               if(pm) {
-                       ptcache_mem_incr_pointers(pm);
-                       index = pm->data_types & (1<<BPHYS_DATA_INDEX) ? 
pm->cur[BPHYS_DATA_INDEX] : &i;
-               }
        }
 
-       if(!error) for(i=0; i<totpoint2; i++) {
-               /* read old cache file format */
-               if(use_old) {
-                       if(ptcache_file_read(pf2, (void*)old_data2, 1, 
old_elemsize)) {

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to