diff options
author | Julian Eisel <eiseljulian@gmail.com> | 2016-10-07 16:14:49 +0300 |
---|---|---|
committer | Julian Eisel <eiseljulian@gmail.com> | 2016-10-07 16:14:49 +0300 |
commit | 53d1dbbe5cfb79aa2bc904f12172fb5ab6363080 (patch) | |
tree | b7973a7d83afa76ba96932b71022e95a6fabf785 /source/blender/blenkernel/intern/library.c | |
parent | 4639664b3c48b0097071acae1281e679e306103e (diff) | |
parent | 90f5e61b72550bfe1e371626e99d3342214ce7ff (diff) |
Merge branch 'master' into blender2.8
Diffstat (limited to 'source/blender/blenkernel/intern/library.c')
-rw-r--r-- | source/blender/blenkernel/intern/library.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c index ca98f5d04b7..e917c79a92f 100644 --- a/source/blender/blenkernel/intern/library.c +++ b/source/blender/blenkernel/intern/library.c @@ -1698,6 +1698,36 @@ 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; |