Commit: 2169e583cf4885319db10445fe1a1b61dd885ab2
Author: Kévin Dietrich
Date:   Tue Jun 21 13:30:33 2016 +0200
Branches: alembic_basic_io
https://developer.blender.org/rB2169e583cf4885319db10445fe1a1b61dd885ab2

Store a pointer to an open Alembic archive in the CacheFile data-block.

This avoids re-opening the same file over and over again for every
modifier/constraint that references it and it provides a unique place to
open archives for new frames when using file sequences.

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

M       source/blender/alembic/ABC_alembic.h
M       source/blender/alembic/intern/alembic_capi.cc
M       source/blender/blenkernel/BKE_cachefile.h
M       source/blender/blenkernel/intern/cachefile.c
M       source/blender/blenkernel/intern/constraint.c
M       source/blender/blenkernel/intern/library.c
M       source/blender/blenkernel/intern/scene.c
M       source/blender/blenloader/CMakeLists.txt
M       source/blender/blenloader/intern/readfile.c
M       source/blender/makesdna/DNA_cachefile_types.h
M       source/blender/makesrna/intern/rna_cachefile.c
M       source/blender/modifiers/intern/MOD_meshsequencecache.c

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

diff --git a/source/blender/alembic/ABC_alembic.h 
b/source/blender/alembic/ABC_alembic.h
index 1d17b79..9baa2d5 100644
--- a/source/blender/alembic/ABC_alembic.h
+++ b/source/blender/alembic/ABC_alembic.h
@@ -40,6 +40,8 @@ enum {
 #define BL_ABC_NO_ERR 0
 #define BL_ABC_UNKNOWN_ERROR 1
 
+typedef struct AbcArchiveHandle AbcArchiveHandle;
+
 int ABC_get_version(void);
 
 int ABC_export(struct Scene *scene, struct bContext *C, const char *filepath,
@@ -61,14 +63,15 @@ void ABC_import(struct bContext *C, const char *filepath, 
float scale, bool is_s
 
 void ABC_get_vertex_cache(const char *filepath, float time, void *verts, int 
max_verts, const char *object_path, int is_mvert);
 
-int ABC_check_subobject_valid(const char *filepath, const char *object_path);
+int ABC_check_subobject_valid(const char *filename, const char *object_path);
+
+AbcArchiveHandle *ABC_create_handle(const char *filename);
 
-void ABC_get_transform(struct Object *ob, const char *filepath, const char 
*object_path, float r_mat[4][4], float time, float scale);
+void ABC_free_handle(AbcArchiveHandle *handle);
 
-struct DerivedMesh *ABC_read_mesh(struct DerivedMesh *dm, const char 
*filepath, const char *object_path, const float time);
+void ABC_get_transform(AbcArchiveHandle *handle, struct Object *ob, const char 
*object_path, float r_mat[4][4], float time, float scale);
 
-void ABC_read_vertex_cache(const char *filepath, const char *object_path, 
const float time,
-                           float (*vertexCos)[3], int max_verts);
+struct DerivedMesh *ABC_read_mesh(AbcArchiveHandle *handle, struct DerivedMesh 
*dm, const char *object_path, const float time);
 
 #ifdef __cplusplus
 }
diff --git a/source/blender/alembic/intern/alembic_capi.cc 
b/source/blender/alembic/intern/alembic_capi.cc
index 95492ab..c49dc58 100644
--- a/source/blender/alembic/intern/alembic_capi.cc
+++ b/source/blender/alembic/intern/alembic_capi.cc
@@ -100,36 +100,60 @@ using Alembic::AbcGeom::IN3fGeomParam;
 
 using Alembic::AbcMaterial::IMaterial;
 
-int ABC_get_version()
+struct AbcArchiveHandle {
+       int unused;
+};
+
+ABC_INLINE IArchive *archive_from_handle(AbcArchiveHandle *handle)
 {
-       return ALEMBIC_LIBRARY_VERSION;
+       return reinterpret_cast<IArchive *>(handle);
+}
+
+ABC_INLINE AbcArchiveHandle *handle_from_archive(IArchive *archive)
+{
+       return reinterpret_cast<AbcArchiveHandle *>(archive);
 }
 
-static IArchive open_archive(const std::string &filename)
+static IArchive *open_archive(const std::string &filename)
 {
        Alembic::AbcCoreAbstract::ReadArraySampleCachePtr cache_ptr;
-       IArchive archive;
+       IArchive *archive;
 
        try {
-               archive = IArchive(Alembic::AbcCoreHDF5::ReadArchive(),
-                                  filename.c_str(), ErrorHandler::kThrowPolicy,
-                                  cache_ptr);
+               archive = new IArchive(Alembic::AbcCoreHDF5::ReadArchive(),
+                                      filename.c_str(), 
ErrorHandler::kThrowPolicy,
+                                      cache_ptr);
        }
        catch (const Exception &) {
                try {
-                       archive = IArchive(Alembic::AbcCoreOgawa::ReadArchive(),
-                                          filename.c_str(), 
ErrorHandler::kThrowPolicy,
-                                          cache_ptr);
+                       archive = new 
IArchive(Alembic::AbcCoreOgawa::ReadArchive(),
+                                              filename.c_str(), 
ErrorHandler::kThrowPolicy,
+                                              cache_ptr);
                }
                catch (const Exception &e) {
                        std::cerr << e.what() << '\n';
-                       return IArchive();
+                       return NULL;
                }
        }
 
        return archive;
 }
 
+AbcArchiveHandle *ABC_create_handle(const char *filename)
+{
+       return handle_from_archive(open_archive(filename));
+}
+
+void ABC_free_handle(AbcArchiveHandle *handle)
+{
+       delete archive_from_handle(handle);
+}
+
+int ABC_get_version()
+{
+       return ALEMBIC_LIBRARY_VERSION;
+}
+
 static size_t update_points(std::pair<IPolyMeshSchema, IObject> schema,
                             const ISampleSelector &sample_sel,
                             MVert *verts, size_t vtx_start, int max_verts = -1,
@@ -198,13 +222,13 @@ static void find_iobject(const IObject &object, IObject 
&ret,
 void ABC_get_vertex_cache(const char *filepath, float time, void *verts,
                           int max_verts, const char *object_path, int 
is_mverts)
 {
-       IArchive archive = open_archive(filepath);
+       IArchive *archive = open_archive(filepath);
 
-       if (!archive || !archive.valid()) {
+       if (!archive || !archive->valid()) {
                return;
        }
 
-       IObject top = archive.getTop();
+       IObject top = archive->getTop();
 
        if (!top.valid()) {
                return;
@@ -230,22 +254,24 @@ void ABC_get_vertex_cache(const char *filepath, float 
time, void *verts,
                update_points(std::pair<IPolyMeshSchema, IObject>(schema, 
iobject),
                              sample_sel, NULL, 0, max_verts, vcos);
        }
+
+       /* TODO. */
+       delete archive;
 }
 
-int ABC_check_subobject_valid(const char *filepath, const char *object_path)
+int ABC_check_subobject_valid(const char *filename, const char *object_path)
 {
-       if ((filepath[0] == '\0') || (object_path[0] == '\0')) {
-               return 0;
-       }
-
-       IArchive archive = open_archive(filepath);
+       IArchive *archive = open_archive(filename);
 
-       if (!archive.valid()) {
-               return 0;
+       if (!archive || !archive->valid()) {
+               return false;
        }
 
        IObject ob;
-       find_iobject(archive.getTop(), ob, object_path);
+       find_iobject(archive->getTop(), ob, object_path);
+
+       /* TODO. */
+       delete archive;
 
        return (ob.valid());
 }
@@ -500,9 +526,9 @@ static void import_startjob(void *user_data, short *stop, 
short *do_update, floa
        data->do_update = do_update;
        data->progress = progress;
 
-       IArchive archive = open_archive(data->filename);
+       IArchive *archive = open_archive(data->filename);
 
-       if (!archive.valid()) {
+       if (!archive || !archive->valid()) {
                return;
        }
 
@@ -510,6 +536,7 @@ static void import_startjob(void *user_data, short *stop, 
short *do_update, floa
 
        cache_file->is_sequence = data->settings.is_sequence;
        cache_file->scale = data->settings.scale;
+       cache_file->handle = handle_from_archive(archive);
        BLI_strncpy(cache_file->filepath, data->filename, 1024);
 
        data->settings.cache_file = cache_file;
@@ -521,7 +548,7 @@ static void import_startjob(void *user_data, short *stop, 
short *do_update, floa
 
        /* Parse Alembic Archive. */
 
-       visit_object(archive.getTop(), data->readers, data->parent_map, 
data->settings);
+       visit_object(archive->getTop(), data->readers, data->parent_map, 
data->settings);
 
        if (G.is_break) {
                return;
@@ -670,16 +697,16 @@ void ABC_import(bContext *C, const char *filepath, float 
scale, bool is_sequence
 
 /* ******************************* */
 
-void ABC_get_transform(Object *ob, const char *filepath, const char 
*object_path, float r_mat[4][4], float time, float scale)
+void ABC_get_transform(AbcArchiveHandle *handle, Object *ob, const char 
*object_path, float r_mat[4][4], float time, float scale)
 {
-       IArchive archive = open_archive(filepath);
+       IArchive *archive = archive_from_handle(handle);
 
-       if (!archive.valid()) {
+       if (!archive || !archive->valid()) {
                return;
        }
 
        IObject tmp;
-       find_iobject(archive.getTop(), tmp, object_path);
+       find_iobject(archive->getTop(), tmp, object_path);
 
        IXform ixform;
 
@@ -865,16 +892,16 @@ static DerivedMesh *read_curves_sample(DerivedMesh *dm, 
const IObject &iobject,
        return dm;
 }
 
-DerivedMesh *ABC_read_mesh(DerivedMesh *dm, const char *filepath, const char 
*object_path, const float time)
+DerivedMesh *ABC_read_mesh(AbcArchiveHandle *handle, DerivedMesh *dm, const 
char *object_path, const float time)
 {
-       IArchive archive = open_archive(filepath);
+       IArchive *archive = archive_from_handle(handle);
 
-       if (!archive.valid()) {
-               return NULL;
+       if (!archive || !archive->valid()) {
+               return dm;
        }
 
        IObject iobject;
-       find_iobject(archive.getTop(), iobject, object_path);
+       find_iobject(archive->getTop(), iobject, object_path);
 
        if (!iobject.valid()) {
                return NULL;
diff --git a/source/blender/blenkernel/BKE_cachefile.h 
b/source/blender/blenkernel/BKE_cachefile.h
index 9b5b22d..1f201ef 100644
--- a/source/blender/blenkernel/BKE_cachefile.h
+++ b/source/blender/blenkernel/BKE_cachefile.h
@@ -34,10 +34,15 @@
 extern "C" {
 #endif
 
+struct CacheFile;
 struct Main;
 
 void *BKE_cachefile_add(struct Main *bmain, const char *name);
 
+void BKE_cachefile_free(struct CacheFile *cache_file);
+
+void BKE_cachefiles_open_next_file(struct Main *bmain, float ctime);
+
 bool BKE_cachefile_filepath_get(struct CacheFile *cache_file, float frame,
                                 char *r_filename);
 
diff --git a/source/blender/blenkernel/intern/cachefile.c 
b/source/blender/blenkernel/intern/cachefile.c
index 93eb81d..009528e 100644
--- a/source/blender/blenkernel/intern/cachefile.c
+++ b/source/blender/blenkernel/intern/cachefile.c
@@ -33,6 +33,7 @@
 #include "BLI_fileops.h"
 #include "BLI_path_util.h"
 #include "BLI_string.h"
+#include "BLI_utildefines.h"
 
 #include "BKE_cachefile.h"
 #include "BKE_global.h"
@@ -40,10 +41,15 @@
 #include "BKE_main.h"
 #include "BKE_scene.h"
 
+#ifdef WITH_ALEMBIC
+#  include "ABC_alembic.h"
+#endif
+
 void *BKE_cachefile_add(Main *bmain, const char *name)
 {
        CacheFile *cache_file = BKE_libblock_alloc(bmain, ID_CF, name);
 
+       cache_file->handle = NULL;
        cache_file->filepath[0] = '\0';
        cache_file->frame_start = 0.0f;
        cache_file->frame_scale = 1.0f;
@@ -52,9 +58,37 @@ void *BKE_cachefile_add(Main *bmain, const char *name)
        return cache_file;
 }
 
+void BKE_cachefile_free(CacheFile *cache_file)
+{
+#ifdef WITH_ALEMBIC
+       ABC_free_handle(cache_file->handle);
+#else
+       UNUSED_VARS(cache_file);
+#endif
+}
+
+void BKE_cachefiles_open_next_file(Main *bmain, float ctime)
+{
+       CacheFile *cache_file;
+       char filename[FILE_MAX];
+
+       for (cache_file = bmain->cachefiles.first; cache_file; cache_file = 
cache_file->id.next) {
+               if (!cache_file->is_sequence) {
+                       continue;
+               }
+
+               if (BKE_cachefile_filepath_get(cache_file, ctime, filename)) {
+#ifdef WITH_ALEMBIC
+                       ABC_free_handle(cache_file->handle);
+                       cache_file->handle = ABC_create_handle(filename);
+#endif
+               }
+       }
+}
+
 bool BKE_cachefile_filepath_get(CacheFile *cache_file, float frame, char 
*r_filepath)
 {
-       BLI_strncpy(r_filepath, cache_file->filepath, 1024);
+       BLI_strncpy(r_filepath, cache_file->filepath, 

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to