[Bf-blender-cvs] [a4cf1eb0350] functions: export inlined node tree as dot graph

Jacques Lucke noreply at git.blender.org
Sun Nov 24 14:59:23 CET 2019


Commit: a4cf1eb035024759b3483ef6a0be00fa846f83e4
Author: Jacques Lucke
Date:   Sun Nov 24 14:58:43 2019 +0100
Branches: functions
https://developer.blender.org/rBa4cf1eb035024759b3483ef6a0be00fa846f83e4

export inlined node tree as dot graph

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

M	source/blender/blenkernel/BKE_inlined_node_tree.h
M	source/blender/blenkernel/intern/inlined_node_tree.cc
M	source/blender/functions/intern/vtree_multi_function_network/builder.cc

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

diff --git a/source/blender/blenkernel/BKE_inlined_node_tree.h b/source/blender/blenkernel/BKE_inlined_node_tree.h
index 1f4eab8151d..e581507020d 100644
--- a/source/blender/blenkernel/BKE_inlined_node_tree.h
+++ b/source/blender/blenkernel/BKE_inlined_node_tree.h
@@ -104,7 +104,7 @@ class InlinedNodeTree : BLI::NonCopyable, BLI::NonMovable {
 /* Inline functions
  ********************************************/
 
-const XNode &XSocket::node() const
+inline const XNode &XSocket::node() const
 {
   return *m_node;
 }
diff --git a/source/blender/blenkernel/intern/inlined_node_tree.cc b/source/blender/blenkernel/intern/inlined_node_tree.cc
index a9b278503a1..da221282610 100644
--- a/source/blender/blenkernel/intern/inlined_node_tree.cc
+++ b/source/blender/blenkernel/intern/inlined_node_tree.cc
@@ -1,6 +1,7 @@
 #include "BKE_inlined_node_tree.h"
 
 #include "BLI_string.h"
+#include "BLI_dot_export.h"
 
 extern "C" {
 void WM_clipboard_text_set(const char *buf, bool selection);
@@ -74,6 +75,7 @@ static bool is_group_node(const VNode &vnode)
 
 InlinedNodeTree::InlinedNodeTree(bNodeTree *btree, BTreeVTreeMap &vtrees) : m_btree(btree)
 {
+  SCOPED_TIMER(__func__);
   const VirtualNodeTree &main_vtree = get_vtree(vtrees, btree);
 
   Vector<XNode *> nodes;
@@ -165,60 +167,75 @@ void InlinedNodeTree::expand_group_node(XNode &group_node,
   Vector<const VInputSocket *> group_outputs = get_group_outputs(vtree);
 
   /* Relink links to group inputs. */
-  for (const VOutputSocket *from_vsocket : group_inputs) {
-    XOutputSocket &from_socket = *outputs_map.lookup(from_vsocket);
+  for (uint input_index : group_inputs.index_iterator()) {
+    XOutputSocket &inside_interface = *outputs_map.lookup(group_inputs[input_index]);
+    XInputSocket &outside_interface = *group_node.m_inputs[input_index];
 
     /* If the group input has no origin, insert a dummy group input. */
-    XInputSocket &outside_group_input = *group_node.m_inputs[from_vsocket->index()];
-    if (outside_group_input.m_linked_sockets.size() == 0 &&
-        outside_group_input.m_linked_group_inputs.size() == 0) {
+    if (outside_interface.m_linked_sockets.size() == 0 &&
+        outside_interface.m_linked_group_inputs.size() == 0) {
       XGroupInput &group_input_dummy = *m_allocator.construct<XGroupInput>().release();
-      group_input_dummy.m_vsocket = outside_group_input.m_vsocket;
+      group_input_dummy.m_vsocket = outside_interface.m_vsocket;
       group_input_dummy.m_parent = group_node.m_parent;
 
-      group_input_dummy.m_linked_sockets.append(&outside_group_input);
-      outside_group_input.m_linked_group_inputs.append(&group_input_dummy);
+      group_input_dummy.m_linked_sockets.append(&outside_interface);
+      outside_interface.m_linked_group_inputs.append(&group_input_dummy);
     }
 
-    for (XInputSocket *to_socket : from_socket.m_linked_sockets) {
-      to_socket->m_linked_sockets.remove_first_occurrence_and_reorder(&from_socket);
+    for (XInputSocket *inside_connected : inside_interface.m_linked_sockets) {
+      inside_connected->m_linked_sockets.remove_first_occurrence_and_reorder(&inside_interface);
 
-      for (XOutputSocket *outer_from : outside_group_input.m_linked_sockets) {
-        to_socket->m_linked_sockets.append(outer_from);
+      for (XOutputSocket *outside_connected : outside_interface.m_linked_sockets) {
+        outside_connected->m_linked_sockets.remove_first_occurrence_and_reorder(
+            &outside_interface);
+
+        inside_connected->m_linked_sockets.append(outside_connected);
+        outside_connected->m_linked_sockets.append(inside_connected);
       }
 
-      for (XGroupInput *outer_from : outside_group_input.m_linked_group_inputs) {
-        to_socket->m_linked_group_inputs.append(outer_from);
+      for (XGroupInput *outside_connected : outside_interface.m_linked_group_inputs) {
+        outside_connected->m_linked_sockets.remove_first_occurrence_and_reorder(
+            &outside_interface);
+
+        inside_connected->m_linked_group_inputs.append(outside_connected);
+        outside_connected->m_linked_sockets.append(inside_connected);
       }
     }
 
-    from_socket.m_linked_sockets.clear();
+    inside_interface.m_linked_sockets.clear();
+    outside_interface.m_linked_sockets.clear();
+    outside_interface.m_linked_group_inputs.clear();
   }
 
   /* Relink links to group outputs. */
-  for (const VInputSocket *to_vsocket : group_outputs) {
-    XInputSocket &to_socket = *inputs_map.lookup(to_vsocket);
-    XOutputSocket &outside_group_output = *group_node.m_outputs[to_vsocket->index()];
+  for (uint output_index : group_outputs.index_iterator()) {
+    XInputSocket &inside_interface = *inputs_map.lookup(group_outputs[output_index]);
+    XOutputSocket &outside_interface = *group_node.m_outputs[output_index];
 
-    for (XOutputSocket *from_socket : to_socket.m_linked_sockets) {
-      from_socket->m_linked_sockets.remove_first_occurrence_and_reorder(&to_socket);
+    for (XOutputSocket *inside_connected : inside_interface.m_linked_sockets) {
+      inside_connected->m_linked_sockets.remove_first_occurrence_and_reorder(&inside_interface);
 
-      for (XInputSocket *to_socket : outside_group_output.m_linked_sockets) {
-        from_socket->m_linked_sockets.append(to_socket);
-        to_socket->m_linked_sockets.append(from_socket);
+      for (XInputSocket *outside_connected : outside_interface.m_linked_sockets) {
+        inside_connected->m_linked_sockets.append(outside_connected);
+        outside_connected->m_linked_sockets.append(inside_connected);
       }
     }
 
-    for (XGroupInput *from_socket : to_socket.m_linked_group_inputs) {
-      from_socket->m_linked_sockets.remove_first_occurrence_and_reorder(&to_socket);
+    for (XGroupInput *inside_connected : inside_interface.m_linked_group_inputs) {
+      inside_connected->m_linked_sockets.remove_first_occurrence_and_reorder(&inside_interface);
 
-      for (XInputSocket *to_socket : outside_group_output.m_linked_sockets) {
-        from_socket->m_linked_sockets.append(to_socket);
-        to_socket->m_linked_group_inputs.append(from_socket);
+      for (XInputSocket *outside_connected : outside_interface.m_linked_sockets) {
+        inside_connected->m_linked_sockets.append(outside_connected);
+        outside_connected->m_linked_group_inputs.append(inside_connected);
       }
     }
 
-    to_socket.m_linked_group_inputs.clear();
+    for (XInputSocket *outside_connected : outside_interface.m_linked_sockets) {
+      outside_connected->m_linked_sockets.remove_first_occurrence_and_reorder(&outside_interface);
+    }
+
+    outside_interface.m_linked_sockets.clear();
+    inside_interface.m_linked_group_inputs.clear();
   }
 }
 
@@ -257,8 +274,66 @@ XNode &InlinedNodeTree::create_node(const VNode &vnode,
 
 std::string InlinedNodeTree::to_dot() const
 {
-  /* TODO */
-  return "";
+  BLI::DotExport::DirectedGraph digraph;
+  digraph.set_rankdir(BLI::DotExport::Attr_rankdir::LeftToRight);
+
+  Map<const XNode *, BLI::DotExport::Utils::NodeWithSocketsWrapper> dot_nodes;
+  Map<const XGroupInput *, BLI::DotExport::Utils::NodeWithSocketsWrapper> dot_group_inputs;
+
+  for (const XNode *xnode : m_node_by_id) {
+    auto &dot_node = digraph.new_node("");
+
+    StringRef name = xnode->m_vnode->name();
+
+    Vector<std::string> input_names;
+    for (const XInputSocket *input : xnode->m_inputs) {
+      StringRef input_name = input->m_vsocket->name();
+      input_names.append((input_name.size() == 0) ? "noname" : input_name);
+    }
+    Vector<std::string> output_names;
+    for (const XOutputSocket *output : xnode->m_outputs) {
+      StringRef output_name = output->m_vsocket->name();
+      output_names.append((output_name.size() == 0) ? "noname" : output_name);
+    }
+
+    dot_nodes.add_new(
+        xnode,
+        BLI::DotExport::Utils::NodeWithSocketsWrapper(dot_node, name, input_names, output_names));
+
+    for (const XInputSocket *input : xnode->m_inputs) {
+      for (const XGroupInput *group_input : input->m_linked_group_inputs) {
+        if (!dot_group_inputs.contains(group_input)) {
+          auto &dot_group_input_node = digraph.new_node("");
+          dot_group_inputs.add_new(group_input,
+                                   BLI::DotExport::Utils::NodeWithSocketsWrapper(
+                                       dot_group_input_node, "Group Input", {}, {"Value"}));
+        }
+      }
+    }
+  }
+
+  for (const XNode *to_xnode : m_node_by_id) {
+    auto to_dot_node = dot_nodes.lookup(to_xnode);
+
+    for (const XInputSocket *to_xsocket : to_xnode->m_inputs) {
+      for (const XOutputSocket *from_xsocket : to_xsocket->m_linked_sockets) {
+        const XNode *from_xnode = from_xsocket->m_node;
+
+        auto from_dot_node = dot_nodes.lookup(from_xnode);
+
+        digraph.new_edge(from_dot_node.output(from_xsocket->m_vsocket->index()),
+                         to_dot_node.input(to_xsocket->m_vsocket->index()));
+      }
+      for (const XGroupInput *group_input : to_xsocket->m_linked_group_inputs) {
+        auto from_dot_node = dot_group_inputs.lookup(group_input);
+
+        digraph.new_edge(from_dot_node.output(0),
+                         to_dot_node.input(to_xsocket->m_vsocket->index()));
+      }
+    }
+  }
+
+  return digraph.to_dot_string();
 }
 
 void InlinedNodeTree::to_dot__clipboard() const
diff --git a/source/blender/functions/intern/vtree_multi_function_network/builder.cc b/source/blender/functions/intern/vtree_multi_function_network/builder.cc
index 44ef06298b6..d67fce81545 100644
--- a/source/blender/functions/intern/vtree_multi_function_network/builder.cc
+++ b/source/blender/functions/intern/vtree_multi_function_network/builder.cc
@@ -194,7 +194,7 @@ const MultiFunction &VNodeMFNetworkBuilder::get_vectorized_function(
 
 std::unique_ptr<VTreeMFNetwork> VTreeMFNetworkBuilder::build()
 {
-  m_builder->to_dot__clipboard();
+  // m_builder->to_dot__clipboard();
 
   auto network = BLI::make_unique<MFNetwork>(std::move(m_builder));



More information about the Bf-blender-cvs mailing list