[Bf-blender-cvs] [8ddf71d8803] functions: initial network builder refactor to enable support for removing nodes

Jacques Lucke noreply at git.blender.org
Sat Jan 18 20:17:22 CET 2020


Commit: 8ddf71d8803fe6f72bc2a5572c817369123afb10
Author: Jacques Lucke
Date:   Sat Jan 11 12:59:37 2020 +0100
Branches: functions
https://developer.blender.org/rB8ddf71d8803fe6f72bc2a5572c817369123afb10

initial network builder refactor to enable support for removing nodes

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

M	source/blender/blenlib/BLI_map.h
M	source/blender/blenlib/BLI_vector_set.h
M	source/blender/functions/FN_multi_function_network.h
M	source/blender/functions/intern/multi_function_network.cc
M	source/blender/functions/intern/multi_function_network_optimization.cc
M	source/blender/functions/intern/node_tree_multi_function_network/builder.cc
M	source/blender/functions/intern/node_tree_multi_function_network/builder.h
M	source/blender/functions/intern/node_tree_multi_function_network/generate.cc

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

diff --git a/source/blender/blenlib/BLI_map.h b/source/blender/blenlib/BLI_map.h
index 1edf7653c71..73b731252b6 100644
--- a/source/blender/blenlib/BLI_map.h
+++ b/source/blender/blenlib/BLI_map.h
@@ -413,6 +413,19 @@ template<typename KeyT, typename ValueT, typename Allocator = GuardedAllocator>
     return m_array.slots_set();
   }
 
