[Bf-blender-cvs] [59dc9f1f1ac] functions-experimental-refactor: implement initial conversion from builder to network

Jacques Lucke noreply at git.blender.org
Thu Oct 17 17:53:21 CEST 2019


Commit: 59dc9f1f1ac8c17e5688d713836b6faa06614ef7
Author: Jacques Lucke
Date:   Thu Oct 17 16:35:09 2019 +0200
Branches: functions-experimental-refactor
https://developer.blender.org/rB59dc9f1f1ac8c17e5688d713836b6faa06614ef7

implement initial conversion from builder to network

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

M	source/blender/blenkernel/BKE_multi_function_network.h
M	source/blender/blenkernel/intern/multi_function_network.cc

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

diff --git a/source/blender/blenkernel/BKE_multi_function_network.h b/source/blender/blenkernel/BKE_multi_function_network.h
index 267905fea3b..18f1ece3c46 100644
--- a/source/blender/blenkernel/BKE_multi_function_network.h
+++ b/source/blender/blenkernel/BKE_multi_function_network.h
@@ -4,9 +4,11 @@
 #include "BKE_multi_function.h"
 
 #include "BLI_optional.h"
+#include "BLI_array_cxx.h"
 
 namespace BKE {
 
+using BLI::Array;
 using BLI::Optional;
 
 namespace MultiFunctionNetwork {
@@ -59,6 +61,9 @@ class BuilderFunctionNode : public BuilderNode {
 
  public:
   MultiFunction &function();
+
+  ArrayRef<uint> input_param_indices();
+  ArrayRef<uint> output_param_indices();
 };
 
 class BuilderPlaceholderNode : public BuilderNode {
@@ -78,6 +83,7 @@ class BuilderSocket {
   BuilderNode &node();
   MultiFunctionDataType type();
 
+  uint index();
   uint id();
 
   bool is_input();
@@ -107,20 +113,55 @@ class BuilderOutputSocket : public BuilderSocket {
   ArrayRef<BuilderInputSocket *> targets();
 };
 
-class NetworkBuilder {
+class NetworkBuilder : BLI::NonCopyable, BLI::NonMovable {
  private:
-  Vector<std::unique_ptr<BuilderFunctionNode>> m_function_nodes;
-  Vector<std::unique_ptr<BuilderPlaceholderNode>> m_placeholder_nodes;
-  Vector<std::unique_ptr<BuilderInputSocket>> m_input_sockets;
-  Vector<std::unique_ptr<BuilderOutputSocket>> m_output_sockets;
+  Vector<BuilderNode *> m_node_by_id;
+  Vector<BuilderSocket *> m_socket_by_id;
+
+  Vector<BuilderFunctionNode *> m_function_nodes;
+  Vector<BuilderPlaceholderNode *> m_placeholder_nodes;
+  Vector<BuilderInputSocket *> m_input_sockets;
+  Vector<BuilderOutputSocket *> m_output_sockets;
 
  public:
+  ~NetworkBuilder();
+
   BuilderFunctionNode &add_function(MultiFunction &function,
                                     ArrayRef<uint> input_param_indices,
                                     ArrayRef<uint> output_param_indices);
   BuilderPlaceholderNode &add_placeholder(ArrayRef<MultiFunctionDataType> input_types,
                                           ArrayRef<MultiFunctionDataType> output_types);
   void add_link(BuilderOutputSocket &from, BuilderInputSocket &to);
+
+  ArrayRef<BuilderNode *> nodes_by_id() const
+  {
+    return m_node_by_id;
+  }
+
+  ArrayRef<BuilderSocket *> sockets_by_id() const
+  {
+    return m_socket_by_id;
+  }
+
+  ArrayRef<BuilderFunctionNode *> function_nodes() const
+  {
+    return m_function_nodes;
+  }
+
+  ArrayRef<BuilderPlaceholderNode *> placeholder_nodes() const
+  {
+    return m_placeholder_nodes;
+  }
+
+  ArrayRef<BuilderInputSocket *> input_sockets() const
+  {
+    return m_input_sockets;
+  }
+
+  ArrayRef<BuilderOutputSocket *> output_sockets() const
+  {
+    return m_output_sockets;
+  }
 };
 
 /* Network
@@ -139,8 +180,8 @@ class Network;
 class Node {
  private:
   Network *m_network;
-  ArrayRef<InputSocket *> m_inputs;
-  ArrayRef<OutputSocket *> m_outputs;
+  Vector<InputSocket *> m_inputs;
+  Vector<OutputSocket *> m_outputs;
   bool m_is_placeholder;
   uint m_id;
 
@@ -164,8 +205,8 @@ class Node {
 class FunctionNode : public Node {
  private:
   MultiFunction *m_function;
-  ArrayRef<uint> m_input_param_indices;
-  ArrayRef<uint> m_output_param_indices;
+  Vector<uint> m_input_param_indices;
+  Vector<uint> m_output_param_indices;
 
   friend Network;
 
@@ -211,7 +252,7 @@ class InputSocket : public Socket {
 
 class OutputSocket : public Socket {
  private:
-  ArrayRef<InputSocket *> m_targets;
+  Vector<InputSocket *> m_targets;
 
   friend Network;
 
@@ -219,13 +260,19 @@ class OutputSocket : public Socket {
   ArrayRef<InputSocket *> targets();
 };
 
-class Network {
+class Network : BLI::NonCopyable, BLI::NonMovable {
  private:
-  BLI::MonotonicAllocator<> m_allocator;
-  Vector<Node *> m_nodes;
+  Array<Node *> m_node_by_id;
+  Array<Socket *> m_socket_by_id;
+
+  Vector<FunctionNode *> m_function_nodes;
+  Vector<PlaceholderNode *> m_placeholder_nodes;
+  Vector<InputSocket *> m_input_sockets;
+  Vector<OutputSocket *> m_output_sockets;
 
  public:
   Network(std::unique_ptr<NetworkBuilder> builder);
+  ~Network();
 };
 
 /* Builder Implementations
@@ -275,6 +322,16 @@ MultiFunction &BuilderFunctionNode::function()
   return *m_function;
 }
 
+ArrayRef<uint> BuilderFunctionNode::input_param_indices()
+{
+  return m_input_param_indices;
+}
+
+ArrayRef<uint> BuilderFunctionNode::output_param_indices()
+{
+  return m_output_param_indices;
+}
+
 BuilderNode &BuilderSocket::node()
 {
   return *m_node;
@@ -285,6 +342,11 @@ MultiFunctionDataType BuilderSocket::type()
   return m_type;
 }
 
+uint BuilderSocket::index()
+{
+  return m_index;
+}
+
 uint BuilderSocket::id()
 {
   return m_id;
diff --git a/source/blender/blenkernel/intern/multi_function_network.cc b/source/blender/blenkernel/intern/multi_function_network.cc
index 9188fd4da97..c0f40adb297 100644
--- a/source/blender/blenkernel/intern/multi_function_network.cc
+++ b/source/blender/blenkernel/intern/multi_function_network.cc
@@ -6,6 +6,22 @@ namespace MultiFunctionNetwork {
 /* Network Builder
  **************************************/
 
+NetworkBuilder::~NetworkBuilder()
+{
+  for (auto node : m_function_nodes) {
+    delete node;
+  }
+  for (auto node : m_placeholder_nodes) {
+    delete node;
+  }
+  for (auto socket : m_input_sockets) {
+    delete socket;
+  }
+  for (auto socket : m_output_sockets) {
+    delete socket;
+  }
+}
+
 BuilderFunctionNode &NetworkBuilder::add_function(MultiFunction &function,
                                                   ArrayRef<uint> input_param_indices,
                                                   ArrayRef<uint> output_param_indices)
@@ -18,81 +34,85 @@ BuilderFunctionNode &NetworkBuilder::add_function(MultiFunction &function,
   }
 #endif
 
-  auto node = BLI::make_unique<BuilderFunctionNode>();
+  auto node = new BuilderFunctionNode();
 
   node->m_network = this;
   node->m_is_placeholder = 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_function_nodes.size() + m_placeholder_nodes.size();
+  node->m_id = m_node_by_id.size();
 
   for (uint i = 0; i < input_param_indices.size(); i++) {
     ParamType param = function.signature().param_types()[i];
     BLI_assert(param.is_input());
 
-    auto input_socket = BLI::make_unique<BuilderInputSocket>();
+    auto input_socket = new BuilderInputSocket();
     input_socket->m_type = param.as_data_type();
-    input_socket->m_node = node.get();
+    input_socket->m_node = node;
     input_socket->m_index = i;
     input_socket->m_is_output = false;
-    input_socket->m_id = m_input_sockets.size() + m_output_sockets.size();
-    node->m_inputs.append(input_socket.get());
-    m_input_sockets.append(std::move(input_socket));
+    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 = 0; i < output_param_indices.size(); i++) {
     ParamType param = function.signature().param_types()[i];
     BLI_assert(param.is_output());
 
-    auto output_socket = BLI::make_unique<BuilderOutputSocket>();
+    auto output_socket = new BuilderOutputSocket();
     output_socket->m_type = param.as_data_type();
-    output_socket->m_node = node.get();
+    output_socket->m_node = node;
     output_socket->m_index = i;
     output_socket->m_is_output = true;
-    output_socket->m_id = m_input_sockets.size() + m_output_sockets.size();
-    node->m_outputs.append(output_socket.get());
-    m_output_sockets.append(std::move(output_socket));
+    output_socket->m_id = m_socket_by_id.size();
+    node->m_outputs.append(output_socket);
+    m_socket_by_id.append(output_socket);
+    m_output_sockets.append(output_socket);
   }
 
-  BuilderFunctionNode &node_ref = *node;
-  m_function_nodes.append(std::move(node));
-  return node_ref;
+  m_function_nodes.append(node);
+  m_node_by_id.append(node);
+  return *node;
 }
 
 BuilderPlaceholderNode &NetworkBuilder::add_placeholder(
     ArrayRef<MultiFunctionDataType> input_types, ArrayRef<MultiFunctionDataType> output_types)
 {
-  auto node = BLI::make_unique<BuilderPlaceholderNode>();
+  auto node = new BuilderPlaceholderNode();
 
   node->m_network = this;
   node->m_is_placeholder = true;
-  node->m_id = m_function_nodes.size() + m_placeholder_nodes.size();
+  node->m_id = m_node_by_id.size();
 
   for (uint i = 0; i < input_types.size(); i++) {
-    auto input_socket = BLI::make_unique<BuilderInputSocket>();
+    auto input_socket = new BuilderInputSocket();
     input_socket->m_type = input_types[i];
-    input_socket->m_node = node.get();
+    input_socket->m_node = node;
     input_socket->m_index = i;
     input_socket->m_is_output = false;
-    input_socket->m_id = m_input_sockets.size() + m_output_sockets.size();
-    node->m_inputs.append(input_socket.get());
-    m_input_sockets.append(std::move(input_socket));
+    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 = 0; i < output_types.size(); i++) {
-    auto output_socket = BLI::make_unique<BuilderOutputSocket>();
+    auto output_socket = new BuilderOutputSocket();
     output_socket->m_type = output_types[i];
-    output_socket->m_node = node.get();
+    output_socket->m_node = node;
     output_socket->m_index = i;
     output_socket->m_is_output = true;
-    output_socket->m_id = m_input_sockets.size() + m_output_sockets.size();
-    node->m_outputs.append(output_socket.get());
-    m_output_sockets.append(std::move(output_socket));
+    output_socket->m_id = m_socket_by_id.size();
+    node->m_outputs.append(output_socket);
+    m_socket_by_id.append(output_socket);
+    m_output_sockets.append(output_socket);
   }
 
-  BuilderPlaceholderNode &node_ref = *node;
-  m_placeholder_nodes.append(std::move(node));
-  return node_ref;
+  m_placeholder_nodes.append(node);
+  m_node_by_id.append(node);
+  return *node;
 }
 
 void NetworkBuilder::add_link(BuilderOutputSocket &from, BuilderInputSocket &to

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list