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:
authorChris Want <cwant@ualberta.ca>2012-07-06 20:55:35 +0400
committerChris Want <cwant@ualberta.ca>2012-07-06 20:55:35 +0400
commit16b165eed5e929f8f6ea2917fa4cb803e0c1dcc0 (patch)
treec83d9b4aeb73ff98e618a11cd1d649dcf1ed651a
parent5f792b08e4115e4231f92f67cdc5ffde50473055 (diff)
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!
-rw-r--r--source/blender/blenkernel/intern/depsgraph.c14
-rw-r--r--source/blender/blenkernel/intern/material.c15
2 files changed, 19 insertions, 10 deletions
diff --git a/source/blender/blenkernel/intern/depsgraph.c b/source/blender/blenkernel/intern/depsgraph.c
index 2faa882e3ea..05a2cfee8e6 100644
--- a/source/blender/blenkernel/intern/depsgraph.c
+++ b/source/blender/blenkernel/intern/depsgraph.c
@@ -352,10 +352,11 @@ static void dag_add_driver_relation(AnimData *adt, DagForest *dag, DagNode *node
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 @@ static void dag_add_material_nodetree_driver_relations(DagForest *dag, DagNode *
/* 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 @@ static void dag_add_material_driver_relations(DagForest *dag, DagNode *node, Mat
/* 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);
}
}
diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c
index 23f197155a1..de2b99fcbf9 100644
--- a/source/blender/blenkernel/intern/material.c
+++ b/source/blender/blenkernel/intern/material.c
@@ -1056,10 +1056,11 @@ int material_in_material(Material *parmat, Material *mat)
/* ****************** */
/* 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 @@ static void material_node_drivers_update(Scene *scene, bNodeTree *ntree, float c
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 @@ void material_drivers_update(Scene *scene, Material *ma, float ctime)
/* nodes */
if (ma->nodetree) {
- material_node_drivers_update(scene, ma->nodetree, ctime);
+ material_node_drivers_update(scene, ma->nodetree, ctime, ma);
}
}