+  template<typename FuncT> void foreach_item(const FuncT &func) const
+  {
+    for (const Item &item : m_array) {
+      for (uint offset = 0; offset < 4; offset++) {
+        if (item.is_set(offset)) {
+          const KeyT &key = *item.key(offset);
+          const ValueT &value = *item.value(offset);
+          func(key, value);
+        }
+      }
+    }
+  }
+
   void print_table() const
   {
     std::cout << "Hash Table:\n";
diff --git a/source/blender/blenlib/BLI_vector_set.h b/source/blender/blenlib/BLI_vector_set.h
index fb21f7ed987..4ab746d9c2a 100644
--- a/source/blender/blenlib/BLI_vector_set.h
+++ b/source/blender/blenlib/BLI_vector_set.h
@@ -292,6 +292,11 @@ template<typename T, typename Allocator = GuardedAllocator> class VectorSet {
     return m_elements[index];
   }
 
+  ArrayRef<T> as_ref() const
+  {
+    return *this;
+  }
+
   operator ArrayRef<T>() const
   {
     return m_elements;
diff --git a/source/blender/functions/FN_multi_function_network.h b/source/blender/functions/FN_multi_function_network.h
index c9030fa7350..5ca9112a7de 100644
--- a/source/blender/functions/FN_multi_function_network.h
+++ b/source/blender/functions/FN_multi_function_network.h
@@ -6,12 +6,16 @@
 #include "BLI_optional.h"
 #include "BLI_array_cxx.h"
 #include "BLI_set.h"
+#include "BLI_vector_set.h"
+#include "BLI_map.h"
 
 namespace FN {
 
 using BLI::Array;
+using BLI::Map;
 using BLI::Optional;
 using BLI::Set;
+using BLI::VectorSet;
 
 /* MFNetwork Builder
  ****************************************/
@@ -31,7 +35,6 @@ class MFBuilderNode : BLI::NonCopyable, BLI::NonMovable {
   MFNetworkBuilder *m_network;
   Vector<MFBuilderInputSocket *> m_inputs;
   Vector<MFBuilderOutputSocket *> m_outputs;
-  uint m_id;
   bool m_is_dummy;
 
   friend MFNetworkBuilder;
@@ -47,13 +50,13 @@ class MFBuilderNode : BLI::NonCopyable, BLI::NonMovable {
 
   StringRefNull name();
 
-  uint id();
-
   bool is_function();
   bool is_dummy();
 
   MFBuilderFunctionNode &as_function();
   MFBuilderDummyNode &as_dummy();
+
+  template<typename FuncT> void foreach_target_socket(const FuncT &func);
 };
 
 class MFBuilderFunctionNode : public MFBuilderNode {
@@ -88,7 +91,6 @@ class MFBuilderSocket : BLI::NonCopyable, BLI::NonMovable {
   bool m_is_output;
   uint m_index;
   MFDataType m_data_type;
-  uint m_id;
 
   friend MFNetworkBuilder;
 
@@ -97,7 +99,6 @@ class MFBuilderSocket : BLI::NonCopyable, BLI::NonMovable {
   MFDataType data_type();
 
   uint index();
-  uint id();
   StringRefNull name();
 
   bool is_input();
@@ -131,13 +132,8 @@ class MFNetworkBuilder : BLI::NonCopyable, BLI::NonMovable {
  private:
   MonotonicAllocator<> m_allocator;
 
-  Vector<MFBuilderNode *> m_node_by_id;
-  Vector<MFBuilderSocket *> m_socket_by_id;
-
-  Vector<MFBuilderFunctionNode *> m_function_nodes;
-  Vector<MFBuilderDummyNode *> m_dummy_nodes;
-  Vector<MFBuilderInputSocket *> m_input_sockets;
-  Vector<MFBuilderOutputSocket *> m_output_sockets;
+  VectorSet<MFBuilderFunctionNode *> m_function_nodes;
+  VectorSet<MFBuilderDummyNode *> m_dummy_nodes;
 
  public:
   ~MFNetworkBuilder();
@@ -154,19 +150,14 @@ class MFNetworkBuilder : BLI::NonCopyable, BLI::NonMovable {
   void add_link(MFBuilderOutputSocket &from, MFBuilderInputSocket &to);
   void remove_link(MFBuilderOutputSocket &from, MFBuilderInputSocket &to);
 
-  ArrayRef<MFBuilderNode *> all_nodes() const
+  uint current_index_of(MFBuilderFunctionNode &node) const
   {
-    return m_node_by_id;
+    return m_function_nodes.index(&node);
   }
 
-  ArrayRef<MFBuilderNode *> nodes_by_id() const
+  uint current_index_of(MFBuilderDummyNode &node) const
   {
-    return m_node_by_id;
-  }
-
-  ArrayRef<MFBuilderSocket *> sockets_by_id() const
-  {
-    return m_socket_by_id;
+    return m_dummy_nodes.index(&node);
   }
 
   ArrayRef<MFBuilderFunctionNode *> function_nodes() const
@@ -178,16 +169,6 @@ class MFNetworkBuilder : BLI::NonCopyable, BLI::NonMovable {
   {
     return m_dummy_nodes;
   }
-
-  ArrayRef<MFBuilderInputSocket *> input_sockets() const
-  {
-    return m_input_sockets;
-  }
-
-  ArrayRef<MFBuilderOutputSocket *> output_sockets() const
-  {
-    return m_output_sockets;
-  }
 };
 
 void optimize_multi_function_network(MFNetworkBuilder &network);
@@ -207,9 +188,9 @@ class MFNetwork;
 
 class MFNode : BLI::NonCopyable, BLI::NonMovable {
  private:
-  const MFNetwork *m_network;
-  Vector<const MFInputSocket *> m_inputs;
-  Vector<const MFOutputSocket *> m_outputs;
+  MFNetwork *m_network;
+  Vector<MFInputSocket *> m_inputs;
+  Vector<MFOutputSocket *> m_outputs;
   bool m_is_dummy;
   uint m_id;
 
@@ -315,8 +296,8 @@ class MFNetwork : BLI::NonCopyable, BLI::NonMovable {
  private:
   MonotonicAllocator<> m_allocator;
 
-  Array<MFNode *> m_node_by_id;
-  Array<MFSocket *> m_socket_by_id;
+  Vector<MFNode *> m_node_by_id;
+  Vector<MFSocket *> m_socket_by_id;
 
   Vector<MFFunctionNode *> m_function_nodes;
   Vector<MFDummyNode *> m_dummy_nodes;
@@ -331,11 +312,25 @@ class MFNetwork : BLI::NonCopyable, BLI::NonMovable {
   const MFSocket &socket_by_id(uint id) const;
   IndexRange socket_ids() const;
 
+  ArrayRef<const MFDummyNode *> dummy_nodes() const
+  {
+    return m_dummy_nodes.as_ref();
+  }
+
   Vector<const MFOutputSocket *> find_dummy_dependencies(
       ArrayRef<const MFInputSocket *> sockets) const;
 
   Vector<const MFFunctionNode *> find_function_dependencies(
       ArrayRef<const MFInputSocket *> sockets) const;
+
+ private:
+  void create_links_to_node(MFNetworkBuilder &builder,
+                            MFNode *to_node,
+                            MFBuilderNode *to_builder_node);
+
+  void create_link_to_socket(MFNetworkBuilder &builder,
+                             MFInputSocket *to_socket,
+                             MFBuilderInputSocket *to_builder_socket);
 };
 
 /* Builder Implementations
@@ -365,11 +360,6 @@ inline MFBuilderOutputSocket &MFBuilderNode::output(uint index)
   return *m_outputs[index];
 }
 
-inline uint MFBuilderNode::id()
-{
-  return m_id;
-}
-
 inline StringRefNull MFBuilderNode::name()
 {
   if (this->is_function()) {
@@ -401,6 +391,15 @@ inline MFBuilderDummyNode &MFBuilderNode::as_dummy()
   return *(MFBuilderDummyNode *)this;
 }
 
+template<typename FuncT> inline void MFBuilderNode::foreach_target_socket(const FuncT &func)
+{
+  for (MFBuilderOutputSocket *socket : m_outputs) {
+    for (MFBuilderInputSocket *target : socket->targets()) {
+      func(*target);
+    }
+  }
+}
+
 inline const MultiFunction &MFBuilderFunctionNode::function()
 {
   return *m_function;
@@ -431,11 +430,6 @@ inline uint MFBuilderSocket::index()
   return m_index;
 }
 
-inline uint MFBuilderSocket::id()
-{
-  return m_id;
-}
-
 inline StringRefNull MFBuilderSocket::name()
 {
   if (m_node->is_function()) {
@@ -498,12 +492,12 @@ inline const MFNetwork &MFNode::network() const
 
 inline ArrayRef<const MFInputSocket *> MFNode::inputs() const
 {
-  return m_inputs;
+  return m_inputs.as_ref();
 }
 
 inline ArrayRef<const MFOutputSocket *> MFNode::outputs() const
 {
-  return m_outputs;
+  return m_outputs.as_ref();
 }
 
 inline const MFInputSocket &MFNode::input(uint index) const
diff --git a/source/blender/functions/intern/multi_function_network.cc b/source/blender/functions/intern/multi_function_network.cc
index d3e83dfb7c5..9afda57bd30 100644
--- a/source/blender/functions/intern/multi_function_network.cc
+++ b/source/blender/functions/intern/multi_function_network.cc
@@ -21,18 +21,25 @@ using BLI::Stack;
 
 MFNetworkBuilder::~MFNetworkBuilder()
 {
-  for (auto node : m_function_nodes) {
+  for (MFBuilderFunctionNode *node : m_function_nodes) {
+    for (MFBuilderInputSocket *input_socket : node->m_inputs) {
+      input_socket->~MFBuilderInputSocket();
+    }
+    for (MFBuilderOutputSocket *output_socket : node->m_outputs) {
+      output_socket->~MFBuilderOutputSocket();
+    }
     node->~MFBuilderFunctionNode();
   }
-  for (auto node : m_dummy_nodes) {
+
+  for (MFBuilderDummyNode *node : m_dummy_nodes) {
+    for (MFBuilderInputSocket *input_socket : node->m_inputs) {
+      input_socket->~MFBuilderInputSocket();
+    }
+    for (MFBuilderOutputSocket *output_socket : node->m_outputs) {
+      output_socket->~MFBuilderOutputSocket();
+    }
     node->~MFBuilderDummyNode();
   }
-  for (auto socket : m_input_sockets) {
-    socket->~MFBuilderInputSocket();
-  }
-  for (auto socket : m_output_sockets) {
-    socket->~MFBuilderOutputSocket();
-  }
 }
 
 MFBuilderFunctionNode &MFNetworkBuilder::add_function(const MultiFunction &function)
@@ -58,13 +65,13 @@ MFBuilderFunctionNode &MFNetworkBuilder::add_function(const MultiFunction &funct
   }
 
   auto &node = *m_allocator.construct<MFBuilderFunctionNode>().release();
+  m_function_nodes.add_new(&node);
 
   node.m_network = this;
   node.m_is_dummy = false;
   node.m_function = &function;
   node.m_input_param_indices = input_param_indices;
   node.m_output_param_indices = output_param_indices;
-  node.m_id = m_node_by_id.size();
 
   for (uint i : input_param_indices.index_range()) {
     uint param_index = input_param_indices[i];
@@ -76,10 +83,7 @@ MFBuilderFunctionNode &MFNetworkBuilder::add_function(const MultiFunction &funct
     input_socket.m_node = &node;
     input_socket.m_index = i;
     input_socket.m_is_output = false;
-    input_socket.m_id = m_socket_by_id.size();
     node.m_inputs.append(&input_socket);
-    m_socket_by_id.append(&input_socket);
-    m_input_sockets.append(&input_socket);
   }
 
   for (uint i : output_param_indices.index_range()) {
@@ -92,14 +96,9 @@ MFBuilderFunctionNode &MFNetworkBuilder::add_function(const MultiFunction &funct
     output_socket.m_node = &node;
     output_socket.m_index = i;
     output_socket.m_is_output = true;
-    output_socket.m_id = m_socket_by_id.size();
     node.m_outputs.append(&output_socket);
-    m_socket_by_id.append(&output

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list