From 5c651554e2f98bff1cfdff0a6a6f029453dc3309 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Thu, 13 Oct 2016 13:32:08 +0200 Subject: Proxy appending: re-establish link to proxies when they are made local This allows appending of an entire scene from another blend file into this one, even when that blend file contains proxified armatures. This replaces the approach from commit 1cdc54dc7db85766. Thanks @sergey for the help. --- source/blender/blenkernel/intern/library.c | 49 ++++++------------------------ 1 file changed, 9 insertions(+), 40 deletions(-) (limited to 'source/blender/blenkernel/intern/library.c') diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c index c66ac31982c..a687d16a910 100644 --- a/source/blender/blenkernel/intern/library.c +++ b/source/blender/blenkernel/intern/library.c @@ -1592,15 +1592,6 @@ void id_clear_lib_data_ex(Main *bmain, ID *id, const bool id_in_mainlist) if ((key = BKE_key_from_id(id))) { id_clear_lib_data_ex(bmain, &key->id, id_in_mainlist); /* sigh, why are keys in Main? */ } - - if (GS(id->name) == ID_OB) { - Object *object = (Object *)id; - if (object->proxy_from != NULL) { - object->proxy_from->proxy = NULL; - object->proxy_from->proxy_group = NULL; - } - object->proxy = object->proxy_from = object->proxy_group = NULL; - } } void id_clear_lib_data(Main *bmain, ID *id) @@ -1675,7 +1666,15 @@ void BKE_library_make_local(Main *bmain, const Library *lib, const bool untagged if (lib == NULL || id->lib == lib) { if (id->lib) { /* In this specific case, we do want to make ID local even if it has no local usage yet... */ - id_make_local(bmain, id, false, true); + if (GS(id->name) == ID_OB) { + /* Special case for objects because we don't want proxy pointers to be + * cleared yet. This will happen down the road in this function. + */ + BKE_object_make_local_ex(bmain, (Object*)id, true, false); + } + else { + id_make_local(bmain, id, false, true); + } } else { id->tag &= ~(LIB_TAG_EXTERN | LIB_TAG_INDIRECT | LIB_TAG_NEW); @@ -1715,36 +1714,6 @@ void BKE_library_make_local(Main *bmain, const Library *lib, const bool untagged bool is_local = false, is_lib = false; BKE_library_ID_test_usages(bmain, id, &is_local, &is_lib); - - /* Attempt to re-link appended proxy objects. This allows appending of an entire scene - * from another blend file into this one, even when that blend file contains proxified - * armatures. Since the proxified object needs to be linked (not local), this will - * only work when the "Localize all" checkbox is disabled. - * TL;DR: this is a dirty hack on top of an already weak feature (proxies). */ - if (GS(id->name) == ID_OB && ((Object *)id)->proxy != NULL) { - Object *ob = (Object *)id; - Object *ob_new = (Object *)id->newid; - - /* Proxies only work when the proxified object is linked-in from a library. */ - if (ob->proxy->id.lib == NULL) { - printf("Warning, proxy object %s will loose its link to %s, because the " - "proxified object is local.\n", id->newid->name, ob->proxy->id.name); - } - /* We can only switch the proxy'ing to a made-local proxy if it is no longer - * referred to from a library. Not checking for local use; if new local proxy - * was not used locally would be a nasty bug! */ - else if (is_local || is_lib) { - printf("Warning, made-local proxy object %s will loose its link to %s, " - "because the linked-in proxy is referenced (is_local=%i, is_lib=%i).\n", - id->newid->name, ob->proxy->id.name, is_local, is_lib); - } - else { - /* we can switch the proxy'ing from the linked-in to the made-local proxy. */ - BKE_object_make_proxy(ob_new, ob->proxy, ob->proxy_group); - ob->proxy = ob->proxy_from = ob->proxy_group = NULL; - } - } - if (!is_local && !is_lib) { BKE_libblock_free(bmain, id); do_loop = true; -- cgit v1.2.3