[Bf-blender-cvs] [501aae3] alembic_pointcache: Keep a permanent cache reader instance in the point cache modifier and handle explicit mode switching between reading/writing.
Lukas Tönne
noreply at git.blender.org
Tue Nov 11 18:19:26 CET 2014
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;
+ }
+}
More information about the Bf-blender-cvs
mailing list