Commit: 501aae3aefbaf248e9ff50a8d22dfceae1282eb5
Author: Lukas Tönne
Date:   Tue Nov 11 09:41:41 2014 +0100
Branches: alembic_pointcache
https://developer.blender.org/rB501aae3aefbaf248e9ff50a8d22dfceae1282eb5

Keep a permanent cache reader instance in the point cache modifier and
handle explicit mode switching between reading/writing.

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

M       source/blender/blenloader/intern/readfile.c
M       source/blender/editors/physics/physics_pointcache.c
M       source/blender/makesdna/DNA_modifier_types.h
M       source/blender/modifiers/intern/MOD_pointcache.c
M       source/blender/pointcache/PTC_api.h
M       source/blender/pointcache/intern/mesh.cpp

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

diff --git a/source/blender/blenloader/intern/readfile.c 
b/source/blender/blenloader/intern/readfile.c
index cba190f..83d79ad 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -4794,6 +4794,8 @@ static void direct_link_modifiers(FileData *fd, ListBase 
*lb)
                        PointCacheModifierData *pcmd = (PointCacheModifierData 
*)md;
 
                        pcmd->point_cache = newdataadr(fd, pcmd->point_cache);
+                       pcmd->reader = NULL;
+                       pcmd->writer = NULL;
                }
        }
 }
