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:
authorJulian Eisel <eiseljulian@gmail.com>2016-10-07 16:14:49 +0300
committerJulian Eisel <eiseljulian@gmail.com>2016-10-07 16:14:49 +0300
commit53d1dbbe5cfb79aa2bc904f12172fb5ab6363080 (patch)
treeb7973a7d83afa76ba96932b71022e95a6fabf785 /source/blender/blenkernel/intern/library.c
parent4639664b3c48b0097071acae1281e679e306103e (diff)
parent90f5e61b72550bfe1e371626e99d3342214ce7ff (diff)
Merge branch 'master' into blender2.8
Diffstat (limited to 'source/blender/blenkernel/intern/library.c')
-rw-r--r--source/blender/blenkernel/intern/library.c30
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;