[Bf-blender-cvs] [7184308] depsgraph_refactor: Entry/Exit operations in components for replacing outer relations.

Lukas Tönne noreply at git.blender.org
Tue May 13 18:41:12 CEST 2014


Commit: 71843081ecd23fba40a0113794b73217828e3bff
Author: Lukas Tönne
Date:   Tue May 13 18:25:37 2014 +0200
https://developer.blender.org/rB71843081ecd23fba40a0113794b73217828e3bff

Entry/Exit operations in components for replacing outer relations.

Each component now has one designated entry and one exit operation. If
all nodes depend on a single entry/exit already after the main build
step, these will be used directly. Otherwise an explicit No-Op node will
be created to cut down the number of necessary relations.

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

M	source/blender/depsgraph/intern/depsgraph_build.cpp
M	source/blender/depsgraph/intern/depsgraph_build.h
M	source/blender/depsgraph/intern/depsgraph_build_nodes.cpp
M	source/blender/depsgraph/intern/depsgraph_types.h
M	source/blender/depsgraph/intern/depsnode.h
M	source/blender/depsgraph/intern/depsnode_component.cpp
M	source/blender/depsgraph/intern/depsnode_component.h
M	source/blender/depsgraph/intern/depsnode_operation.cpp
M	source/blender/depsgraph/intern/depsnode_operation.h

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

diff --git a/source/blender/depsgraph/intern/depsgraph_build.cpp b/source/blender/depsgraph/intern/depsgraph_build.cpp
index 78b60c2..f308748 100644
--- a/source/blender/depsgraph/intern/depsgraph_build.cpp
+++ b/source/blender/depsgraph/intern/depsgraph_build.cpp
@@ -112,6 +112,7 @@ static eDepsNode_Type deg_build_scene_component_type(eDepsSceneComponentType com
 		case DEG_SCENE_COMP_ANIMATION:      return DEPSNODE_TYPE_ANIMATION;
 		case DEG_SCENE_COMP_SEQUENCER:      return DEPSNODE_TYPE_SEQUENCER;
 	}
+	return DEPSNODE_TYPE_UNDEFINED;
 }
 
 static eDepsNode_Type deg_build_object_component_type(eDepsObjectComponentType component)
@@ -126,6 +127,7 @@ static eDepsNode_Type deg_build_object_component_type(eDepsObjectComponentType c
 		case DEG_OB_COMP_BONE:              return DEPSNODE_TYPE_BONE;
 		case DEG_OB_COMP_EVAL_PARTICLES:    return DEPSNODE_TYPE_EVAL_PARTICLES;
 	}
+	return DEPSNODE_TYPE_UNDEFINED;
 }
 
 void DEG_add_scene_relation(DepsNodeHandle *handle, struct Scene *scene, eDepsSceneComponentType component, const char *description)
@@ -234,6 +236,65 @@ OperationDepsNode *DepsgraphNodeBuilder::add_operation_node(IDDepsNode *id_node,
 	return op_node;
 }
 
+void DepsgraphNodeBuilder::verify_entry_exit_operations(ComponentDepsNode *node)
+{
+	typedef std::vector<OperationDepsNode*> OperationsVector;
+	
+	/* cache these in a vector, so we don't invalidate the iterators
+	 * by adding operations inside the loop
+	 */
+	OperationsVector entry_ops, exit_ops;
+	
+	for (ComponentDepsNode::OperationMap::const_iterator it = node->operations.begin(); it != node->operations.end(); ++it) {
+		OperationDepsNode *op_node = it->second;
+		
+		/* entry node? */
+		if (op_node->inlinks.empty())
+			entry_ops.push_back(op_node);
+		
+		/* exit node? */
+		if (op_node->outlinks.empty())
+			exit_ops.push_back(op_node);
+	}
+	
+	if (entry_ops.size() == 1) {
+		/* single entry op, just use this directly */
+		node->entry_operation = entry_ops.front();
+	}
+	else if (entry_ops.size() > 1) {
+		/* multiple entry ops, add a barrier node as a single entry point */
+		node->entry_operation = node->add_operation(DEPSNODE_TYPE_OP_NOOP, DEPSOP_TYPE_INIT, NULL, "Entry");
+		for (OperationsVector::const_iterator it = entry_ops.begin(); it != entry_ops.end(); ++it) {
+			OperationDepsNode *op_node = *it;
+			m_graph->add_new_relation(node->entry_operation, op_node, DEPSREL_TYPE_OPERATION, "Component entry relation");
+		}
+	}
+	
+	if (exit_ops.size() == 1) {
+		/* single exit op, just use this directly */
+		node->exit_operation = exit_ops.front();
+	}
+	else if (exit_ops.size() > 1) {
+		/* multiple exit ops, add a barrier node as a single exit point */
+		node->exit_operation = node->add_operation(DEPSNODE_TYPE_OP_NOOP, DEPSOP_TYPE_OUT, NULL, "Exit");
+		for (OperationsVector::const_iterator it = exit_ops.begin(); it != exit_ops.end(); ++it) {
+			OperationDepsNode *op_node = *it;
+			m_graph->add_new_relation(op_node, node->exit_operation, DEPSREL_TYPE_OPERATION, "Component exit relation");
+		}
+	}
+}
+
+void DepsgraphNodeBuilder::verify_entry_exit_operations()
+{
+	for (Depsgraph::IDNodeMap::const_iterator it_id = m_graph->id_hash.begin(); it_id != m_graph->id_hash.end(); ++it_id) {
+		IDDepsNode *id_node = it_id->second;
+		for (IDDepsNode::ComponentMap::const_iterator it_comp = id_node->components.begin(); it_comp != id_node->components.end(); ++it_comp) {
+			ComponentDepsNode *comp_node = it_comp->second;
+			verify_entry_exit_operations(comp_node);
+		}
+	}
+}
+
 
 /* ************************************************* */
 /* Relations Builder */
