From 875c1313b12db97ad7dc00868566d4652be3316a Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Thu, 21 Jul 2016 23:02:37 +0200 Subject: Fix broken proxy object deletion. Check to ensure we do not delete last instancing of an indirectly used object (forbidden because it creates 'ghost' objects user have no real way to re-instance) was defeated by the backward pointer 'proxy_from', which generated a 'false' indirect usage of (local) proxy object itself (the one we are trying to delete). Fixed by actually considering that ID usage as local if proxy object itself is local (because that pointer actually does not 'pertain' to the object holding it, but to its proxy). Yeah, it's... complicated, twisted and ugly - it's proxy. --- source/blender/blenkernel/intern/library_query.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/source/blender/blenkernel/intern/library_query.c b/source/blender/blenkernel/intern/library_query.c index 04132114d2e..1ded6f6679f 100644 --- a/source/blender/blenkernel/intern/library_query.c +++ b/source/blender/blenkernel/intern/library_query.c @@ -442,7 +442,16 @@ void BKE_library_foreach_ID_link(ID *id, LibraryIDLinkCallback callback, void *u /* object->proxy is refcounted, but not object->proxy_group... *sigh* */ CALLBACK_INVOKE(object->proxy, IDWALK_USER); CALLBACK_INVOKE(object->proxy_group, IDWALK_NOP); + + /* Special case! + * Since this field is set/owned by 'user' of this ID (and not ID itself), it is only indirect usage + * if proxy object is linked... Twisted. */ + if (object->proxy_from) { + data.cd_flag = ID_IS_LINKED_DATABLOCK(object->proxy_from) ? IDWALK_INDIRECT_USAGE : 0; + } CALLBACK_INVOKE(object->proxy_from, IDWALK_NOP); + data.cd_flag = data_cd_flag; + CALLBACK_INVOKE(object->poselib, IDWALK_USER); data.cd_flag |= proxy_cd_flag; -- cgit v1.2.3