[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