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
path: root/source
diff options
context:
space:
mode:
authorBastien Montagne <montagne29@wanadoo.fr>2016-01-09 11:22:42 +0300
committerBastien Montagne <montagne29@wanadoo.fr>2016-01-09 11:29:31 +0300
commit969120258532b3a261d42eac9092f2bdfee5cd5f (patch)
tree884d9656253070bb1de2b47ee805e1a839041ade /source
parent425a4b23fdd327491addb2e8082c249ab6d8f237 (diff)
Fix T47121: Image node on linked and localized material loses image after reopening project.
Code 'localizing' the node of an ID (a material, here) was kind of a joke, setting id.lib to NULL is not enough, by far! Now calling ntreeMakeLocal(). And ntreeMakeLocal was also missing indirect->extern switch for its directly used IDs, which explains why they were lost after a save/reload. Note that here again, a big part of this 'localizing' code should be made generic using library_query stuff, but this is for id-remap, not current master...
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenkernel/intern/library.c2
-rw-r--r--source/blender/blenkernel/intern/node.c11
2 files changed, 12 insertions, 1 deletions
diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c
index 9e8d48531d7..1b73d02b8ed 100644
--- a/source/blender/blenkernel/intern/library.c
+++ b/source/blender/blenkernel/intern/library.c
@@ -1672,7 +1672,7 @@ void id_clear_lib_data(Main *bmain, ID *id)
ntree = ntreeFromID(id);
if (ntree) {
- ntree->id.lib = NULL;
+ ntreeMakeLocal(ntree);
}
if (GS(id->name) == ID_OB) {
diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c
index 70f2f9d26e0..ad714b825b4 100644
--- a/source/blender/blenkernel/intern/node.c
+++ b/source/blender/blenkernel/intern/node.c
@@ -1970,6 +1970,15 @@ bNodeTree *ntreeFromID(ID *id)
}
}
+static void extern_local_ntree(bNodeTree *ntree)
+{
+ for (bNode *node = ntree->nodes.first; node; node = node->next) {
+ if (node->id) {
+ id_lib_extern(node->id);
+ }
+ }
+}
+
void ntreeMakeLocal(bNodeTree *ntree)
{
Main *bmain = G.main;
@@ -1983,6 +1992,7 @@ void ntreeMakeLocal(bNodeTree *ntree)
if (ntree->id.lib == NULL) return;
if (ntree->id.us == 1) {
id_clear_lib_data(bmain, (ID *)ntree);
+ extern_local_ntree(ntree);
return;
}
@@ -2003,6 +2013,7 @@ void ntreeMakeLocal(bNodeTree *ntree)
/* if all users are local, we simply make tree local */
if (local && !lib) {
id_clear_lib_data(bmain, (ID *)ntree);
+ extern_local_ntree(ntree);
}
else if (local && lib) {
/* this is the mixed case, we copy the tree and assign it to local users */