Commit: 2b02c0b650d6305880d7003423dd58cdef8b9bc4
Author: Lukas Tönne
Date:   Thu Mar 12 12:21:12 2015 +0100
Branches: alembic_pointcache
https://developer.blender.org/rB2b02c0b650d6305880d7003423dd58cdef8b9bc4

Cache reading functions for constructing a nested dupligroup list based
on Alembic cache data.

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

M       source/blender/blenkernel/BKE_anim.h
M       source/blender/blenkernel/intern/cache_library.c
M       source/blender/blenkernel/intern/object_dupli.c
M       source/blender/blenloader/intern/readfile.c
M       source/blender/makesdna/DNA_object_types.h
M       source/blender/pointcache/PTC_api.cpp
M       source/blender/pointcache/PTC_api.h
M       source/blender/pointcache/alembic/abc_group.cpp
M       source/blender/pointcache/alembic/abc_group.h
M       source/blender/pointcache/alembic/alembic.cpp
M       source/blender/pointcache/intern/ptc_types.h

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

diff --git a/source/blender/blenkernel/BKE_anim.h 
b/source/blender/blenkernel/BKE_anim.h
index a91f4ae..65a0ea8 100644
--- a/source/blender/blenkernel/BKE_anim.h
+++ b/source/blender/blenkernel/BKE_anim.h
@@ -44,6 +44,9 @@ struct bPoseChannel;
 struct ReportList;
 struct GHash;
 struct DupliCache;
+struct DupliObject;
+struct DupliObjectData;
+struct DerivedMesh;
 
 /* ---------------------------------------------------- */
 /* Animation Visualization */
@@ -76,7 +79,8 @@ int count_duplilist(struct Object *ob);
 void BKE_object_dupli_cache_update(struct Scene *scene, struct Object *ob, 
struct EvaluationContext *eval_ctx);
 void BKE_object_dupli_cache_clear(struct Object *ob);
 
-void BKE_dupli_cache_add_mesh(struct DupliCache *dupcache, float obmat[4][4], 
struct DerivedMesh *dm);
+struct DupliObjectData *BKE_dupli_cache_add_mesh(struct DupliCache *dupcache, 
struct DerivedMesh *dm);
+void BKE_dupli_cache_add_instance(struct DupliCache *dupcache, float 
obmat[4][4], struct DupliObjectData *data);
 
 typedef struct DupliExtraData {
        float obmat[4][4];
diff --git a/source/blender/blenkernel/intern/cache_library.c 
b/source/blender/blenkernel/intern/cache_library.c
index 72e97a0..88654d5 100644
--- a/source/blender/blenkernel/intern/cache_library.c
+++ b/source/blender/blenkernel/intern/cache_library.c
@@ -1215,8 +1215,17 @@ bool BKE_cache_read_dupligroup(Main *bmain, Scene 
*scene, float frame, eCacheLib
        
        FOREACH_CACHELIB_READ(bmain, cachelib, eval_mode) {
                if (cachelib->group == dupgroup) {
-                       // TODO
-                       //      BKE_dupli_cache_add_mesh();
+                       char filename[FILE_MAX];
+                       struct PTCReaderArchive *archive;
+                       eCacheReadSampleResult result;
+                       
+                       BKE_cache_archive_path(cachelib->filepath, (ID 
*)cachelib, cachelib->id.lib, filename, sizeof(filename));
+                       archive = PTC_open_reader_archive(scene, filename);
+                       
+                       result = 
BKE_cache_read_result(PTC_read_dupligroup(archive, frame, dupgroup, dupcache));
+                       
+                       PTC_close_reader_archive(archive);
+                       
                        return true;
                }
        }
diff --git a/source/blender/blenkernel/intern/object_dupli.c 
b/source/blender/blenkernel/intern/object_dupli.c
index 5f19e5e..2af8235 100644
--- a/source/blender/blenkernel/intern/object_dupli.c
+++ b/source/blender/blenkernel/intern/object_dupli.c
@@ -1241,29 +1241,28 @@ int count_duplilist(Object *ob)
 }
 
 /* ------------------------------------------------------------------------- */
+
+
+
 typedef struct DupliCache {
-#if 0
-       /* XXX ghash implementation later, for now listbase is easier */
        struct GHash *ghash;
-#else
+       
        ListBase duplilist;
-#endif
 } DupliCache;
 
-static void dupli_object_free(DupliObject *dob)
+static void dupli_object_data_free(DupliObjectData *data)
 {
-       if (dob->cache_dm)
-               dob->cache_dm->release(dob->cache_dm);
+       if (data->cache_dm)
+               data->cache_dm->release(data->cache_dm);
        
-       MEM_freeN(dob);
+       MEM_freeN(data);
 }
 
-#if 0
-static void dupli_cache_clear(DupliCache *dupcache)
+static void dupli_object_free(DupliObject *dob)
 {
-       BLI_ghash_clear(dupcache->ghash, NULL, 
(GHashValFreeFP)dupli_object_free);
+       MEM_freeN(dob);
 }
-#else
+
 static void dupli_cache_clear(DupliCache *dupcache)
 {
        DupliObject *dob, *dob_next;
@@ -1273,10 +1272,41 @@ static void dupli_cache_clear(DupliCache *dupcache)
                dupli_object_free(dob);
        }
        BLI_listbase_clear(&dupcache->duplilist);
+       
+       BLI_ghash_clear(dupcache->ghash, NULL, 
(GHashValFreeFP)dupli_object_data_free);
+}
+
+static void dupli_cache_free(DupliCache *dupcache)
+{
+       dupli_cache_clear(dupcache);
+       
+       BLI_ghash_free(dupcache->ghash, NULL, 
(GHashValFreeFP)dupli_object_data_free);
+       MEM_freeN(dupcache);
 }