diff --git a/source/blender/editors/physics/physics_pointcache.c 
b/source/blender/editors/physics/physics_pointcache.c
index f9b6135..56dc089 100644
--- a/source/blender/editors/physics/physics_pointcache.c
+++ b/source/blender/editors/physics/physics_pointcache.c
@@ -127,10 +127,10 @@ static void ptcache_export_endjob(void *customdata)
        
        /* free the cache writer (closes output file) */
        if (RNA_struct_is_a(data->user_ptr.type, &RNA_PointCacheModifier)) {
+               Object *ob = (Object *)data->user_ptr.id.data;
                PointCacheModifierData *pcmd = (PointCacheModifierData 
*)data->user_ptr.data;
                
-               PTC_writer_free(pcmd->writer);
-               pcmd->writer = NULL;
+               PTC_mod_point_cache_set_mode(scene, ob, pcmd, 
MOD_POINTCACHE_MODE_NONE);
        }
        else {
                PTC_writer_free(data->writer);
@@ -165,7 +165,7 @@ static int ptcache_export_exec(bContext *C, wmOperator *op)
                Object *ob = (Object *)user_ptr.id.data;
                PointCacheModifierData *pcmd = (PointCacheModifierData 
*)user_ptr.data;
                
-               pcmd->writer = PTC_writer_point_cache(scene, ob, pcmd);
+               PTC_mod_point_cache_set_mode(scene, ob, pcmd, 
MOD_POINTCACHE_MODE_WRITE);
        }
        else {
                writer = PTC_writer_from_rna(scene, &user_ptr);
diff --git a/source/blender/makesdna/DNA_modifier_types.h 
b/source/blender/makesdna/DNA_modifier_types.h
index 72e24e3..5ab82f8 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -1376,6 +1376,7 @@ typedef struct PointCacheModifierData {
        
        struct PointCache *point_cache;
        
+       struct PTCReader *reader;
        struct PTCWriter *writer;
        struct DerivedMesh *output_dm;
 } PointCacheModifierData;
diff --git a/source/blender/modifiers/intern/MOD_pointcache.c 
b/source/blender/modifiers/intern/MOD_pointcache.c
index d8576ee..1b7ba00 100644
--- a/source/blender/modifiers/intern/MOD_pointcache.c
+++ b/source/blender/modifiers/intern/MOD_pointcache.c
@@ -74,20 +74,13 @@ static void copyData(ModifierData *md, ModifierData *target)
 static void freeData(ModifierData *md)
 {
        PointCacheModifierData *pcmd = (PointCacheModifierData *)md;
-       BKE_ptcache_free(pcmd->point_cache);
-}
-
-typedef enum ePointCacheModifierMode {
-       MOD_POINTCACHE_READ,
-       MOD_POINTCACHE_WRITE,
-} ePointCacheModifierMode;
-
-static ePointCacheModifierMode getMode(PointCacheModifierData *pcmd)
-{
+       
+       if (pcmd->reader)
+               PTC_reader_free(pcmd->reader);
        if (pcmd->writer)
-               return MOD_POINTCACHE_WRITE;
-       else
-               return MOD_POINTCACHE_READ;
+               PTC_writer_free(pcmd->writer);
+       
+       BKE_ptcache_free(pcmd->point_cache);
 }
 
 static bool dependsOnTime(ModifierData *md)
@@ -96,37 +89,35 @@ static bool dependsOnTime(ModifierData *md)
        
        /* considered time-dependent when reading from cache file */
        /* TODO check cache frame range here to optimize */
-       return getMode(pcmd) == MOD_POINTCACHE_READ;
+       return PTC_mod_point_cache_get_mode(pcmd) == MOD_POINTCACHE_MODE_READ;
 }
 
 static DerivedMesh *pointcache_do(PointCacheModifierData *pcmd, Object *ob, 
DerivedMesh *dm)
 {
        Scene *scene = pcmd->modifier.scene;
        const float cfra = BKE_scene_frame_get(scene);
-       const ePointCacheModifierMode mode = getMode(pcmd);
+       ePointCacheModifierMode mode = PTC_mod_point_cache_get_mode(pcmd);
        
        DerivedMesh *finaldm = dm;
-
-       if (mode == MOD_POINTCACHE_WRITE) {
-               BLI_assert(pcmd->writer != NULL);
-               
+       
+       if (mode == MOD_POINTCACHE_MODE_NONE) {
+               mode = PTC_mod_point_cache_set_mode(scene, ob, pcmd, 
MOD_POINTCACHE_MODE_READ);
+       }
+       
+       if (mode == MOD_POINTCACHE_MODE_WRITE) {
                pcmd->output_dm = dm;
                PTC_write_sample(pcmd->writer);
                pcmd->output_dm = NULL;
        }
-       else if (mode == MOD_POINTCACHE_READ) {
-               struct PTCReader *reader = PTC_reader_point_cache(scene, ob, 
pcmd);
-               
-               if (PTC_read_sample(reader, cfra) == PTC_READ_SAMPLE_INVALID) {
+       else if (mode == MOD_POINTCACHE_MODE_READ) {
+               if (PTC_read_sample(pcmd->reader, cfra) == 
PTC_READ_SAMPLE_INVALID) {
                        modifier_setError(&pcmd->modifier, "%s", "Cannot read 
cache file");
                }
                else {
-                       DerivedMesh *result = 
PTC_reader_point_cache_acquire_result(reader);
+                       DerivedMesh *result = 
PTC_reader_point_cache_acquire_result(pcmd->reader);
                        if (result)
                                finaldm = result;
                }
-               
-               PTC_reader_free(reader);
        }
        
        return finaldm;
diff --git a/source/blender/pointcache/PTC_api.h 
b/source/blender/pointcache/PTC_api.h
index 217474c..21848d2 100644
--- a/source/blender/pointcache/PTC_api.h
+++ b/source/blender/pointcache/PTC_api.h
@@ -90,10 +90,19 @@ struct PTCWriter *PTC_writer_dynamicpaint(struct Scene 
*scene, struct Object *ob
 struct PTCReader *PTC_reader_dynamicpaint(struct Scene *scene, struct Object 
*ob, struct DynamicPaintSurface *surface);
 
 /* Modifier Stack */
+typedef enum ePointCacheModifierMode {
+       MOD_POINTCACHE_MODE_NONE,
+       MOD_POINTCACHE_MODE_READ,
+       MOD_POINTCACHE_MODE_WRITE,
+} ePointCacheModifierMode;
+
 struct PTCWriter *PTC_writer_point_cache(struct Scene *scene, struct Object 
*ob, struct PointCacheModifierData *pcmd);
 struct PTCReader *PTC_reader_point_cache(struct Scene *scene, struct Object 
*ob, struct PointCacheModifierData *pcmd);
 struct DerivedMesh *PTC_reader_point_cache_acquire_result(struct PTCReader 
*reader);
 void PTC_reader_point_cache_discard_result(struct PTCReader *reader);
+ePointCacheModifierMode PTC_mod_point_cache_get_mode(struct 
PointCacheModifierData *pcmd);
+/* returns the actual new mode, in case a change didn't succeed */
+ePointCacheModifierMode PTC_mod_point_cache_set_mode(struct Scene *scene, 
struct Object *ob, struct PointCacheModifierData *pcmd, ePointCacheModifierMode 
mode);
 
 #ifdef __cplusplus
 } /* extern C */
diff --git a/source/blender/pointcache/intern/mesh.cpp 
b/source/blender/pointcache/intern/mesh.cpp
index fac53c1..30b90b9 100644
--- a/source/blender/pointcache/intern/mesh.cpp
+++ b/source/blender/pointcache/intern/mesh.cpp
@@ -249,3 +249,54 @@ void PTC_reader_point_cache_discard_result(PTCReader 
*_reader)
        PTC::PointCacheReader *reader = (PTC::PointCacheReader *)_reader;
        reader->discard_result();
 }
+
+ePointCacheModifierMode PTC_mod_point_cache_get_mode(PointCacheModifierData 
*pcmd)
+{
+       /* can't have simultaneous read and write */
+       if (pcmd->writer) {
+               BLI_assert(!pcmd->reader);
+               return MOD_POINTCACHE_MODE_WRITE;
+       }
+       else if (pcmd->reader) {
+               BLI_assert(!pcmd->writer);
+               return MOD_POINTCACHE_MODE_READ;
+       }
+       else
+               return MOD_POINTCACHE_MODE_NONE;
+}
+
+ePointCacheModifierMode PTC_mod_point_cache_set_mode(Scene *scene, Object *ob, 
PointCacheModifierData *pcmd, ePointCacheModifierMode mode)
+{
+       switch (mode) {
+               case MOD_POINTCACHE_MODE_READ:
+                       if (pcmd->writer) {
+                               PTC_writer_free(pcmd->writer);
+                               pcmd->writer = NULL;
+                       }
+                       if (!pcmd->reader) {
+                               pcmd->reader = PTC_reader_point_cache(scene, 
ob, pcmd);
+                       }
+                       return pcmd->reader ? MOD_POINTCACHE_MODE_READ : 
MOD_POINTCACHE_MODE_NONE;
+               
+               case MOD_POINTCACHE_MODE_WRITE:
+                       if (pcmd->reader) {
+                               PTC_reader_free(pcmd->reader);
+                               pcmd->reader = NULL;
+                       }
+                       if (!pcmd->writer) {
+                               pcmd->writer = PTC_writer_point_cache(scene, 
ob, pcmd);
+                       }
+                       return pcmd->writer ? MOD_POINTCACHE_MODE_WRITE : 
MOD_POINTCACHE_MODE_NONE;
+               
+               default:
+                       if (pcmd->writer) {
+                               PTC_writer_free(pcmd->writer);
+                               pcmd->writer = NULL;
+                       }
+                       if (pcmd->reader) {
+                               PTC_reader_free(pcmd->reader);
+                               pcmd->reader = NULL;
+                       }
+                       return MOD_POINTCACHE_MODE_NONE;
+       }
+}

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

Reply via email to