[Bf-blender-cvs] [3960e56] object_nodes: Fix for depsgraph building of modifiers, missing nodes for ID blocks (textures).

Lukas Tönne noreply at git.blender.org
Thu May 26 08:48:53 CEST 2016


Commit: 3960e5671dd588c0fbcfd38bb1bc1111185edeef
Author: Lukas Tönne
Date:   Thu May 26 08:45:50 2016 +0200
Branches: object_nodes
https://developer.blender.org/rB3960e5671dd588c0fbcfd38bb1bc1111185edeef

Fix for depsgraph building of modifiers, missing nodes for ID blocks (textures).

The updateDepsgraph callback for modifiers needs to be used in both passes of
depsgraph building, once for creating nodes and then for relations. Without the
initial node building pass some datablocks like textures can be missing, if they
are not incidentally built by other means such as a render texture.

===================================================================

M	source/blender/depsgraph/intern/depsgraph_build.h
M	source/blender/depsgraph/intern/depsgraph_build_nodes.cc

===================================================================

diff --git a/source/blender/depsgraph/intern/depsgraph_build.h b/source/blender/depsgraph/intern/depsgraph_build.h
index c8b42ea..737f72a 100644
--- a/source/blender/depsgraph/intern/depsgraph_build.h
+++ b/source/blender/depsgraph/intern/depsgraph_build.h
@@ -103,8 +103,8 @@ struct DepsgraphNodeBuilder {
 
 	void build_scene(Main *bmain, Scene *scene);
 	SubgraphDepsNode *build_subgraph(Group *group);
-	void build_group(Scene *scene, Base *base, Group *group);
-	void build_object(Scene *scene, Base *base, Object *ob);
+	void build_group(Main *bmain, Scene *scene, Base *base, Group *group);
+	void build_object(Main *bmain, Scene *scene, Base *base, Object *ob);
 	void build_object_transform(Scene *scene, Object *ob);
 	void build_object_constraints(Scene *scene, Object *ob);
 	void build_pose_constraints(Object *ob, bPoseChannel *pchan);
@@ -117,7 +117,7 @@ struct DepsgraphNodeBuilder {
 	void build_rig(Scene *scene, Object *ob);
 	void build_proxy_rig(Object *ob);
 	void build_shapekeys(Key *key);
-	void build_obdata_geom(Scene *scene, Object *ob);
+	void build_obdata_geom(Main *bmain, Scene *scene, Object *ob);
 	void build_camera(Object *ob);
 	void build_lamp(Object *ob);
 	void build_nodetree(DepsNode *owner_node, bNodeTree *ntree);
diff --git a/source/blender/depsgraph/intern/depsgraph_build_nodes.cc b/source/blender/depsgraph/intern/depsgraph_build_nodes.cc
index 6ea94f1..0c71223 100644
--- a/source/blender/depsgraph/intern/depsgraph_build_nodes.cc
+++ b/source/blender/depsgraph/intern/depsgraph_build_nodes.cc
@@ -308,18 +308,18 @@ void DepsgraphNodeBuilder::build_scene(Main *bmain, Scene *scene)
 		Object *ob = base->object;
 
 		/* object itself */
-		build_object(scene, base, ob);
+		build_object(bmain, scene, base, ob);
 
 		/* object that this is a proxy for */
 		// XXX: the way that proxies work needs to be completely reviewed!
 		if (ob->proxy) {
 			ob->proxy->proxy_from = ob;
-			build_object(scene, base, ob->proxy);
+			build_object(bmain, scene, base, ob->proxy);
 		}
 
 		/* Object dupligroup. */
 		if (ob->dup_group) {
-			build_group(scene, base, ob->dup_group);
+			build_group(bmain, scene, base, ob->dup_group);
 		}
 	}
 
@@ -352,7 +352,8 @@ void DepsgraphNodeBuilder::build_scene(Main *bmain, Scene *scene)
 	}
 }
 
-void DepsgraphNodeBuilder::build_group(Scene *scene,
+void DepsgraphNodeBuilder::build_group(Main *bmain,
+                                       Scene *scene,
                                        Base *base,
                                        Group *group)
 {
@@ -366,7 +367,7 @@ void DepsgraphNodeBuilder::build_group(Scene *scene,
 	     go != NULL;
 	     go = go->next)
 	{
-		build_object(scene, base, go->ob);
+		build_object(bmain, scene, base, go->ob);
 	}
 }
 
@@ -405,7 +406,7 @@ SubgraphDepsNode *DepsgraphNodeBuilder::build_subgraph(Group *group)
 	return subgraph_node;
 }
 
-void DepsgraphNodeBuilder::build_object(Scene *scene, Base *base, Object *ob)
+void DepsgraphNodeBuilder::build_object(Main *bmain, Scene *scene, Base *base, Object *ob)
 {
 	if (ob->id.tag & LIB_TAG_DOIT) {
 		IDDepsNode *id_node = m_graph->find_id_node(&ob->id);
@@ -439,7 +440,7 @@ void DepsgraphNodeBuilder::build_object(Scene *scene, Base *base, Object *ob)
 				add_operation_node(&ob->id, DEPSNODE_TYPE_PARAMETERS, DEPSOP_TYPE_POST, NULL,
 				                   DEG_OPCODE_PLACEHOLDER, "Parameters Eval");
 
-				build_obdata_geom(scene, ob);
+				build_obdata_geom(bmain, scene, ob);
 				/* TODO(sergey): Only for until we support granular
 				 * update of curves.
 				 */
@@ -973,7 +974,7 @@ void DepsgraphNodeBuilder::build_shapekeys(Key *key)
 
 /* ObData Geometry Evaluation */
 // XXX: what happens if the datablock is shared!
-void DepsgraphNodeBuilder::build_obdata_geom(Scene *scene, Object *ob)
+void DepsgraphNodeBuilder::build_obdata_geom(Main *bmain, Scene *scene, Object *ob)
 {
 	ID *obdata = (ID *)ob->data;
 
@@ -1004,9 +1005,17 @@ void DepsgraphNodeBuilder::build_obdata_geom(Scene *scene, Object *ob)
 		ModifierData *md;
 
 		for (md = (ModifierData *)ob->modifiers.first; md; md = md->next) {
+			const ModifierTypeInfo *mti = modifierType_getInfo((ModifierType)md->type);
+			
 			add_operation_node(&ob->id, DEPSNODE_TYPE_GEOMETRY,
 			                   DEPSOP_TYPE_EXEC, function_bind(BKE_object_eval_modifier, _1, scene, ob, md),
 			                   DEG_OPCODE_GEOMETRY_MODIFIER, md->name);
+			
+			/* ensure ID nodes on which the modifier depends are built */
+			if (mti->updateDepsgraph) {
+				DepsgraphNodeBuilderHandle handle(this);
+				mti->updateDepsgraph(md, bmain, scene, ob, &handle.handle);
+			}
 		}
 	}




More information about the Bf-blender-cvs mailing list