Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKévin Dietrich <kevin.dietrich@mailoo.org>2016-10-29 13:23:09 +0300
committerKévin Dietrich <kevin.dietrich@mailoo.org>2016-10-29 13:23:09 +0300
commit753edafcb77d9aaf07fe869372319b841dd80681 (patch)
tree676445ce05cf2a8a53ced9deedf5bcba37fd9653 /source/blender/modifiers
parent0c13792437b3e501c06605876a0396e187c0f7da (diff)
Alembic: store a pointer to the object reader in the cache modifiers and
constraints. This avoids traversing the archive everytime object data is needed and gives an overall consistent ~2x speedup here with files containing between 136 and 500 Alembic objects. Also this somewhat nicely de- duplicates code between data creation (upon import) and data streaming (modifiers and constraints). The only worying part is what happens when a CacheFile is deleted and/or has its path changed. For now, we traverse the whole scene and for each object using the CacheFile we free the pointer and NULL-ify it (see BKE_cachefile_clean), but at some point this should be re-considered and make use of the dependency graph.
Diffstat (limited to 'source/blender/modifiers')
-rw-r--r--source/blender/modifiers/intern/MOD_meshsequencecache.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/source/blender/modifiers/intern/MOD_meshsequencecache.c b/source/blender/modifiers/intern/MOD_meshsequencecache.c
index 355ac9563dd..cf137784e65 100644
--- a/source/blender/modifiers/intern/MOD_meshsequencecache.c
+++ b/source/blender/modifiers/intern/MOD_meshsequencecache.c
@@ -65,6 +65,7 @@ static void copyData(ModifierData *md, ModifierData *target)
if (tmcmd->cache_file) {
id_us_plus(&tmcmd->cache_file->id);
+ tmcmd->reader = NULL;
}
}
@@ -75,6 +76,10 @@ static void freeData(ModifierData *md)
if (mcmd->cache_file) {
id_us_min(&mcmd->cache_file->id);
}
+
+ if (mcmd->reader) {
+ CacheReader_free(mcmd->reader);
+ }
}
static bool isDisabled(ModifierData *md, int UNUSED(useRenderParams))
@@ -102,10 +107,16 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
BKE_cachefile_ensure_handle(G.main, cache_file);
- DerivedMesh *result = ABC_read_mesh(cache_file->handle,
+ if (!mcmd->reader) {
+ mcmd->reader = CacheReader_open_alembic_object(cache_file->handle,
+ mcmd->reader,
+ ob,
+ mcmd->object_path);
+ }
+
+ DerivedMesh *result = ABC_read_mesh(mcmd->reader,
ob,
dm,
- mcmd->object_path,
time,
&err_str,
mcmd->read_flag);