[Bf-blender-cvs] [71d8ebd2017] functions: refactor how information about the node tree is stored

Jacques Lucke noreply at git.blender.org
Fri Aug 2 19:15:07 CEST 2019


Commit: 71d8ebd2017035ec30163555166478e02412aeb5
Author: Jacques Lucke
Date:   Fri Aug 2 16:11:25 2019 +0200
Branches: functions
https://developer.blender.org/rB71d8ebd2017035ec30163555166478e02412aeb5

refactor how information about the node tree is stored

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

M	source/blender/functions/CMakeLists.txt
M	source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp
M	source/blender/functions/frontends/data_flow_nodes/input_handlers.cpp
A	source/blender/functions/frontends/data_flow_nodes/mappings.cpp
A	source/blender/functions/frontends/data_flow_nodes/mappings.hpp
M	source/blender/functions/frontends/data_flow_nodes/mappings/conversion_inserters.cpp
D	source/blender/functions/frontends/data_flow_nodes/mappings/mappings.hpp
M	source/blender/functions/frontends/data_flow_nodes/mappings/node_inserters.cpp
D	source/blender/functions/frontends/data_flow_nodes/mappings/registry.cpp
M	source/blender/functions/frontends/data_flow_nodes/mappings/registry.hpp
M	source/blender/functions/frontends/data_flow_nodes/mappings/socket_loaders.cpp
M	source/blender/functions/frontends/data_flow_nodes/mappings/type_mappings.cpp
M	source/blender/functions/frontends/data_flow_nodes/vtree_data_graph_builder.cpp
M	source/blender/functions/frontends/data_flow_nodes/vtree_data_graph_builder.hpp

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