@@ -320,19 +381,6 @@ void DepsgraphRelationBuilder::add_operation_relation(OperationDepsNode *node_fr
 	m_graph->add_new_relation(node_from, node_to, type, description);
 }
 
-void DepsgraphRelationBuilder::add_node_relation(DepsNode *node_from, DepsNode *node_to,
-                                                 eDepsRelation_Type type, const string &description)
-{
-	OperationDepsNode *op_from = node_from->find_exit_operation();
-	OperationDepsNode *op_to = node_to->find_entry_operation();
-	if (op_from && op_to) {
-		add_operation_relation(op_from, op_to, type, description);
-	}
-	else {
-		/* XXX error handling necessary? */
-	}
-}
-
 /* -------------------------------------------------- */
 
 /* Build depsgraph for the given scene, and dump results in given graph container */
@@ -354,7 +402,9 @@ void DEG_graph_build_from_scene(Depsgraph *graph, Main *bmain, Scene *scene)
 	 */
 	node_builder.add_root_node();
 	node_builder.build_scene(scene);
-
+	
+	node_builder.verify_entry_exit_operations();
+	
 	DepsgraphRelationBuilder relation_builder(graph);
 	/* hook scene up to the root node as entrypoint to graph */
 	relation_builder.add_relation(RootKey(), IDKey(scene), DEPSREL_TYPE_ROOT_TO_ACTIVE, "Root to Active Scene");
diff --git a/source/blender/depsgraph/intern/depsgraph_build.h b/source/blender/depsgraph/intern/depsgraph_build.h
index 6f1ca14..e14ddcc 100644
--- a/source/blender/depsgraph/intern/depsgraph_build.h
+++ b/source/blender/depsgraph/intern/depsgraph_build.h
@@ -74,6 +74,8 @@ struct DepsgraphNodeBuilder {
 	                                      eDepsOperation_Type optype, DepsEvalOperationCb op, const string &description,
 	                                      PointerRNA ptr);
 	
+	void verify_entry_exit_operations();
+	
 	IDDepsNode *build_scene(Scene *scene);
 	SubgraphDepsNode *build_subgraph(Group *group);
 	void build_group(Group *group);
@@ -98,6 +100,9 @@ struct DepsgraphNodeBuilder {
 	void build_world(World *world);
 	void build_compositor(IDDepsNode *scene_node, Scene *scene);
 	
+protected:
+	void verify_entry_exit_operations(ComponentDepsNode *node);
+	
 private:
 	Main *m_bmain;
 	Depsgraph *m_graph;
@@ -202,8 +207,6 @@ protected:
 	
 	void add_operation_relation(OperationDepsNode *node_from, OperationDepsNode *node_to,
 	                            eDepsRelation_Type type, const string &description);
-	void add_node_relation(DepsNode *node_from, DepsNode *node_to,
-	                       eDepsRelation_Type type, const string &description);
 	
 	template <typename KeyType>
 	DepsNodeHandle create_node_handle(const KeyType &key, const string &default_name = "");
@@ -213,33 +216,55 @@ private:
 };
 
 struct DepsNodeHandle {
-	DepsNodeHandle(DepsgraphRelationBuilder *builder, DepsNode *node, const string &default_name = "") :
+	DepsNodeHandle(DepsgraphRelationBuilder *builder, OperationDepsNode *node, const string &default_name = "") :
 	    builder(builder),
 	    node(node),
 	    default_name(default_name)
 	{}
 	
 	DepsgraphRelationBuilder *builder;
-	DepsNode *node;
+	OperationDepsNode *node;
 	const string &default_name;
 };
 
 /* Inline Function Templates -------------------------------------------------- */
 
