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

Reply via email to