[Bf-blender-cvs] [046204e7b27] functions: extract preprocessed vtree data from builder

Jacques Lucke noreply at git.blender.org
Thu Nov 21 15:19:33 CET 2019


Commit: 046204e7b2743db1457fad8fd8e36284969492b7
Author: Jacques Lucke
Date:   Tue Nov 19 13:38:25 2019 +0100
Branches: functions
https://developer.blender.org/rB046204e7b2743db1457fad8fd8e36284969492b7

extract preprocessed vtree data from builder

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

M	source/blender/functions/intern/vtree_multi_function_network/builder.cc
M	source/blender/functions/intern/vtree_multi_function_network/builder.h
M	source/blender/functions/intern/vtree_multi_function_network/generate.cc

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

diff --git a/source/blender/functions/intern/vtree_multi_function_network/builder.cc b/source/blender/functions/intern/vtree_multi_function_network/builder.cc
index c822fa22bb6..b7b9348bd36 100644
--- a/source/blender/functions/intern/vtree_multi_function_network/builder.cc
+++ b/source/blender/functions/intern/vtree_multi_function_network/builder.cc
@@ -2,25 +2,18 @@
 
 namespace FN {
 
-VTreeMFNetworkBuilder::VTreeMFNetworkBuilder(const VirtualNodeTree &vtree,
-                                             const VTreeMultiFunctionMappings &vtree_mappings,
-                                             ResourceCollector &resources)
+VTreeMFNetworkBuilder::VTreeMFNetworkBuilder(
+    const VirtualNodeTree &vtree,
+    const PreprocessedVTreeMFData &preprocessed_vtree_data,
+    const VTreeMultiFunctionMappings &vtree_mappings,
+    ResourceCollector &resources)
     : m_vtree(vtree),
+      m_preprocessed_vtree_data(preprocessed_vtree_data),
       m_vtree_mappings(vtree_mappings),
       m_resources(resources),
       m_single_socket_by_vsocket(vtree.socket_count(), VTreeMFSocketMap_UNMAPPED),
-      m_type_by_vsocket(vtree.socket_count()),
       m_builder(BLI::make_unique<MFNetworkBuilder>())
 {
-  for (const VSocket *vsocket : vtree.all_sockets()) {
-    const MFDataType *data_type = vtree_mappings.data_type_by_idname.lookup_ptr(vsocket->idname());
-    if (data_type == nullptr) {
-      m_type_by_vsocket[vsocket->id()] = {};
-    }
-    else {
-      m_type_by_vsocket[vsocket->id()] = MFDataType(*data_type);
-    }
-  }
 }
 
 MFBuilderFunctionNode &VTreeMFNetworkBuilder::add_function(const MultiFunction &function,
diff --git a/source/blender/functions/intern/vtree_multi_function_network/builder.h b/source/blender/functions/intern/vtree_multi_function_network/builder.h
index ee31a3c0b67..260eb8e32d1 100644
--- a/source/blender/functions/intern/vtree_multi_function_network/builder.h
+++ b/source/blender/functions/intern/vtree_multi_function_network/builder.h
@@ -10,9 +10,48 @@ namespace FN {
 
 using BLI::MultiMap;
 
+class PreprocessedVTreeMFData {
+ private:
+  const VirtualNodeTree &m_vtree;
+  Array<Optional<MFDataType>> m_data_type_by_vsocket_id;
+
+ public:
+  PreprocessedVTreeMFData(const VirtualNodeTree &vtree) : m_vtree(vtree)
+  {
+    auto &mappings = get_vtree_multi_function_mappings();
+
+    m_data_type_by_vsocket_id = Array<Optional<MFDataType>>(vtree.socket_count());
+    for (const VSocket *vsocket : vtree.all_sockets()) {
+      const MFDataType *data_type = mappings.data_type_by_idname.lookup_ptr(vsocket->idname());
+      if (data_type == nullptr) {
+        m_data_type_by_vsocket_id[vsocket->id()] = {};
+      }
+      else {
+        m_data_type_by_vsocket_id[vsocket->id()] = MFDataType(*data_type);
+      }
+    }
+  }
+
+  Optional<MFDataType> try_lookup_data_type(const VSocket &vsocket) const
+  {
+    return m_data_type_by_vsocket_id[vsocket.id()];
+  }
+
+  MFDataType lookup_data_type(const VSocket &vsocket) const
+  {
+    return m_data_type_by_vsocket_id[vsocket.id()].value();
+  }
+
+  bool is_data_socket(const VSocket &vsocket) const
+  {
+    return m_data_type_by_vsocket_id[vsocket.id()].has_value();
+  }
+};
+
 class VTreeMFNetworkBuilder : BLI::NonCopyable, BLI::NonMovable {
  private:
   const VirtualNodeTree &m_vtree;
+  const PreprocessedVTreeMFData &m_preprocessed_vtree_data;
   const VTreeMultiFunctionMappings &m_vtree_mappings;
   ResourceCollector &m_resources;
 
@@ -23,11 +62,11 @@ class VTreeMFNetworkBuilder : BLI::NonCopyable, BLI::NonMovable {
   MultiMap<uint, uint> m_multiple_inputs_by_vsocket;
   static constexpr intptr_t MULTI_MAP_INDICATOR = 1;
 
-  Array<Optional<MFDataType>> m_type_by_vsocket;
   std::unique_ptr<MFNetworkBuilder> m_builder;
 
  public:
   VTreeMFNetworkBuilder(const VirtualNodeTree &vtree,
+                        const PreprocessedVTreeMFData &preprocessed_vtree_data,
                         const VTreeMultiFunctionMappings &vtree_mappings,
                         ResourceCollector &resources);
 
@@ -82,12 +121,12 @@ class VTreeMFNetworkBuilder : BLI::NonCopyable, BLI::NonMovable {
 
   Optional<MFDataType> try_get_data_type(const VSocket &vsocket) const
   {
-    return m_type_by_vsocket[vsocket.id()];
+    return m_preprocessed_vtree_data.try_lookup_data_type(vsocket);
   }
 
   bool is_data_socket(const VSocket &vsocket) const
   {
-    return m_type_by_vsocket[vsocket.id()].has_value();
+    return m_preprocessed_vtree_data.is_data_socket(vsocket);
   }
 
   void map_data_sockets(const VNode &vnode, MFBuilderNode &node);
diff --git a/source/blender/functions/intern/vtree_multi_function_network/generate.cc b/source/blender/functions/intern/vtree_multi_function_network/generate.cc
index c454fd730a8..b92c01ca09a 100644
--- a/source/blender/functions/intern/vtree_multi_function_network/generate.cc
+++ b/source/blender/functions/intern/vtree_multi_function_network/generate.cc
@@ -109,8 +109,9 @@ std::unique_ptr<VTreeMFNetwork> generate_vtree_multi_function_network(const Virt
                                                                       ResourceCollector &resources)
 {
   const VTreeMultiFunctionMappings &mappings = get_vtree_multi_function_mappings();
+  PreprocessedVTreeMFData preprocessed_data{vtree};
 
-  VTreeMFNetworkBuilder builder(vtree, mappings, resources);
+  VTreeMFNetworkBuilder builder(vtree, preprocessed_data, mappings, resources);
   if (!insert_nodes(builder, mappings)) {
     BLI_assert(false);
   }



More information about the Bf-blender-cvs mailing list