Commit: c03bb9db0d40bf53ac34b280e0857a84d1f648bf
Author: Jacques Lucke
Date:   Tue Dec 17 11:13:00 2019 +0100
Branches: functions
https://developer.blender.org/rBc03bb9db0d40bf53ac34b280e0857a84d1f648bf

store name of node and sockets in dummy node

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

M       source/blender/blenlib/BLI_monotonic_allocator.h
M       source/blender/functions/FN_multi_function_network.h
M       
source/blender/functions/intern/inlined_tree_multi_function_network/builder.cc
M       
source/blender/functions/intern/inlined_tree_multi_function_network/builder.h
M       source/blender/functions/intern/multi_function_network.cc

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

diff --git a/source/blender/blenlib/BLI_monotonic_allocator.h 
b/source/blender/blenlib/BLI_monotonic_allocator.h
index 0ab468e419f..16e46c85007 100644
--- a/source/blender/blenlib/BLI_monotonic_allocator.h
+++ b/source/blender/blenlib/BLI_monotonic_allocator.h
@@ -88,6 +88,13 @@ class MonotonicAllocator : NonCopyable, NonMovable {
     }
   };
 
+  StringRefNull copy_string(StringRef str)
+  {
+    void *buffer = this->allocate(str.size() + 1, 1);
+    memcpy(buffer, str.data(), str.size() + 1);
+    return StringRefNull((const char *)buffer);
+  }
+
   template<typename T, typename... Args> destruct_ptr<T> construct(Args &&... 
args)
   {
     void *buffer = this->allocate(sizeof(T), alignof(T));
diff --git a/source/blender/functions/FN_multi_function_network.h 
b/source/blender/functions/FN_multi_function_network.h
index 01ee6da8466..84e37df891c 100644
--- a/source/blender/functions/FN_multi_function_network.h
+++ b/source/blender/functions/FN_multi_function_network.h
@@ -70,6 +70,14 @@ class MFBuilderFunctionNode : public MFBuilderNode {
 };
 
 class MFBuilderDummyNode : public MFBuilderNode {
+ private:
+  StringRefNull m_name;
+  Vector<StringRefNull> m_input_names;
+  Vector<StringRefNull> m_output_names;
+
+  friend MFNetworkBuilder;
+  friend MFBuilderSocket;
+  friend MFBuilderNode;
 };
 
 class MFBuilderSocket : BLI::NonCopyable, BLI::NonMovable {
@@ -136,8 +144,11 @@ class MFNetworkBuilder : BLI::NonCopyable, BLI::NonMovable 
{
   void to_dot__clipboard();
 
   MFBuilderFunctionNode &add_function(const MultiFunction &function);
-  MFBuilderDummyNode &add_dummy(ArrayRef<MFDataType> input_types,
-                                ArrayRef<MFDataType> output_types);
+  MFBuilderDummyNode &add_dummy(StringRef name,
+                                ArrayRef<MFDataType> input_types,
+                                ArrayRef<MFDataType> output_types,
+                                ArrayRef<StringRef> input_names,
+                                ArrayRef<StringRef> output_names);
   void add_link(MFBuilderOutputSocket &from, MFBuilderInputSocket &to);
 
   ArrayRef<MFBuilderNode *> nodes_by_id() const
@@ -233,6 +244,12 @@ class MFFunctionNode final : public MFNode {
 };
 
 class MFDummyNode final : public MFNode {
+ private:
+  StringRefNull m_name;
+  Vector<StringRefNull> m_input_names;
+  Vector<StringRefNull> m_output_names;
+
+  friend MFNetwork;
 };
 
 class MFSocket : BLI::NonCopyable, BLI::NonMovable {
@@ -349,7 +366,7 @@ inline StringRefNull MFBuilderNode::name()
     return this->as_function().function().name();
   }
   else {
-    return "Dummy";
+    return this->as_dummy().m_name;
   }
 }
 
@@ -421,7 +438,13 @@ inline StringRefNull MFBuilderSocket::name()
     }
   }
   else {
-    return "Dummy";
+    MFBuilderDummyNode &node = m_node->as_dummy();
+    if (m_is_output) {
+      return node.m_output_names[m_index];
+    }
+    else {
+      return node.m_input_names[m_index];
+    }
   }
 }
 
diff --git 
a/source/blender/functions/intern/inlined_tree_multi_function_network/builder.cc
 
