[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [48687] trunk/blender/source/blender/ blenkernel/intern: Fix for bug 32017.

Chris Want cwant at ualberta.ca
Fri Jul 6 18:55:35 CEST 2012


Revision: 48687
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=48687
Author:   hos
Date:     2012-07-06 16:55:35 +0000 (Fri, 06 Jul 2012)
Log Message:
-----------
Fix for bug 32017.

There was some bad recursion introduced recently that caused crashes
when a Material node is the same material as the material itself (e.g.,
if Material.001 has a node with Material.001).

This commit attempt to correct this by keeping track of the material
at the root of the node tree, and doesn't recurse further if it
encounters it again within the nodetree.

Joshua, please review!

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

Modified: trunk/blender/source/blender/blenkernel/intern/depsgraph.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/depsgraph.c	2012-07-06 16:48:57 UTC (rev 48686)
+++ trunk/blender/source/blender/blenkernel/intern/depsgraph.c	2012-07-06 16:55:35 UTC (rev 48687)
@@ -352,10 +352,11 @@
 static void dag_add_material_driver_relations(DagForest *dag, DagNode *node, Material *ma);
 
 /* recursive handling for material nodetree drivers */
-static void dag_add_material_nodetree_driver_relations(DagForest *dag, DagNode *node, bNodeTree *ntree)
+static void dag_add_material_nodetree_driver_relations(DagForest *dag, DagNode *node, bNodeTree *ntree, Material *rootma)
 {
 	bNode *n;
-	
+	Material *ma;
+
 	/* nodetree itself */
 	if (ntree->adt) {
 		dag_add_driver_relation(ntree->adt, dag, node, 1);
@@ -364,10 +365,13 @@
 	/* nodetree's nodes... */
 	for (n = ntree->nodes.first; n; n = n->next) {
 		if (n->id && GS(n->id->name) == ID_MA) {
-			dag_add_material_driver_relations(dag, node, (Material *)n->id);
+            ma = (Material *)n->id;
+            if (ma != rootma) {
+                dag_add_material_driver_relations(dag, node, ma);
+            }
 		}
 		else if (n->type == NODE_GROUP && n->id) {
-			dag_add_material_nodetree_driver_relations(dag, node, (bNodeTree *)n->id);
+			dag_add_material_nodetree_driver_relations(dag, node, (bNodeTree *)n->id, rootma);
 		}
 	}
 }
@@ -386,7 +390,7 @@
 	
 	/* material's nodetree */
 	if (ma->nodetree) {
-		dag_add_material_nodetree_driver_relations(dag, node, ma->nodetree);
+		dag_add_material_nodetree_driver_relations(dag, node, ma->nodetree, ma);
 	}
 }
 

Modified: trunk/blender/source/blender/blenkernel/intern/material.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/material.c	2012-07-06 16:48:57 UTC (rev 48686)
+++ trunk/blender/source/blender/blenkernel/intern/material.c	2012-07-06 16:55:35 UTC (rev 48687)
@@ -1056,10 +1056,11 @@
 /* ****************** */
 
 /* Update drivers for materials in a nodetree */
-static void material_node_drivers_update(Scene *scene, bNodeTree *ntree, float ctime)
+static void material_node_drivers_update(Scene *scene, bNodeTree *ntree, float ctime, Material *rootma)
 {
 	bNode *node;
-	
+	Material *ma;
+
 	/* nodetree itself */
 	if (ntree->adt && ntree->adt->drivers.first) {
 		BKE_animsys_evaluate_animdata(scene, &ntree->id, ntree->adt, ctime, ADT_RECALC_DRIVERS);
@@ -1069,10 +1070,14 @@
 	for (node = ntree->nodes.first; node; node = node->next) {
 		if (node->id && GS(node->id->name) == ID_MA) {
 			/* TODO: prevent infinite recursion here... */
-			material_drivers_update(scene, (Material *)node->id, ctime);
+            ma = (Material *)node->id;
+            if (ma != rootma) {
+                material_drivers_update(scene, ma, ctime);
+            }
 		}
 		else if (node->type == NODE_GROUP && node->id) {
-			material_node_drivers_update(scene, (bNodeTree *)node->id, ctime);
+			material_node_drivers_update(scene, (bNodeTree *)node->id,
+                                         ctime, rootma);
 		}
 	}
 }
@@ -1094,7 +1099,7 @@
 	
 	/* nodes */
 	if (ma->nodetree) {
-		material_node_drivers_update(scene, ma->nodetree, ctime);
+		material_node_drivers_update(scene, ma->nodetree, ctime, ma);
 	}
 }
 	




More information about the Bf-blender-cvs mailing list