[Bf-blender-cvs] [27b365058eb] functions: remove last remainings of GraphInserters

Jacques Lucke noreply at git.blender.org
Wed Jul 31 18:45:22 CEST 2019


Commit: 27b365058eb3c62dee8c6f0c61afb3e5b8786ab7
Author: Jacques Lucke
Date:   Wed Jul 31 18:28:14 2019 +0200
Branches: functions
https://developer.blender.org/rB27b365058eb3c62dee8c6f0c61afb3e5b8786ab7

remove last remainings of GraphInserters

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

M	source/blender/blenkernel/BKE_node_tree.hpp
M	source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp
M	source/blender/functions/frontends/data_flow_nodes/inserters.cpp
M	source/blender/functions/frontends/data_flow_nodes/inserters.hpp
M	source/blender/functions/frontends/data_flow_nodes/inserters/conversions.cpp
M	source/blender/functions/frontends/data_flow_nodes/registry.hpp
M	source/blender/functions/frontends/data_flow_nodes/type_mappings.cpp
M	source/blender/functions/frontends/data_flow_nodes/type_mappings.hpp
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/blenkernel/BKE_node_tree.hpp b/source/blender/blenkernel/BKE_node_tree.hpp
index d97e35eac5a..71ad4882991 100644
--- a/source/blender/blenkernel/BKE_node_tree.hpp
+++ b/source/blender/blenkernel/BKE_node_tree.hpp
@@ -132,6 +132,7 @@ class VirtualNodeTree {
   Vector<VirtualSocket *> m_inputs_with_links;
   MultiMap<std::string, VirtualNode *> m_nodes_by_idname;
   MonotonicAllocator<> m_allocator;
+
  public:
   void add_all_of_tree(bNodeTree *btree);
   VirtualNode *add_bnode(bNodeTree *btree, bNode *bnode);
@@ -302,6 +303,11 @@ class VirtualSocket {
   {
     return m_bsocket->name;
   }
+
+  const char *idname()
+  {
+    return m_bsocket->idname;
+  }
 };
 
 class VirtualLink {
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 8dbb328bd6c..e049703fecd 100644
--- a/source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp
+++ b/source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp
@@ -15,13 +15,13 @@ static void insert_placeholder_node(VTreeDataGraphBuilder &builder, VirtualNode
   for (VirtualSocket *vsocket : vnode->inputs()) {
     if (builder.is_data_socket(vsocket)) {
       SharedType &type = builder.query_socket_type(vsocket);
-      fn_builder.add_input(builder.query_socket_name(vsocket), type);
+      fn_builder.add_input(vsocket->name(), type);
     }
   }
   for (VirtualSocket *vsocket : vnode->outputs()) {
     if (builder.is_data_socket(vsocket)) {
       SharedType &type = builder.query_socket_type(vsocket);
-      fn_builder.add_output(builder.query_socket_name(vsocket), type);
+      fn_builder.add_output(vsocket->name(), type);
     }
   }
 
@@ -50,17 +50,39 @@ static bool insert_functions_for_bnodes(VTreeDataGraphBuilder &builder)
   return true;
 }
 
-static bool insert_links(VTreeDataGraphBuilder &builder, GraphInserters &inserters)
+static bool insert_links(VTreeDataGraphBuilder &builder)
 {
-  for (VirtualSocket *input : builder.vtree().inputs_with_links()) {
-    if (input->links().size() > 1) {
+  Map<StringPair, ConversionInserter> &map = get_conversion_inserter_map();
+
+  for (VirtualSocket *to_vsocket : builder.vtree().inputs_with_links()) {
+    if (to_vsocket->links().size() > 1) {
       continue;
     }
-    BLI_assert(input->links().size() == 1);
-    if (!builder.is_data_socket(input)) {
+    BLI_assert(to_vsocket->links().size() == 1);
+    if (!builder.is_data_socket(to_vsocket)) {
       continue;
     }
-    if (!inserters.insert_link(builder, input->links()[0], input)) {
+    VirtualSocket *from_vsocket = to_vsocket->links()[0];
+    if (!builder.is_data_socket(from_vsocket)) {
+      return false;
+    }
+
+    DFGB_Socket from_socket = builder.lookup_socket(from_vsocket);
+    DFGB_Socket to_socket = builder.lookup_socket(to_vsocket);
+
+    if (STREQ(from_vsocket->idname(), to_vsocket->idname())) {
+      builder.insert_link(from_socket, to_socket);
+      continue;
+    }
+
+    StringRef from_data_type = builder.query_socket_data_type(from_vsocket);
+    StringRef to_data_type = builder.query_socket_data_type(to_vsocket);
+    StringPair key(from_data_type.to_std_string(), to_data_type.to_std_string());
+    ConversionInserter *inserter = map.lookup_ptr(key);
+    if (inserter != nullptr) {
+      (*inserter)(builder, from_socket, to_socket);
+    }
+    else {
       return false;
     }
   }
@@ -150,13 +172,8 @@ class SocketLoaderDependencies : public DepsBody {
 };
 
 class BasicUnlinkedInputsHandler : public UnlinkedInputsHandler {
- private:
-  GraphInserters &m_inserters;
-
  public:
-  BasicUnlinkedInputsHandler(GraphInserters &inserters) : m_inserters(inserters)
-  {
-  }
+  BasicUnlinkedInputsHandler() = default;
 
   void insert(VTreeDataGraphBuilder &builder,
               ArrayRef<VirtualSocket *> unlinked_inputs,
@@ -174,8 +191,7 @@ class BasicUnlinkedInputsHandler : public UnlinkedInputsHandler {
 
       SocketLoader loader = socket_loader_map.lookup(vsocket->bsocket()->idname);
       loaders.append(loader);
-      fn_builder.add_output(builder.query_socket_name(vsocket),
-                            builder.query_socket_type(vsocket));
+      fn_builder.add_output(vsocket->name(), builder.query_socket_type(vsocket));
 
       bsockets.append(vsocket->bsocket());
       btrees.append(vsocket->btree());
@@ -195,17 +211,16 @@ class BasicUnlinkedInputsHandler : public UnlinkedInputsHandler {
 ValueOrError<VTreeDataGraph> generate_graph(VirtualNodeTree &vtree)
 {
   VTreeDataGraphBuilder builder(vtree);
-  GraphInserters &inserters = get_standard_inserters();
 
   if (!insert_functions_for_bnodes(builder)) {
     return BLI_ERROR_CREATE("error inserting functions for nodes");
   }
 
-  if (!insert_links(builder, inserters)) {
+  if (!insert_links(builder)) {
     return BLI_ERROR_CREATE("error inserting links");
   }
 
-  BasicUnlinkedInputsHandler unlinked_inputs_handler(inserters);
+  BasicUnlinkedInputsHandler unlinked_inputs_handler;
   insert_unlinked_inputs(builder, unlinked_inputs_handler);
 
   return builder.build();
diff --git a/source/blender/functions/frontends/data_flow_nodes/inserters.cpp b/source/blender/functions/frontends/data_flow_nodes/inserters.cpp
index f7f946ce58b..8d276e53983 100644
--- a/source/blender/functions/frontends/data_flow_nodes/inserters.cpp
+++ b/source/blender/functions/frontends/data_flow_nodes/inserters.cpp
@@ -13,13 +13,6 @@
 namespace FN {
 namespace DataFlowNodes {
 
-using TypePair = std::pair<SharedType, SharedType>;
-
-static void initialize_standard_inserters(GraphInserters &inserters)
-{
-  register_conversion_inserters(inserters);
-}
-
 BLI_LAZY_INIT(StringMap<NodeInserter>, get_node_inserters_map)
 {
   StringMap<NodeInserter> map;
@@ -36,83 +29,14 @@ BLI_LAZY_INIT(StringMap<SocketLoader>, get_socket_loader_map)
   return map;
 }
 
-BLI_LAZY_INIT(GraphInserters, get_standard_inserters)
-{
-  GraphInserters inserters;
-  initialize_standard_inserters(inserters);
-  return inserters;
-}
-
-GraphInserters::GraphInserters()
-    : m_type_by_data_type(&get_type_by_data_type_map()),
-      m_type_by_idname(&get_type_by_idname_map())
-{
-}
-
-void GraphInserters::reg_conversion_inserter(StringRef from_type,
-                                             StringRef to_type,
-                                             ConversionInserter inserter)
-{
-  auto key = TypePair(m_type_by_data_type->lookup(from_type),
-                      m_type_by_data_type->lookup(to_type));
-  BLI_assert(!m_conversion_inserters.contains(key));
-  m_conversion_inserters.add(key, inserter);
-}
-
-void GraphInserters::reg_conversion_function(StringRef from_type,
-                                             StringRef to_type,
-                                             FunctionGetter getter)
-{
-  auto inserter = [getter](VTreeDataGraphBuilder &builder, DFGB_Socket from, DFGB_Socket to) {
-    auto fn = getter();
-    DFGB_Node *node = builder.insert_function(fn);
-    builder.insert_link(from, node->input(0));
-    builder.insert_link(node->output(0), to);
-  };
-  this->reg_conversion_inserter(from_type, to_type, inserter);
-}
-
-bool GraphInserters::insert_link(VTreeDataGraphBuilder &builder,
-                                 VirtualSocket *from_vsocket,
-                                 VirtualSocket *to_vsocket)
+using ConversionInserterMap = Map<StringPair, ConversionInserter>;
+BLI_LAZY_INIT(ConversionInserterMap, get_conversion_inserter_map)
 {
-  BLI_assert(builder.is_data_socket(from_vsocket));
-  BLI_assert(builder.is_data_socket(to_vsocket));
-
-  DFGB_Socket from_socket = builder.lookup_socket(from_vsocket);
-  DFGB_Socket to_socket = builder.lookup_socket(to_vsocket);
-
-  SharedType &from_type = builder.query_socket_type(from_vsocket);
-  SharedType &to_type = builder.query_socket_type(to_vsocket);
-
-  if (from_type == to_type) {
-    builder.insert_link(from_socket, to_socket);
-    return true;
-  }
-
-  auto key = TypePair(from_type, to_type);
-  if (m_conversion_inserters.contains(key)) {
-    auto inserter = m_conversion_inserters.lookup(key);
-    inserter(builder, from_socket, to_socket);
-    return true;
-  }
-
-  return false;
+  Map<StringPair, ConversionInserter> map;
+  ConversionInserterRegistry registry(map);
+  register_conversion_inserters(registry);
+  return map;
 }
 
 }  // namespace DataFlowNodes
 }  // namespace FN
-
-namespace std {
-template<> struct hash<FN::DataFlowNodes::TypePair> {
-  typedef FN::DataFlowNodes::TypePair argument_type;
-  typedef size_t result_type;
-
-  result_type operator()(argument_type const &v) const noexcept
-  {
-    size_t h1 = std::hash<FN::SharedType>{}(v.first);
-    size_t h2 = std::hash<FN::SharedType>{}(v.second);
-    return h1 ^ h2;
-  }
-};
-}  // namespace std
diff --git a/source/blender/functions/frontends/data_flow_nodes/inserters.hpp b/source/blender/functions/frontends/data_flow_nodes/inserters.hpp
index 36daa02dd60..3abe4f70aed 100644
--- a/source/blender/functions/frontends/data_flow_nodes/inserters.hpp
+++ b/source/blender/functions/frontends/data_flow_nodes/inserters.hpp
@@ -13,6 +13,8 @@ struct PointerRNA;
 namespace FN {
 namespace DataFlowNodes {
 
+using StringPair = std::pair<std::string, std::string>;
+
 typedef std::function<void(VTreeDataGraphBuilder &builder, VirtualNode *vnode)> NodeInserter;
 
 typedef std::function<void(PointerRNA *socket_rna_ptr, Tuple &dst, uint index)> SocketLoader;
@@ -24,6 +26,7 @@ typedef std::function<SharedFunction()> FunctionGetter;
 
 StringMap<NodeInserter> &get_node_inserters_map();
 StringMap<SocketLoader> &get_socket_loader_map();
+Map<StringPair, ConversionInserter> &get_conversion_inserter_map();
 
 class NodeInserterRegistry {
  private:
@@ -64,27 +67,44 @@ class SocketLoaderRegistry {
   }
 };
 
-class GraphInserters {
+class ConversionInserterRegistry {
  private:
-  Map<std::pair<SharedType, SharedType>, ConversionInserter> m_conversion_inserters;
-  StringMap<SharedType> *m_type_by_data_type;
-  StringMap<SharedType> *m_type_by_idname;
+  Map<StringPair, ConversionInserter> &m_map;
 
  public:
-  GraphInserters();
-
-  void reg_conversion_inserter(StringRef fro

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list