b/source/blender/functions/intern/inlined_tree_multi_function_network/builder.cc
index febfd71c0fb..44e0d55cc9b 100644
--- 
a/source/blender/functions/intern/inlined_tree_multi_function_network/builder.cc
+++ 
b/source/blender/functions/intern/inlined_tree_multi_function_network/builder.cc
@@ -32,22 +32,27 @@ MFBuilderFunctionNode 
&InlinedTreeMFNetworkBuilder::add_function(const MultiFunc
 MFBuilderDummyNode &InlinedTreeMFNetworkBuilder::add_dummy(const XNode &xnode)
 {
   Vector<MFDataType> input_types;
+  Vector<StringRef> input_names;
   for (const XInputSocket *xsocket : xnode.inputs()) {
     Optional<MFDataType> data_type = this->try_get_data_type(*xsocket);
     if (data_type.has_value()) {
       input_types.append(data_type.value());
+      input_names.append(xsocket->name());
     }
   }
 
   Vector<MFDataType> output_types;
+  Vector<StringRef> output_names;
   for (const XOutputSocket *xsocket : xnode.outputs()) {
     Optional<MFDataType> data_type = this->try_get_data_type(*xsocket);
     if (data_type.has_value()) {
       output_types.append(data_type.value());
+      output_names.append(xsocket->name());
     }
   }
 
-  MFBuilderDummyNode &node = m_builder->add_dummy(input_types, output_types);
+  MFBuilderDummyNode &node = m_builder->add_dummy(
+      xnode.name(), input_types, output_types, input_names, output_names);
   this->map_data_sockets(xnode, node);
   return node;
 }
@@ -194,7 +199,7 @@ const MultiFunction 
&VNodeMFNetworkBuilder::get_vectorized_function(
 
 std::unique_ptr<InlinedTreeMFNetwork> InlinedTreeMFNetworkBuilder::build()
 {
-  // m_builder->to_dot__clipboard();
+  m_builder->to_dot__clipboard();
 
   auto network = BLI::make_unique<MFNetwork>(std::move(m_builder));
 
diff --git 
a/source/blender/functions/intern/inlined_tree_multi_function_network/builder.h 
b/source/blender/functions/intern/inlined_tree_multi_function_network/builder.h
index 8b4921727cd..da891af5614 100644
--- 
a/source/blender/functions/intern/inlined_tree_multi_function_network/builder.h
+++ 
b/source/blender/functions/intern/inlined_tree_multi_function_network/builder.h
@@ -103,10 +103,13 @@ class InlinedTreeMFNetworkBuilder : BLI::NonCopyable, 
BLI::NonMovable {
 
   MFBuilderDummyNode &add_dummy(const XNode &xnode);
 
-  MFBuilderDummyNode &add_dummy(ArrayRef<MFDataType> input_types,
-                                ArrayRef<MFDataType> output_types)
+  MFBuilderDummyNode &add_dummy(StringRef name,
+                                ArrayRef<MFDataType> input_types,
+                                ArrayRef<MFDataType> output_types,
+                                ArrayRef<StringRef> input_names,
+                                ArrayRef<StringRef> output_names)
   {
-    return m_builder->add_dummy(input_types, output_types);
+    return m_builder->add_dummy(name, input_types, output_types, input_names, 
output_names);
   }
 
   void add_link(MFBuilderOutputSocket &from, MFBuilderInputSocket &to)
diff --git a/source/blender/functions/intern/multi_function_network.cc 
b/source/blender/functions/intern/multi_function_network.cc
index 747b06aa4a5..8e5ffc97f63 100644
--- a/source/blender/functions/intern/multi_function_network.cc
+++ b/source/blender/functions/intern/multi_function_network.cc
@@ -103,14 +103,18 @@ MFBuilderFunctionNode 
&MFNetworkBuilder::add_function(const MultiFunction &funct
   return node;
 }
 
-MFBuilderDummyNode &MFNetworkBuilder::add_dummy(ArrayRef<MFDataType> 
input_types,
-                                                ArrayRef<MFDataType> 
output_types)
+MFBuilderDummyNode &MFNetworkBuilder::add_dummy(StringRef name,
+                                                ArrayRef<MFDataType> 
input_types,
+                                                ArrayRef<MFDataType> 
output_types,
+                                                ArrayRef<StringRef> 
input_names,
+                                                ArrayRef<StringRef> 
output_names)
 {
   auto &node = *m_allocator.construct<MFBuilderDummyNode>().release();
 
   node.m_network = this;
   node.m_is_dummy = true;
   node.m_id = m_node_by_id.size();
+  node.m_name = m_allocator.copy_string(name);
 
   for (uint i : input_types.index_iterator()) {
     auto &input_socket = 
*m_allocator.construct<MFBuilderInputSocket>().release();
@@ -120,6 +124,7 @@ MFBuilderDummyNode 
&MFNetworkBuilder::add_dummy(ArrayRef<MFDataType> input_types
     input_socket.m_is_output = false;
     input_socket.m_id = m_socket_by_id.size();
     node.m_inputs.append(&input_socket);
+    node.m_input_names.append(m_allocator.copy_string(input_names[i]));
     m_socket_by_id.append(&input_socket);
     m_input_sockets.append(&input_socket);
   }
@@ -131,6 +136,7 @@ MFBuilderDummyNode 
&MFNetworkBuilder::add_dummy(ArrayRef<MFDataType> input_types
     output_socket.m_is_output = true;
     output_socket.m_id = m_socket_by_id.size();
     node.m_outputs.append(&output_socket);
+    node.m_output_names.append(m_allocator.copy_string(output_names[i]));
     m_socket_by_id.append(&output_socket);
     m_output_sockets.append(&output_socket);
   }
@@ -168,6 +174,10 @@ std::string MFNetworkBuilder::to_dot()
       output_names.append(socket->name());
     }
 
+    if (node->is_dummy()) {
+      dot_node.set_background_color("#AAAAFF");
+    }
+
     dot_nodes.add_new(node,
                       NodeWithSocketsWrapper(dot_node, node->name(), 
input_names, output_names));
   }
@@ -262,6 +272,7 @@ MFNetwork::MFNetwork(std::unique_ptr<MFNetworkBuilder> 
builder)
       m_socket_by_id[socket.id()] = &socket;
       m_input_sockets.append(&socket);
       node.m_inputs.append(&socket);
+      
node.m_input_names.append(m_allocator.copy_string(builder_socket->name()));
     }
     for (MFBuilderOutputSocket *builder_socket : builder_node->outputs()) {
       MFOutputSocket &socket = 
*m_allocator.construct<MFOutputSocket>().release();
@@ -274,6 +285,7 @@ MFNetwork::MFNetwork(std::unique_ptr<MFNetworkBuilder> 
builder)
       m_socket_by_id[socket.id()] = &socket;
       m_output_sockets.append(&socket);
       node.m_outputs.append(&socket);
+      
node.m_output_names.append(m_allocator.copy_string(builder_socket->name()));
     }
 
     m_dummy_nodes.append(&node);

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to