[Bf-blender-cvs] [05e93c0] alembic_pointcache: Importing of caches into Blender data.

Lukas Tönne noreply at git.blender.org
Wed Feb 25 16:25:57 CET 2015


Commit: 05e93c0b7fee50220753759c25597c9b07c97ecb
Author: Lukas Tönne
Date:   Wed Feb 25 16:24:22 2015 +0100
Branches: alembic_pointcache
https://developer.blender.org/rB05e93c0b7fee50220753759c25597c9b07c97ecb

Importing of caches into Blender data.

Currently only implemented for DerivedMesh.
This replaces the `final_dm` calculation of the modifier stack with the
result from cache loading.

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

M	source/blender/blenkernel/BKE_cache_library.h
M	source/blender/blenkernel/intern/DerivedMesh.c
M	source/blender/blenkernel/intern/cache_library.c
M	source/blender/editors/io/io_cache_library.c
M	source/blender/pointcache/PTC_api.cpp
M	source/blender/pointcache/PTC_api.h
M	source/blender/pointcache/alembic/abc_cloth.cpp
M	source/blender/pointcache/alembic/abc_cloth.h
M	source/blender/pointcache/alembic/abc_particles.cpp
M	source/blender/pointcache/alembic/abc_particles.h
M	source/blender/pointcache/intern/alembic.h
M	source/blender/pointcache/intern/reader.h

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

diff --git a/source/blender/blenkernel/BKE_cache_library.h b/source/blender/blenkernel/BKE_cache_library.h
index c68fe6a..467780e 100644
--- a/source/blender/blenkernel/BKE_cache_library.h
+++ b/source/blender/blenkernel/BKE_cache_library.h
@@ -37,6 +37,7 @@
 struct ListBase;
 struct Main;
 struct Object;
+struct Scene;
 
 struct CacheLibrary *BKE_cache_library_add(struct Main *bmain, const char *name);
 struct CacheLibrary *BKE_cache_library_copy(struct CacheLibrary *cachelib);
@@ -84,4 +85,6 @@ void BKE_cache_library_clear(struct CacheLibrary *cachelib);
 
 void BKE_cache_library_group_update(struct Main *bmain, struct CacheLibrary *cachelib);
 
+bool BKE_cache_read_derived_mesh(struct Main *bmain, struct Scene *scene, float frame, struct Object *ob, struct DerivedMesh **r_dm);
+
 #endif
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c
index 07a5fc2..a8ceaab 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -49,6 +49,7 @@
 #include "BLI_utildefines.h"
 #include "BLI_linklist.h"
 
+#include "BKE_cache_library.h"
 #include "BKE_cdderivedmesh.h"
 #include "BKE_editmesh.h"
 #include "BKE_key.h"
