[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