diff options
author | Bastien Montagne <montagne29@wanadoo.fr> | 2016-01-09 11:22:42 +0300 |
---|---|---|
committer | Bastien Montagne <montagne29@wanadoo.fr> | 2016-01-09 11:29:31 +0300 |
commit | 969120258532b3a261d42eac9092f2bdfee5cd5f (patch) | |
tree | 884d9656253070bb1de2b47ee805e1a839041ade /source/blender/blenkernel/intern/node.c | |
parent | 425a4b23fdd327491addb2e8082c249ab6d8f237 (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/blender/blenkernel/intern/node.c')
-rw-r--r-- | source/blender/blenkernel/intern/node.c | 11 |
1 files changed, 11 insertions, 0 deletions
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 */ |