[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [60468] trunk/blender/source/blender/ blenkernel/intern/node.c: Fix #36850, Material Node Editor Crash Always.

Lukas Toenne lukas.toenne at googlemail.com
Tue Oct 1 10:18:16 CEST 2013


Revision: 60468
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=60468
Author:   lukastoenne
Date:     2013-10-01 08:18:16 +0000 (Tue, 01 Oct 2013)
Log Message:
-----------
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.

Revision Links:
--------------
    http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=55373

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/node.c

Modified: trunk/blender/source/blender/blenkernel/intern/node.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/node.c	2013-10-01 07:02:18 UTC (rev 60467)
+++ trunk/blender/source/blender/blenkernel/intern/node.c	2013-10-01 08:18:16 UTC (rev 60468)
@@ -1933,7 +1933,13 @@
 		 * 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,10 +1984,24 @@
 /* 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);
 	}




More information about the Bf-blender-cvs mailing list