diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2019-10-18 16:42:45 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2019-10-18 17:06:23 +0300 |
commit | 6183688c3560100dc1dcce3354cb622a135bc275 (patch) | |
tree | 91b0e7c4953dad793db1a5eb72c770016864f10d | |
parent | 725b59d9b44a632095c90e1912f14431b0171f1d (diff) |
Fix T70919: Proxies crash after building motion path
Was cause by recent fix for T65134 which assigned original object's
proxy_from to an evaluated pointer.
This is because motion path depsgraph does not include proxies, so
the pointer in an evaluated object was kept pointing to an original
object.
-rw-r--r-- | source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc b/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc index 1f9c12f604d..73a0823f84b 100644 --- a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc +++ b/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc @@ -755,6 +755,25 @@ void update_animation_data_after_copy(const ID *id_orig, ID *id_cow) update_nla_tracks_orig_pointers(&anim_data_orig->nla_tracks, &anim_data_cow->nla_tracks); } +/* Some builders (like motion path one) will ignore proxies from being built. This code makes it so + * proxy and proxy_group pointers never point to an original objects, preventing evaluation code + * from assign evaluated pointer to an original proxy->proxy_from. */ +void update_proxy_pointers_after_copy(const Depsgraph * /*depsgraph*/, + const Object * /*object_orig*/, + Object *object_cow) +{ + if (object_cow->proxy != NULL) { + if ((object_cow->proxy->id.tag & LIB_TAG_COPIED_ON_WRITE) == 0) { + object_cow->proxy = NULL; + } + } + if (object_cow->proxy_group != NULL) { + if ((object_cow->proxy_group->id.tag & LIB_TAG_COPIED_ON_WRITE) == 0) { + object_cow->proxy_group = NULL; + } + } +} + /* Do some special treatment of data transfer from original ID to it's * CoW complementary part. * @@ -788,6 +807,7 @@ void update_id_after_copy(const Depsgraph *depsgraph, } update_particles_after_copy(depsgraph, object_orig, object_cow); update_modifiers_orig_pointers(object_orig, object_cow); + update_proxy_pointers_after_copy(depsgraph, object_orig, object_cow); break; } case ID_SCE: { |