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:
authorSergey Sharybin <sergey.vfx@gmail.com>2019-10-18 16:42:45 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2019-10-18 17:06:23 +0300
commit6183688c3560100dc1dcce3354cb622a135bc275 (patch)
tree91b0e7c4953dad793db1a5eb72c770016864f10d /source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc
parent725b59d9b44a632095c90e1912f14431b0171f1d (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.
Diffstat (limited to 'source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc')
-rw-r--r--source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc20
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: {