+#include "depsnode_component.h"
+
+template <class NodeType>
+static OperationDepsNode *get_entry_operation(NodeType *node)
+{ return NULL; }
+
+template <class NodeType>
+static OperationDepsNode *get_exit_operation(NodeType *node)
+{ return NULL; }
+
+template <> OperationDepsNode *get_entry_operation(OperationDepsNode *node)
+{ return node; }
+
+template <> OperationDepsNode *get_exit_operation(OperationDepsNode *node)
+{ return node; }
+
+template <> OperationDepsNode *get_entry_operation(ComponentDepsNode *node)
+{ return node ? node->entry_operation : NULL; }
+
+template <> OperationDepsNode *get_exit_operation(ComponentDepsNode *node)
+{ return node ? node->exit_operation : NULL; }
+
 template <typename KeyFrom, typename KeyTo>
 void DepsgraphRelationBuilder::add_relation(const KeyFrom &key_from, const KeyTo &key_to,
                                             eDepsRelation_Type type, const string &description)
 {
-	DepsNode *node_from = find_node(key_from);
-	DepsNode *node_to = find_node(key_to);
-	if (node_from && node_to) {
-		add_node_relation(node_from, node_to, type, description);
+	OperationDepsNode *op_from = get_exit_operation(find_node(key_from));
+	OperationDepsNode *op_to = get_entry_operation(find_node(key_to));
+	if (op_from && op_to) {
+		add_operation_relation(op_from, op_to, type, description);
 	}
 	else {
-		if (!node_from) {
+		if (!op_from) {
 			/* XXX TODO handle as error or report if needed */
 		}
-		if (!node_to) {
+		if (!op_to) {
 			/* XXX TODO handle as error or report if needed */
 		}
 	}
@@ -249,16 +274,16 @@ template <typename KeyType>
 void DepsgraphRelationBuilder::add_node_handle_relation(const KeyType &key_from, const DepsNodeHandle *handle,
                                                         eDepsRelation_Type type, const string &description)
 {
-	DepsNode *node_from = find_node(key_from);
-	DepsNode *node_to = handle->node;
-	if (node_from && node_to) {
-		add_node_relation(node_from, node_to, type, description);
+	OperationDepsNode *op_from = get_exit_operation(find_node(key_from));
+	OperationDepsNode *op_to = get_entry_operation(handle->node);
+	if (op_from && op_to) {
+		add_operation_relation(op_from, op_to, type, description);
 	}
 	else {
-		if (!node_from) {
+		if (!op_from) {
 			/* XXX TODO handle as error or report if needed */
 		}
-		if (!node_to) {
+		if (!op_to) {
 			/* XXX TODO handle as error or report if needed */
 		}
 	}
diff --git a/source/blender/depsgraph/intern/depsgraph_build_nodes.cpp b/source/blender/depsgraph/intern/depsgraph_build_nodes.cpp
index 5aac136..65d666f 100644
--- a/source/blender/depsgraph/intern/depsgraph_build_nodes.cpp
+++ b/source/blender/depsgraph/intern/depsgraph_build_nodes.cpp
@@ -221,7 +221,7 @@ IDDepsNode *DepsgraphNodeBuilder::build_object(Scene *scene, Object *ob)
 	IDDepsNode *ob_node = add_id_node(ob);
 	
 	/* standard components */
-	/*ComponentDepsNode *params_node =*/ add_component_node(ob_node, DEPSNODE_TYPE_OP_PARAMETER);
+	/*ComponentDepsNode *params_node =*/ add_component_node(ob_node, DEPSNODE_TYPE_PARAMETERS);
 	ComponentDepsNode *trans_node = build_object_transform(ob, ob_node);
 	
 	/* AnimData */
diff --git a/source/blender/depsgraph/intern/depsgraph_types.h b/source/blender/depsgraph/intern/depsgraph_types.h
index 57fd8d8..5aef027 100644
--- a/source/blender/depsgraph/intern/depsgraph_types.h
+++ b/source/blender/depsgraph/intern/depsgraph_types.h
@@ -8

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list