Page MenuHome

bad_recursion.diff

Authored By
Chris Want (hos)
Nov 13 2013, 4:02 PM
Size
3 KB
Subscribers
None

bad_recursion.diff

Index: source/blender/blenkernel/intern/depsgraph.c
===================================================================
--- source/blender/blenkernel/intern/depsgraph.c (revision 48655)
+++ source/blender/blenkernel/intern/depsgraph.c (working copy)
@@ -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);
}
}
Index: source/blender/blenkernel/intern/material.c
===================================================================
--- source/blender/blenkernel/intern/material.c (revision 48655)
+++ source/blender/blenkernel/intern/material.c (working copy)
@@ -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);
}
}

File Metadata

Mime Type
text/x-diff
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
5c/d5/92509c4da02454f3e4e160caddd0

Event Timeline