[Bf-blender-cvs] [9bb0f55] gooseberry: Importing of caches into Blender data.
Lukas Tönne
noreply at git.blender.org
Mon Mar 23 13:01:22 CET 2015
Commit: 9bb0f55e3c6ac8959afe96757d688b93f6bcbd99
Author: Lukas Tönne
Date: Wed Feb 25 16:24:22 2015 +0100
Branches: gooseberry
https://developer.blender.org/rB9bb0f55e3c6ac8959afe96757d688b93f6bcbd99
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 f83b018..c3490d5 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"
@@ -1503,8 +1504,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;
@@ -1524,10 +1525,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
@@ -1563,7 +1564,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;
@@ -1601,7 +1602,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) {
@@ -1929,11 +1935,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