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);
        }
 }
        

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to