[Bf-blender-cvs] [4684b69405f] functions: give nodes and sockets an id again
Jacques Lucke
noreply at git.blender.org
Sat Jan 18 20:17:38 CET 2020
Commit: 4684b69405fc077b55f27e039159c35ca31b277d
Author: Jacques Lucke
Date: Sat Jan 11 16:09:06 2020 +0100
Branches: functions
https://developer.blender.org/rB4684b69405fc077b55f27e039159c35ca31b277d
give nodes and sockets an id again
===================================================================
M source/blender/functions/FN_multi_function_network.h
M source/blender/functions/intern/multi_function_network.cc
===================================================================
diff --git a/source/blender/functions/FN_multi_function_network.h b/source/blender/functions/FN_multi_function_network.h
index de4487cc3f4..fa1b6ca6813 100644
--- a/source/blender/functions/FN_multi_function_network.h
+++ b/source/blender/functions/FN_multi_function_network.h
@@ -36,6 +36,7 @@ class MFBuilderNode : BLI::NonCopyable, BLI::NonMovable {
ArrayRef<MFBuilderInputSocket *> m_inputs;
ArrayRef<MFBuilderOutputSocket *> m_outputs;
bool m_is_dummy;
+ uint m_id;
friend MFNetworkBuilder;
@@ -49,6 +50,7 @@ class MFBuilderNode : BLI::NonCopyable, BLI::NonMovable {
MFBuilderOutputSocket &output(uint index);
StringRefNull name();
+ uint id();
bool is_function();
bool is_dummy();
@@ -91,6 +93,7 @@ class MFBuilderSocket : BLI::NonCopyable, BLI::NonMovable {
bool m_is_output;
uint m_index;
MFDataType m_data_type;
+ uint m_id;
friend MFNetworkBuilder;
@@ -100,6 +103,7 @@ class MFBuilderSocket : BLI::NonCopyable, BLI::NonMovable {
uint index();
StringRefNull name();
+ uint id();
bool is_input();
bool is_output();
@@ -135,6 +139,9 @@ class MFNetworkBuilder : BLI::NonCopyable, BLI::NonMovable {
VectorSet<MFBuilderFunctionNode *> m_function_nodes;
VectorSet<MFBuilderDummyNode *> m_dummy_nodes;
+ Vector<MFBuilderNode *> m_node_or_null_by_id;
+ Vector<MFBuilderSocket *> m_socket_or_null_by_id;
+
public:
~MFNetworkBuilder();
@@ -161,6 +168,38 @@ class MFNetworkBuilder : BLI::NonCopyable, BLI::NonMovable {
return m_dummy_nodes.index(&node);
}
+ MFBuilderNode &node_by_id(uint id)
+ {
+ BLI_assert(m_node_or_null_by_id[id] != nullptr);
+ return *m_node_or_null_by_id[id];
+ }
+
+ MFBuilderFunctionNode &function_by_id(uint id)
+ {
+ return this->node_by_id(id).as_function();
+ }
+
+ MFBuilderDummyNode &dummy_by_id(uint id)
+ {
+ return this->node_by_id(id).as_dummy();
+ }
+
+ MFBuilderSocket &socket_by_id(uint id)
+ {
+ BLI_assert(m_socket_or_null_by_id[id] != nullptr);
+ return *m_socket_or_null_by_id[id];
+ }
+
+ MFBuilderInputSocket &input_by_id(uint id)
+ {
+ return this->socket_by_id(id).as_input();
+ }
+
+ MFBuilderOutputSocket &output_by_id(uint id)
+ {
+ return this->socket_by_id(id).as_output();
+ }
+
ArrayRef<MFBuilderFunctionNode *> function_nodes() const
{
return m_function_nodes;
@@ -371,6 +410,11 @@ inline StringRefNull MFBuilderNode::name()
}
}
+inline uint MFBuilderNode::id()
+{
+ return m_id;
+}
+
inline bool MFBuilderNode::is_function()
{
return !m_is_dummy;
@@ -453,6 +497,11 @@ inline StringRefNull MFBuilderSocket::name()
}
}
+inline uint MFBuilderSocket::id()
+{
+ return m_id;
+}
+
inline bool MFBuilderSocket::is_input()
{
return !m_is_output;
diff --git a/source/blender/functions/intern/multi_function_network.cc b/source/blender/functions/intern/multi_function_network.cc
index f2579d2105b..39c17b48416 100644
--- a/source/blender/functions/intern/multi_function_network.cc
+++ b/source/blender/functions/intern/multi_function_network.cc
@@ -71,6 +71,7 @@ MFBuilderFunctionNode &MFNetworkBuilder::add_function(const MultiFunction &funct
node.m_network = this;
node.m_is_dummy = false;
node.m_function = &function;
+ node.m_id = m_node_or_null_by_id.append_and_get_index(&node);
node.m_input_param_indices = m_allocator.construct_array_copy<uint>(input_param_indices);
node.m_output_param_indices = m_allocator.construct_array_copy<uint>(output_param_indices);
@@ -88,6 +89,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_or_null_by_id.append_and_get_index(&input_socket);
}
for (uint i : output_param_indices.index_range()) {
@@ -99,6 +101,7 @@ 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_or_null_by_id.append_and_get_index(&output_socket);
}
return node;
@@ -119,6 +122,7 @@ MFBuilderDummyNode &MFNetworkBuilder::add_dummy(StringRef name,
node.m_network = this;
node.m_is_dummy = true;
node.m_name = m_allocator.copy_string(name);
+ node.m_id = m_node_or_null_by_id.append_and_get_index(&node);
node.m_inputs = m_allocator.construct_elements_and_pointer_array<MFBuilderInputSocket>(
input_types.size());
@@ -134,6 +138,7 @@ MFBuilderDummyNode &MFNetworkBuilder::add_dummy(StringRef name,
input_socket.m_node = &node;
input_socket.m_index = i;
input_socket.m_is_output = false;
+ input_socket.m_id = m_socket_or_null_by_id.append_and_get_index(&input_socket);
node.m_input_names[i] = m_allocator.copy_string(input_names[i]);
}
for (uint i : output_types.index_range()) {
@@ -142,6 +147,7 @@ MFBuilderDummyNode &MFNetworkBuilder::add_dummy(StringRef name,
output_socket.m_node = &node;
output_socket.m_index = i;
output_socket.m_is_output = true;
+ output_socket.m_id = m_socket_or_null_by_id.append_and_get_index(&output_socket);
node.m_output_names[i] = m_allocator.copy_string(output_names[i]);
}
return node;
@@ -166,6 +172,7 @@ void MFNetworkBuilder::remove_link(MFBuilderOutputSocket &from, MFBuilderInputSo
void MFNetworkBuilder::remove_node(MFBuilderNode &node)
{
for (MFBuilderInputSocket *input_socket : node.inputs()) {
+ m_socket_or_null_by_id[input_socket->m_id] = nullptr;
MFBuilderOutputSocket *origin = input_socket->origin();
if (origin != nullptr) {
origin->m_targets.remove_first_occurrence_and_reorder(input_socket);
@@ -173,11 +180,14 @@ void MFNetworkBuilder::remove_node(MFBuilderNode &node)
input_socket->~MFBuilderInputSocket();
}
for (MFBuilderOutputSocket *output_socket : node.outputs()) {
+ m_socket_or_null_by_id[output_socket->m_id] = nullptr;
for (MFBuilderInputSocket *target : output_socket->targets()) {
target->m_origin = nullptr;
}
output_socket->~MFBuilderOutputSocket();
}
+
+ m_node_or_null_by_id[node.m_id] = nullptr;
if (node.is_dummy()) {
MFBuilderDummyNode &dummy_node = node.as_dummy();
m_dummy_nodes.remove(&dummy_node);
More information about the Bf-blender-cvs
mailing list