[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