diff --git a/source/blender/functions/CMakeLists.txt b/source/blender/functions/CMakeLists.txt
index 9fbddc4ccbc..247e50f72b6 100644
--- a/source/blender/functions/CMakeLists.txt
+++ b/source/blender/functions/CMakeLists.txt
@@ -145,9 +145,9 @@ set(SRC
   frontends/data_flow_nodes/function_generation.cpp
   frontends/data_flow_nodes/graph_generation.hpp
   frontends/data_flow_nodes/graph_generation.cpp
-  frontends/data_flow_nodes/mappings/mappings.hpp
+  frontends/data_flow_nodes/mappings.hpp
+  frontends/data_flow_nodes/mappings.cpp
   frontends/data_flow_nodes/mappings/registry.hpp
-  frontends/data_flow_nodes/mappings/registry.cpp
   frontends/data_flow_nodes/mappings/node_inserters.cpp
   frontends/data_flow_nodes/mappings/socket_loaders.cpp
   frontends/data_flow_nodes/mappings/conversion_inserters.cpp
diff --git a/source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp b/source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp
index 938e6c8454a..66ab893d1ff 100644
--- a/source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp
+++ b/source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp
@@ -2,7 +2,7 @@
 
 #include "FN_data_flow_nodes.hpp"
 
-#include "mappings/mappings.hpp"
+#include "mappings.hpp"
 
 namespace FN {
 namespace DataFlowNodes {
@@ -31,12 +31,10 @@ static void insert_placeholder_node(VTreeDataGraphBuilder &builder, VirtualNode
 
 static bool insert_functions_for_bnodes(VTreeDataGraphBuilder &builder)
 {
-  auto inserters = MAPPING_node_inserters();
+  auto &inserters = MAPPING_node_inserters();
 
   for (VirtualNode *vnode : builder.vtree().nodes()) {
-    NodeInserter *inserter = inserters.lookup_ptr(vnode->idname());
-    if (inserter) {
-      (*inserter)(builder, vnode);
+    if (inserters->insert(builder, vnode)) {
       BLI_assert(builder.verify_data_sockets_mapped(vnode));
       continue;
     }
@@ -50,7 +48,7 @@ static bool insert_functions_for_bnodes(VTreeDataGraphBuilder &builder)
 
 static bool insert_links(VTreeDataGraphBuilder &builder)
 {
-  Map<StringPair, ConversionInserter> &map = MAPPING_conversion_inserters();
+  std::unique_ptr<LinkInserters> &inserters = MAPPING_link_inserters();
 
   for (VirtualSocket *to_vsocket : builder.vtree().inputs_with_links()) {
     if (to_vsocket->links().size() > 1) {
@@ -65,20 +63,7 @@ static bool insert_links(VTreeDataGraphBuilder &builder)
       return false;
     }
 
-    BuilderOutputSocket *from_socket = builder.lookup_output_socket(from_vsocket);
-    BuilderInputSocket *to_socket = builder.lookup_input_socket(to_vsocket);
-
-    if (STREQ(from_vsocket->idname(), to_vsocket->idname())) {
-      builder.insert_link(from_socket, to_socket);
-      continue;
-    }
-
-    StringPair key(from_vsocket->idname(), to_vsocket->idname());
-    ConversionInserter *inserter = map.lookup_ptr(key);
-    if (inserter != nullptr) {
-      (*inserter)(builder, from_socket, to_socket);
-    }
-    else {
+    if (!inserters->insert(builder, from_vsocket, to_vsocket)) {
       return false;
     }
   }
diff --git a/source/blender/functions/frontends/data_flow_nodes/input_handlers.cpp b/source/blender/functions/frontends/data_flow_nodes/input_handlers.cpp
index 0c97802f090..803e76ca27c 100644
--- a/source/blender/functions/frontends/data_flow_nodes/input_handlers.cpp
+++ b/source/blender/functions/frontends/data_flow_nodes/input_handlers.cpp
@@ -3,7 +3,7 @@
 #include "FN_dependencies.hpp"
 #include "FN_data_flow_nodes.hpp"
 
-#include "mappings/mappings.hpp"
+#include "mappings.hpp"
 
 namespace FN {
 namespace DataFlowNodes {
@@ -68,7 +68,7 @@ void DynamicSocketLoader::insert(VTreeDataGraphBuilder &builder,
                                  ArrayRef<VirtualSocket *> unlinked_inputs,
                                  ArrayRef<BuilderOutputSocket *> r_new_origins)
 {
-  auto &socket_loader_map = MAPPING_socket_loaders();
+  auto &socket_loaders = MAPPING_socket_loaders();
 
   Vector<SocketLoader> loaders;
   Vector<bNodeSocket *> bsockets;
@@ -78,7 +78,7 @@ void DynamicSocketLoader::insert(VTreeDataGraphBuilder &builder,
   for (uint i = 0; i < unlinked_inputs.size(); i++) {
     VirtualSocket *vsocket = unlinked_inputs[i];
 
-    SocketLoader loader = socket_loader_map.lookup(vsocket->idname());
+    SocketLoader loader = socket_loaders->get_loader(vsocket->idname());
     loaders.append(loader);
     fn_builder.add_output(vsocket->name(), builder.query_socket_type(vsocket));
 
@@ -160,7 +160,7 @@ void ConstantInputsHandler::insert(VTreeDataGraphBuilder &builder,
                                    ArrayRef<VirtualSocket *> unlinked_inputs,
                                    ArrayRef<BuilderOutputSocket *> r_new_origins)
 {
-  auto &socket_loader_map = MAPPING_socket_loaders();
+  auto &socket_loaders = MAPPING_socket_loaders();
 
   FunctionBuilder fn_builder;
   for (VirtualSocket *vsocket : unlinked_inputs) {
@@ -176,9 +176,7 @@ void ConstantInputsHandler::insert(VTreeDataGraphBuilder &builder,
 
   for (uint i = 0; i < unlinked_inputs.size(); i++) {
     VirtualSocket *vsocket = unlinked_inputs[i];
-    SocketLoader loader = socket_loader_map.lookup(vsocket->idname());
-    PointerRNA rna = vsocket->rna();
-    loader(&rna, *tuple1, i);
+    socket_loaders->load(vsocket, *tuple1, i);
     Tuple::copy_element(*tuple1, i, *tuple2, i);
   }
 
diff --git a/source/blender/functions/frontends/data_flow_nodes/mappings.cpp b/source/blender/functions/frontends/data_flow_nodes/mappings.cpp
new file mode 100644
index 00000000000..fb9a3ea2b23
--- /dev/null
+++ b/source/blender/functions/frontends/data_flow_nodes/mappings.cpp
@@ -0,0 +1,141 @@
+#include "BLI_lazy_init.hpp"
+
+#include "mappings.hpp"
+#include "mappings/registry.hpp"
+
+namespace FN {
+namespace DataFlowNodes {
+
+BLI_LAZY_INIT(std::unique_ptr<TypeMappings>, MAPPING_types)
+{
+  auto mappings = std::unique_ptr<TypeMappings>(new TypeMappings());
+  REGISTER_type_mappings(mappings);
+  return mappings;
+}
+
+BLI_LAZY_INIT(std::unique_ptr<NodeInserters>, MAPPING_node_inserters)
+{
+  auto inserters = std::unique_ptr<NodeInserters>(new NodeInserters());
+  REGISTER_node_inserters(inserters);
+  return inserters;
+}
+
+BLI_LAZY_INIT(std::unique_ptr<SocketLoaders>, MAPPING_socket_loaders)
+{
+  auto loaders = std::unique_ptr<SocketLoaders>(new SocketLoaders());
+  REGISTER_socket_loaders(loaders);
+  return loaders;
+}
+
+BLI_LAZY_INIT(std::unique_ptr<LinkInserters>, MAPPING_link_inserters)
+{
+  auto inserters = std::unique_ptr<LinkInserters>(new LinkInserters());
+  REGISTER_conversion_inserters(inserters);
+  return inserters;
+}
+
+void TypeMappings::register_type(StringRef idname, StringRef name, SharedType type)
+{
+  m_type_by_idname.add_new(idname, type);
+  m_type_by_name.add_new(name, type);
+  m_name_by_idname.add_new(idname, name.to_std_string());
+  m_idname_by_name.add_new(name, idname.to_std_string());
+}
+
+void NodeInserters::register_inserter(StringRef idname, NodeInserter inserter)
+{
+  m_inserter_by_idname.add_new(idname, inserter);
+}
+
+void NodeInserters::register_function(StringRef idname, FunctionGetter getter)
+{
+  auto inserter = [getter](VTreeDataGraphBuilder &builder, VirtualNode *vnode) {
+    SharedFunction fn = getter();
+    BuilderNode *node = builder.insert_function(fn, vnode);
+    builder.map_sockets(node, vnode);
+  };
+  this->register_inserter(idname, inserter);
+}
+
+bool NodeInserters::insert(VTreeDataGraphBuilder &builder, VirtualNode *vnode)
+{
+  NodeInserter *inserter = m_inserter_by_idname.lookup_ptr(vnode->idname());
+  if (inserter == nullptr) {
+    return false;
+  }
+  (*inserter)(builder, vnode);
+  return true;
+}
+
+SocketLoaders::SocketLoaders() : m_type_mappings(MAPPING_types())
+{
+}
+
+void SocketLoaders::register_loader(StringRef type_name, SocketLoader loader)
+{
+  StringRef idname = m_type_mappings->idname_by_name(type_name);
+  m_loader_by_idname.add_new(idname, loader);
+}
+
+void SocketLoaders::load(VirtualSocket *vsocket, Tuple &dst, uint index)
+{
+  SocketLoader &loader = m_loader_by_idname.lookup_ref(vsocket->idname());
+  PointerRNA rna = vsocket->rna();
+  loader(&rna, dst, index);
+}
+
+LinkInserters::LinkInserters() : m_type_mappings(MAPPING_types())
+{
+}
+
+void LinkInserters::register_conversion_inserter(StringRef from_type,
+                                                 StringRef to_type,
+                                                 ConversionInserter inserter)
+{
+  StringRef from_idname = m_type_mappings->idname_by_name(from_type);
+  StringRef to_idname = m_type_mappings->idname_by_name(to_type);
+  m_conversion_inserters.add_new(
+      StringPair(from_idname.to_std_string(), to_idname.to_std_string()), inserter);
+}
+
+void LinkInserters::register_conversion_function(StringRef from_type,
+                                                 StringRef to_type,
+                                                 FunctionGetter getter)
+{
+  auto inserter =
+      [getter](VTreeDataGraphBuilder &builder, BuilderOutputSocket *from, BuilderInputSocket *to) {
+        auto fn = getter();
+        BuilderNode *node = builder.insert_function(fn);
+        builder.insert_link(from, node->input(0));
+        builder.insert_link(node->output(0), to);
+      };
+  this->register_conversion_inserter(from_type, to_type, inserter);
+}
+
+bool LinkInserters::insert(VTreeDataGraphBuilder &builder, VirtualSocket *from, VirtualSocket *to)
+{
+  BLI_assert(from->is_output());
+  BLI_assert(to->is_input());
+  BLI_assert(builder.is_data_socket(from));
+  BLI_assert(builder.is_data_socket(to));
+
+  BuilderOutputSocket *from_socket = builder.lookup_output_socket(from);
+  BuilderInputSocket *to_socket = builder.lookup_input_socket(to);
+
+  if (STREQ(from->idname(), to->idname())) {
+    builder.insert_link(from_socket, to_socket);
+    return true;
+  }
+
+  StringPair key(from->idname(), to->idname());
+  ConversionInserter *inserter = m_conversion_inserters.lookup_ptr(key);
+  if (inserter != nullptr) {
+    (*inserter)(builder, from_socket, to_socket);
+    return true;
+  }
+
+  return false;
+}
+
+}  // namespace DataFlowNodes
+}  // namespace FN
diff --git a/source/blender/functions/frontends/data_

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list