[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