@@ -1474,8 +1475,8 @@ static ModifierData *mesh_find_start_modifier(Scene *scene, Object *ob, VirtualM
 	
 	ModifierData *md;
 	
-	for (md = ob->modifiers.last; md; md = md->prev) {
 #if 0
+	for (md = ob->modifiers.last; md; md = md->prev) {
 		if (md->type == eModifierType_PointCache) {
 			PointCacheModifierData *pcmd = (PointCacheModifierData *)md;
 			struct PTCReader *reader;
@@ -1495,10 +1496,10 @@ static ModifierData *mesh_find_start_modifier(Scene *scene, Object *ob, VirtualM
 				break;
 			}
 		}
-#endif
 	}
 	if (md)
 		return md;
+#endif
 	
 	/* no valid cache modifier found,
 	 * take virtual modifiers at list start into account
@@ -1534,7 +1535,7 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
 	/* XXX Always copying POLYINDEX, else tessellated data are no more valid! */
 	CustomDataMask mask, nextmask, previewmask = 0, append_mask = CD_MASK_ORIGINDEX;
 	float (*deformedVerts)[3] = NULL;
-	DerivedMesh *dm = NULL, *orcodm, *clothorcodm, *finaldm;
+	DerivedMesh *dm = NULL, *cachedm = NULL, *orcodm, *clothorcodm, *finaldm;
 	int numVerts = me->totvert;
 	int required_mode;
 	bool isPrevDeform = false;
@@ -1572,7 +1573,12 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
 	
 	modifiers_clearErrors(ob);
 	
-	firstmd = mesh_find_start_modifier(scene, ob, &virtualModifierData, required_mode, useDeform);
+	if (BKE_cache_read_derived_mesh(G.main, scene, scene->r.cfra, ob, &cachedm)) {
+		firstmd = NULL;
+	}
+	else {
+		firstmd = mesh_find_start_modifier(scene, ob, &virtualModifierData, required_mode, useDeform);
+	}
 	md = firstmd;
 
 	if (do_mod_wmcol || do_mod_mcol) {
@@ -1900,11 +1906,17 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
 	for (md = firstmd; md; md = md->next)
 		modifier_freeTemporaryData(md);
 
-	/* Yay, we are done. If we have a DerivedMesh and deformed vertices
-	 * need to apply these back onto the DerivedMesh. If we have no
-	 * DerivedMesh then we need to build one.
+	/* Yay, we are done.
+	 * - If we have a cached DerivedMesh, use it
+	 * - If we have a DerivedMesh and deformed vertices
+	 *   need to apply these back onto the DerivedMesh.
+	 * - If we have no DerivedMesh then we need to build one.
 	 */
-	if (dm && deformedVerts) {
+	if (cachedm) {
+		finaldm = CDDM_copy(cachedm);
+		cachedm->release(cachedm);
+	}
+	else if (dm && deformedVerts) {
 		finaldm = CDDM_copy(dm);
 
 		dm->release(dm);
diff --git a/source/blender/blenkernel/intern/cache_library.c b/source/blender/blenkernel/intern/cache_library.c
index 87dc5fc..7a02897 100644
--- a/source/blender/blenkernel/intern/cache_library.c
+++ b/source/blender/blenkernel/intern/cache_library.c
@@ -41,12 +41,15 @@
 #include "DNA_group_types.h"
 #include "DNA_object_types.h"
 #include "DNA_particle_types.h"
+#include "DNA_scene_types.h"
 
 #include "BKE_cache_library.h"
 #include "BKE_global.h"
 #include "BKE_library.h"
 #include "BKE_main.h"
 
+#include "PTC_api.h"
+
 CacheLibrary *BKE_cache_library_add(Main *bmain, const char *name)
 {
 	CacheLibrary *cachelib;
@@ -506,3 +509,20 @@ void BKE_cache_library_update_items(CacheLibrary *cachelib)
 	}
 }
 #endif
+
+/* ========================================================================= */
+
+/* XXX this needs work: the order of cachelibraries in bmain is arbitrary!
+ * If there are multiple cachelibs applying data, which should take preference?
+ */
+
+bool BKE_cache_read_derived_mesh(Main *bmain, Scene *scene, float frame, Object *ob, struct DerivedMesh **r_dm)
+{
+	CacheLibrary *cachelib;
+	
+	for (cachelib = bmain->cache_library.first; cachelib; cachelib = cachelib->id.next) {
+		if (PTC_cachelib_read_sample_derived_mesh(scene, frame, cachelib, ob, r_dm) != PTC_READ_SAMPLE_INVALID)
+			return true;
+	}
+	return false;
+}
diff --git a/source/blender/editors/io/io_cache_library.c b/source/blender/editors/io/io_cache_library.c
index 2013a39..317dea6 100644
--- a/source/blender/editors/io/io_cache_library.c
+++ b/source/blender/editors/io/io_cache_library.c
@@ -216,7 +216,7 @@ static void cache_library_bake_startjob(void *customdata, short *stop, short *do
 	
 	G.is_break = false;
 	
-	data->archive = PTC_cachlib_writers(scene, data->cachelib, &data->writers);
+	data->archive = PTC_cachelib_writers(scene, data->cachelib, &data->writers);
 	
 	/* XXX where to get this from? */
 	start_frame = scene->r.sfra;
@@ -235,7 +235,7 @@ static void cache_library_bake_endjob(void *customdata)
 	G.is_rendering = false;
 	BKE_spacedata_draw_locks(false);
 	
-	PTC_cachlib_writers_free(data->archive, &data->writers);
+	PTC_cachelib_writers_free(data->archive, &data->writers);
 	
 	/* reset scene frame */
 	scene->r.cfra = data->origfra;
diff --git a/source/blender/pointcache/PTC_api.cpp b/source/blender/pointcache/PTC_api.cpp
index d322a62..a5155a2 100644
--- a/source/blender/pointcache/PTC_api.cpp
+++ b/source/blender/pointcache/PTC_api.cpp
@@ -226,47 +226,128 @@ PTCReader *PTC_reader_from_rna(Scene *scene, PointerRNA *ptr)
 }
 
 
-PTCReaderArchive *PTC_cachlib_readers(Scene *scene, CacheLibrary *cachelib, ListBase *readers)
+PTCReader *PTC_cachelib_reader_derived_mesh(CacheLibrary *cachelib, PTCReaderArchive *archive, Object *ob)
 {
-	std::string filename = ptc_archive_path(cachelib->filepath, (ID *)cachelib, cachelib->id.lib);
-	PTCReaderArchive *archive = PTC_open_reader_archive(scene, filename.c_str());
+	CacheItem *item = BKE_cache_library_find_item(cachelib, ob, CACHE_TYPE_DERIVED_MESH, -1);
+	if (item && (item->flag & CACHE_ITEM_ENABLED)) {
+		char name[2*MAX_NAME];
+		BKE_cache_item_name(ob, CACHE_TYPE_DERIVED_MESH, -1, name);
+		
+		return PTC_reader_derived_mesh(archive, name, ob);
+	}
 	
-	BLI_listbase_clear(readers);
+	return NULL;
+}
+
+PTCReader *PTC_cachelib_reader_hair_dynamics(CacheLibrary *cachelib, PTCReaderArchive *archive, Object *ob, ParticleSystem *psys)
+{
+	if (!(psys && psys->part && psys->part->type == PART_HAIR && psys->clmd))
+		return NULL;
 	
-	for (CacheItem *item = (CacheItem *)cachelib->items.first; item; item = item->next) {
-		if (!(item->flag & CACHE_ITEM_ENABLED))
-			continue;
+	int index = BLI_findindex(&ob->particlesystem, psys);
+	CacheItem *item = BKE_cache_library_find_item(cachelib, ob, CACHE_TYPE_HAIR, index);
+	if (item && (item->flag & CACHE_ITEM_ENABLED)) {
+		char name[2*MAX_NAME];
+		BKE_cache_item_name(ob, CACHE_TYPE_HAIR, index, name);
 		
-		PTCReader *reader = NULL;
-		switch (item->type) {
-			case CACHE_TYPE_DERIVED_MESH:
-//				reader = PTC_reader_point_cache(archive, )
-				break;
-			default:
-				break;
-		}
+		return PTC_reader_hair_dynamics(archive, name, ob, psys->clmd);
+	}
+	
+	return NULL;
+}
+
+PTCReader *PTC_cachelib_reader_particle_pathcache_parents(CacheLibrary *cachelib, PTCReaderArchive *archive, Object *ob, ParticleSystem *psys)
+{
+	if (!(psys && psys->part && psys->part->type == PART_HAIR))
+		return NULL;
+	
+	int index = BLI_findindex(&ob->particlesystem, psys);
+	CacheItem *item = BKE_cache_library_find_item(cachelib, ob, CACHE_TYPE_HAIR_PATHS, index);
+	if (item && (item->flag & CACHE_ITEM_ENABLED)) {
+		char name[2*MAX_NAME];
+		BKE_cache_item_name(ob, CACHE_TYPE_HAIR_PATHS, index, name);
 		
-		if (reader) {
-			LinkData *link = (LinkData *)MEM_callocN(sizeof(LinkData), "cachelib readers link");
-			link->data = reader;
-			BLI_addtail(readers, link);
-		}
+		return PTC_reader_particle_pathcache_parents(archive, name, ob, psys);
 	}
 	
-	return archive;
+	return NULL;
+}
+
+PTCReader *PTC_cachelib_reader_particle_pathcache_children(CacheLibrary *cachelib, PTCReaderArchive *archive, Object *ob, ParticleSystem *psys)
+{
+	if (!(psys && psys->part && psys->part->type == PART_HAIR))
+		return NULL;
+	
+	int index = BLI_findindex(&ob->particlesystem, psys);
+	CacheItem *item = BKE_cache_library_find_item(cachelib, ob, CACHE_TYPE_HAIR_PATHS, index);
+	if (item && (item->flag & CACHE_ITEM_ENABLED)) {
+		char name[2*MAX_NAME];
+		BKE_cache_item_name(ob, CACHE_TYPE_HAIR_PATHS, index, name);
+		
+		return PTC_reader_particle_pathcache_children(archive, name, ob, psys);
+	}
+	
+	return NULL;
 }
 
-void PTC_cachlib_readers_free(PTCReaderArchive *archive, ListBase *readers)
+PTCReadSampleResult PTC_cachelib_read_sample_derived_mesh(Scene *scene, float frame, CacheLibrary *cachelib, Object *ob, DerivedMesh **r_dm)
 {
-	for (LinkData *link = (LinkData *)readers->first; link; link = link->next) {
-		PTCReader *reader = (PTCReader *)link->data;
-		PTC_reader_free(reader);
+	std::string filename = ptc_archive_path(cachelib->filepath, (ID *)cachelib, cachelib->id.lib);
+	PTCReaderArchive *archive = PTC_open_reader_archive(scene, filename.c_str());
+	
+	PTCReader *reader = PTC_cachelib_reader_derived_mesh(cachelib, archive, ob);
+	PTCReadSampleResult result = PTC_READ_SAMPLE_INVALID;
+	if (reader) {
+		result = PTC_read_sample(reader, frame);
+		if (result != PTC_READ_SAMPLE_INVALID)
+			*r_dm = PTC_reader_derived_mesh_acquire_result(reader);
 	}
-	BLI_f

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list