[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