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:
authorLukas Toenne <lukas.toenne@googlemail.com>2013-10-01 12:18:16 +0400
committerLukas Toenne <lukas.toenne@googlemail.com>2013-10-01 12:18:16 +0400
commit4cd779936484043b976f4d84a4480fdbda30f548 (patch)
tree1d550cc06f169fe1a91c9924d301322fa4ff6754 /source/blender/blenkernel/intern/node.c
parent9550d05a1c1ab065d73fc1854739a6f0bf500bc2 (diff)
Fix #36850, Material Node Editor Crash Always.
This problem was introduced with pynodes merge in r55373. It's caused by missing localization of node groups in shaders in cases where GLSL + node previews causes threading conflicts. I'm not quite sure why we didn't do this before, but now all node groups also get localized recursively.
Diffstat (limited to 'source/blender/blenkernel/intern/node.c')
-rw-r--r--source/blender/blenkernel/intern/node.c28
1 files changed, 24 insertions, 4 deletions
diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c
index 2305c0696af..7cdc2ce856a 100644
--- a/source/blender/blenkernel/intern/node.c
+++ b/source/blender/blenkernel/intern/node.c
@@ -1933,7 +1933,13 @@ bNodeTree *ntreeLocalize(bNodeTree *ntree)
* Note: previews are not copied here.
*/
ltree = ntreeCopyTree_internal(ntree, FALSE, FALSE, FALSE);
-
+
+ for (node = ltree->nodes.first; node; node = node->next) {
+ if (node->type == NODE_GROUP && node->id) {
+ node->id = (ID *)ntreeLocalize((bNodeTree *)node->id);
+ }
+ }
+
if (adt) {
AnimData *ladt = BKE_animdata_from_id(&ltree->id);
@@ -1978,9 +1984,23 @@ void ntreeLocalSync(bNodeTree *localtree, bNodeTree *ntree)
/* we have to assume the editor already changed completely */
void ntreeLocalMerge(bNodeTree *localtree, bNodeTree *ntree)
{
- if (localtree && ntree) {
- if (ntree->typeinfo->local_merge)
- ntree->typeinfo->local_merge(localtree, ntree);
+ bNode *node;
+
+ if (localtree) {
+ if (ntree) {
+ if (ntree->typeinfo->local_merge)
+ ntree->typeinfo->local_merge(localtree, ntree);
+ }
+
+ for (node = localtree->nodes.first; node; node = node->next) {
+ if (node->type == NODE_GROUP && node->id) {
+ bNodeTree *localgroup = (bNodeTree *)node->id;
+ /* not passing original node tree for node group merge,
+ * because there may be multiple instances using the same group tree.
+ */
+ ntreeLocalMerge(localgroup, NULL);
+ }
+ }
ntreeFreeTree_ex(localtree, FALSE);
MEM_freeN(localtree);