-#endif
 
-static DupliObject *dupli_cache_push(DupliCache *dupcache)
+static DupliCache *dupli_cache_new(void)
+{
+       DupliCache *dupcache = MEM_callocN(sizeof(DupliCache), "dupli object 
cache");
+       
+       dupcache->ghash = BLI_ghash_new(BLI_ghashutil_ptrhash, 
BLI_ghashutil_ptrcmp, "dupli object data hash");
+       
+       return dupcache;
+}
+
+static DupliObjectData *dupli_cache_add_object_data(DupliCache *dupcache)
+{
+       DupliObjectData *data = MEM_callocN(sizeof(DupliObjectData), "dupli 
object data");
+       
+       BLI_ghash_insert(dupcache->ghash, data, data);
+       return data;
+}
+
+static bool dupli_cache_contains_object_data(DupliCache *dupcache, 
DupliObjectData *data)
+{
+       return BLI_ghash_lookup(dupcache->ghash, data) != NULL;
+}
+
+static DupliObject *dupli_cache_add_object(DupliCache *dupcache)
 {
        DupliObject *dob = MEM_callocN(sizeof(DupliObject), "dupli object");
        
@@ -1296,7 +1326,7 @@ void BKE_object_dupli_cache_update(Scene *scene, Object 
*ob, EvaluationContext *
                        dupli_cache_clear(ob->dup_cache);
                }
                else {
-                       ob->dup_cache = MEM_callocN(sizeof(DupliCache), "dupli 
object cache");
+                       ob->dup_cache = dupli_cache_new();
                }
                
 #if 0
@@ -1327,8 +1357,7 @@ void BKE_object_dupli_cache_update(Scene *scene, Object 
*ob, EvaluationContext *
        }
        else {
                if (ob->dup_cache) {
-                       dupli_cache_clear(ob->dup_cache);
-                       MEM_freeN(ob->dup_cache);
+                       dupli_cache_free(ob->dup_cache);
                        ob->dup_cache = NULL;
                }
        }
@@ -1341,14 +1370,26 @@ void BKE_object_dupli_cache_clear(Object *ob)
        }
 }
 
-void BKE_dupli_cache_add_mesh(DupliCache *dupcache, float obmat[4][4], 
DerivedMesh *dm)
+DupliObjectData *BKE_dupli_cache_add_mesh(DupliCache *dupcache, DerivedMesh 
*dm)
 {
-       DupliObject *dob = dupli_cache_push(dupcache);
+       DupliObjectData *data = dupli_cache_add_object_data(dupcache);
+       
+       data->cache_dm = dm;
+       
+       return data;
+}
+
+void BKE_dupli_cache_add_instance(DupliCache *dupcache, float obmat[4][4], 
DupliObjectData *data)
+{
+       DupliObject *dob = dupli_cache_add_object(dupcache);
+       
+       /* data must have been created correctly */
+       BLI_assert(dupli_cache_contains_object_data(dupcache, data));
        
        dob->ob = NULL;
        copy_m4_m4(dob->mat, obmat);
        
-       dob->cache_dm = dm;
+       dob->data = data;
 }
 
 /* ------------------------------------------------------------------------- */
diff --git a/source/blender/blenloader/intern/readfile.c 
b/source/blender/blenloader/intern/readfile.c
index b0d544b..25a3710 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -5005,6 +5005,8 @@ static void direct_link_object(FileData *fd, Object *ob)
        /* do it here, below old data gets converted */
        direct_link_modifiers(fd, &ob->modifiers);
        
+       ob->dup_cache = NULL;
+       
        link_list(fd, &ob->effect);
        paf= ob->effect.first;
        while (paf) {
diff --git a/source/blender/makesdna/DNA_object_types.h 
b/source/blender/makesdna/DNA_object_types.h
index 3629654..49cb0b9 100644
--- a/source/blender/makesdna/DNA_object_types.h
+++ b/source/blender/makesdna/DNA_object_types.h
@@ -330,9 +330,14 @@ typedef struct DupliObject {
        /* particle this dupli was generated from */
        struct ParticleSystem *particle_system;
        
-       struct DerivedMesh *cache_dm;
+       struct DupliObjectData *data;
 } DupliObject;
 
+/* data that can be shared by multiple DupliObject instances */
+typedef struct DupliObjectData {
+       struct DerivedMesh *cache_dm;
+} DupliObjectData;
+
 /* **************** OBJECT ********************* */
 
 /* used many places... should be specialized  */
diff --git a/source/blender/pointcache/PTC_api.cpp 
b/source/blender/pointcache/PTC_api.cpp
index e8123ce..cbb94c7 100644
--- a/source/blender/pointcache/PTC_api.cpp
+++ b/source/blender/pointcache/PTC_api.cpp
@@ -201,6 +201,12 @@ char *PTC_get_archive_info(PTCReaderArchive *_archive)
 }
 
 
+PTCReadSampleResult PTC_read_dupligroup(PTCReaderArchive *archive, float 
frame, Group *dupgroup, DupliCache *dupcache)
+{
+       return PTC::Factory::alembic->read_dupligroup((PTC::ReaderArchive 
*)archive, frame, dupgroup, dupcache);
+}
+
+
 /* get writer/reader from RNA type */
 PTCWriter *PTC_writer_from_rna(Scene *scene, PointerRNA *ptr)
 {
diff --git a/source/blender/pointcache/PTC_api.h 
b/source/blender/pointcache/PTC_api.h
index 25da29e..cb7e048 100644
--- a/source/blender/pointcache/PTC_api.h
+++ b/source/blender/pointcache/PTC_api.h
@@ -32,15 +32,14 @@ struct ListBase;
 struct PointerRNA;
 struct ReportList;
 
+struct DupliCache;
 struct ClothModifierData;
 struct DerivedMesh;
-struct DynamicPaintSurface;
+struct Group;
 struct ModifierData;
 struct Object;
 struct ParticleSystem;
 struct CacheModifierData;
-struct RigidBodyWorld;
-struct SmokeDomainSettings;
 struct SoftBody;
 
 struct PTCWriterArchive;
@@ -86,6 +85,8 @@ PTCReadSampleResult PTC_test_sample(struct PTCReader *reader, 
float frame);
 
 char *PTC_get_archive_info(struct PTCReaderArchive *archive);
 
+PTCReadSampleResult PTC_read_dupligroup(struct PTCReaderArchive *archive, 
float frame, struct Group *dupgroup, struct DupliCache *dupcache);
+
 /* get writer/reader from RNA type */
 struct PTCWriter *PTC_writer_from_rna(struct Scene *scene, struct PointerRNA 
*ptr);
 struct PTCReader *PTC_reader_from_rna(struct Scene *scene, struct PointerRNA 
*ptr);
diff --git a/source/blender/pointcache/alembic/abc_group.cpp 
b/source/blender/pointcache/alembic/abc_group.cpp
index 15331c8..12b3fa8 100644
--- a/source/blender/pointcache/alembic/abc_group.cpp
+++ b/source/blender/pointcache/alembic/abc_group.cpp
@@ -16,16 +16,22 @@
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  */
 
+#include <map>
 #include <sstream>
 #include <string>
 
+#include <Alembic/Abc/IObject.h>
+
+#include "abc_mesh.h"
 #include "abc_group.h"
 
 extern "C" {
 #include "BLI_math.h"
 
 #include "DNA_group_types.h"
+#include "DNA_object_types.h"
 
+#include "BKE_anim.h"
 #include "BKE_group.h"
 }
 
@@ -93,4 +99,120 @@ PTCReadSampleResult AbcGroupReader::read_sample(float frame)
        return PTC_READ_SAMPLE_EXACT;
 }
 
+/* ========================================================================= */
+
+typedef float Matrix[4][4];
+
+typedef float (*MatrixPtr)[4];
+
+static Matrix I = {{1.0f, 0.0f, 0.0f, 0.0f}, {0.0f, 1.0f, 0.0f, 0.0f}, {0.0f, 
0.0f, 1.0f, 0.0f}, {0.0f, 0.0f, 0.0f, 1.0f}};
+
+struct DupliGroupContext {
+       typedef std::map<ObjectReaderPtr, DupliObjectData*> DupliMap;
+       typedef std::pair<ObjectReaderPtr, DupliObjectData*> DupliPair;
+       
+       struct Transform {
+               Transform() {}
+               Transform(float (*value)[4]) { copy_m4_m4(matrix, value); }
+               Transform(const Transform &tfm) { memcpy(matrix, tfm.matrix, 
sizeof(Matr

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