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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to