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