diff options
author | Kévin Dietrich <kevin.dietrich@mailoo.org> | 2016-10-29 13:23:09 +0300 |
---|---|---|
committer | Kévin Dietrich <kevin.dietrich@mailoo.org> | 2016-10-29 13:23:09 +0300 |
commit | 753edafcb77d9aaf07fe869372319b841dd80681 (patch) | |
tree | 676445ce05cf2a8a53ced9deedf5bcba37fd9653 /source/blender/blenkernel/intern/constraint.c | |
parent | 0c13792437b3e501c06605876a0396e187c0f7da (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/blenkernel/intern/constraint.c')
-rw-r--r-- | source/blender/blenkernel/intern/constraint.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/source/blender/blenkernel/intern/constraint.c b/source/blender/blenkernel/intern/constraint.c index c4afa58b7d3..c7750707cc4 100644 --- a/source/blender/blenkernel/intern/constraint.c +++ b/source/blender/blenkernel/intern/constraint.c @@ -4364,8 +4364,14 @@ static void transformcache_evaluate(bConstraint *con, bConstraintOb *cob, ListBa BKE_cachefile_ensure_handle(G.main, cache_file); - ABC_get_transform(cache_file->handle, cob->ob, data->object_path, - cob->matrix, time, cache_file->scale); + if (!data->reader) { + data->reader = CacheReader_open_alembic_object(cache_file->handle, + data->reader, + cob->ob, + data->object_path); + } + + ABC_get_transform(data->reader, cob->matrix, time, cache_file->scale); #else UNUSED_VARS(con, cob); #endif @@ -4393,6 +4399,10 @@ static void transformcache_free(bConstraint *con) if (data->cache_file) { id_us_min(&data->cache_file->id); } + + if (data->reader) { + CacheReader_free(data->reader); + } } static void transformcache_new_data(void *cdata) |