Commit: 170f158b80ab732b1cc2341503f0f047d27a7ff7
Author: Lukas Tönne
Date: Wed Nov 25 09:28:48 2015 +0100
Branches: object_nodes
https://developer.blender.org/rB170f158b80ab732b1cc2341503f0f047d27a7ff7
Node tree pruning function for removing unused nodes.
This also removes the placeholder 'pass' nodes, which were already
being skipped and made unused.
===================================================================
M source/blender/blenvm/compile/bvm_nodegraph.cc
M source/blender/blenvm/compile/bvm_nodegraph.h
===================================================================
diff --git a/source/blender/blenvm/compile/bvm_nodegraph.cc
b/source/blender/blenvm/compile/bvm_nodegraph.cc
index a85491e..3082ac6 100644
--- a/source/blender/blenvm/compile/bvm_nodegraph.cc
+++ b/source/blender/blenvm/compile/bvm_nodegraph.cc
@@ -30,6 +30,7 @@
*/
#include <map>
+#include <set>
#include <vector>
#include <cassert>
#include <cstdio>
@@ -701,9 +702,49 @@ void NodeGraph::skip_pass_nodes()
}
}
+typedef std::set<NodeInstance *> NodeSet;
+
+static void used_nodes_append(NodeInstance *node, NodeSet &used_nodes)
+{
+ if (used_nodes.find(node) != used_nodes.end())
+ return;
+ used_nodes.insert(node);
+
+ for (NodeInstance::InputMap::iterator it = node->inputs.begin(); it !=
node->inputs.end(); ++it) {
+ NodeInstance::InputInstance &input = it->second;
+ if (input.link_node) {
+ used_nodes_append(input.link_node, used_nodes);
+ }
+ }
+}
+
+void NodeGraph::remove_unused_nodes()
+{
+ NodeSet used_nodes;
+ for (NodeGraph::OutputList::iterator it = outputs.begin(); it !=
outputs.end(); ++it) {
+ NodeGraphOutput &output = *it;
+ if (output.link_node) {
+ used_nodes_append(output.link_node, used_nodes);
+ }
+ }
+
+ NodeInstanceMap::iterator it = nodes.begin();
+ while (it != nodes.end()) {
+ if (used_nodes.find(it->second) == used_nodes.end()) {
+ /* it_del is invalidated on erase */
+ NodeInstanceMap::iterator it_del = it;
+ ++it;
+ nodes.erase(it_del);
+ }
+ else
+ it++;
+ }
+}
+
void NodeGraph::finalize()
{
skip_pass_nodes();
+ remove_unused_nodes();
}
/* === DEBUGGING === */
diff --git a/source/blender/blenvm/compile/bvm_nodegraph.h
b/source/blender/blenvm/compile/bvm_nodegraph.h
index 4bf66d4..c04e5fc 100644
--- a/source/blender/blenvm/compile/bvm_nodegraph.h
+++ b/source/blender/blenvm/compile/bvm_nodegraph.h
@@ -355,6 +355,7 @@ protected:
void remove_all_nodes();
void skip_pass_nodes();
+ void remove_unused_nodes();
public:
NodeInstanceMap nodes;
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs