[Bf-blender-cvs] [ea0b7dc6d19] functions: make multifunction generation work with inlined node trees

Jacques Lucke noreply at git.blender.org
Sat Nov 30 16:40:06 CET 2019


Commit: ea0b7dc6d195756bd587785ce4ce10e6fcc57c50
Author: Jacques Lucke
Date:   Wed Nov 27 15:47:40 2019 +0100
Branches: functions
https://developer.blender.org/rBea0b7dc6d195756bd587785ce4ce10e6fcc57c50

make multifunction generation work with inlined node trees

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

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 a5687c2f00a..ad8ca2cbcd7 100644
--- a/source/blender/functions/intern/vtree_multi_function_network/builder.cc
+++ b/source/blender/functions/intern/vtree_multi_function_network/builder.cc
@@ -194,7 +194,7 @@ const MultiFunction &VNodeMFNetworkBuilder::get_vectorized_function(
 
 std::unique_ptr<VTreeMFNetwork> VTreeMFNetworkBuilder::build()
 {
-  m_builder->to_dot__clipboard();
+  // m_builder->to_dot__clipboard();
 
   auto network = BLI::make_unique<MFNetwork>(std::move(m_builder));
 
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 a6aaa304f00..92c0af3bf34 100644
--- a/source/blender/functions/intern/vtree_multi_function_network/builder.h
+++ b/source/blender/functions/intern/vtree_multi_function_network/builder.h
@@ -9,12 +9,15 @@
 
 namespace FN {
 
+using BKE::VSocket;
+using BKE::XGroupInput;
 using BLI::MultiMap;
 
 class PreprocessedVTreeMFData {
  private:
   const InlinedNodeTree &m_vtree;
   Array<Optional<MFDataType>> m_data_type_by_vsocket_id;
+  Array<Optional<MFDataType>> m_data_type_by_group_input_id;
 
  public:
   PreprocessedVTreeMFData(const InlinedNodeTree &vtree) : m_vtree(vtree)
@@ -23,13 +26,14 @@ class PreprocessedVTreeMFData {
 
     m_data_type_by_vsocket_id = Array<Optional<MFDataType>>(vtree.socket_count());
     for (const XSocket *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);
-      }
+      m_data_type_by_vsocket_id[vsocket->id()] = mappings.data_type_by_idname.try_lookup(
+          vsocket->idname());
+    }
+
+    m_data_type_by_group_input_id = Array<Optional<MFDataType>>(vtree.all_group_inputs().size());
+    for (const XGroupInput *group_input : vtree.all_group_inputs()) {
+      m_data_type_by_group_input_id[group_input->id()] = mappings.data_type_by_idname.try_lookup(
+          group_input->vsocket().idname());
     }
   }
 
@@ -47,6 +51,11 @@ class PreprocessedVTreeMFData {
   {
     return m_data_type_by_vsocket_id[vsocket.id()].has_value();
   }
+
+  bool is_data_group_input(const XGroupInput &group_input) const
+  {
+    return m_data_type_by_group_input_id[group_input.id()].has_value();
+  }
 };
 
 class VTreeMFNetworkBuilder : BLI::NonCopyable, BLI::NonMovable {
@@ -63,6 +72,8 @@ class VTreeMFNetworkBuilder : BLI::NonCopyable, BLI::NonMovable {
   MultiMap<uint, uint> m_multiple_inputs_by_vsocket;
   static constexpr intptr_t MULTI_MAP_INDICATOR = 1;
 
+  Map<const XGroupInput *, MFBuilderOutputSocket *> m_group_inputs_mapping;
+
   std::unique_ptr<MFNetworkBuilder> m_builder;
 
  public:
@@ -125,6 +136,11 @@ class VTreeMFNetworkBuilder : BLI::NonCopyable, BLI::NonMovable {
     return m_preprocessed_vtree_data.is_data_socket(vsocket);
   }
 
+  bool is_data_group_input(const XGroupInput &group_input) const
+  {
+    return m_preprocessed_vtree_data.is_data_group_input(group_input);
+  }
+
   void map_data_sockets(const XNode &vnode, MFBuilderNode &node);
 
   void map_sockets(const XInputSocket &vsocket, MFBuilderInputSocket &socket)
@@ -174,6 +190,16 @@ class VTreeMFNetworkBuilder : BLI::NonCopyable, BLI::NonMovable {
     }
   }
 
+  void map_group_input(const XGroupInput &group_input, MFBuilderOutputSocket &socket)
+  {
+    m_group_inputs_mapping.add_new(&group_input, &socket);
+  }
+
+  MFBuilderOutputSocket &lookup_group_input(const XGroupInput &group_input) const
+  {
+    return *m_group_inputs_mapping.lookup(&group_input);
+  }
+
   bool vsocket_is_mapped(const XSocket &vsocket) const
   {
     return m_single_socket_by_vsocket[vsocket.id()] != VTreeMFSocketMap_UNMAPPED;
@@ -233,11 +259,11 @@ class VTreeMFNetworkBuilder : BLI::NonCopyable, BLI::NonMovable {
 class VSocketMFNetworkBuilder {
  private:
   VTreeMFNetworkBuilder &m_network_builder;
-  const XSocket &m_vsocket;
+  const VSocket &m_vsocket;
   MFBuilderOutputSocket *m_socket_to_build = nullptr;
 
  public:
-  VSocketMFNetworkBuilder(VTreeMFNetworkBuilder &network_builder, const XSocket &vsocket)
+  VSocketMFNetworkBuilder(VTreeMFNetworkBuilder &network_builder, const VSocket &vsocket)
       : m_network_builder(network_builder), m_vsocket(vsocket)
   {
   }
@@ -248,7 +274,7 @@ class VSocketMFNetworkBuilder {
     return *m_socket_to_build;
   }
 
-  const XSocket &vsocket() const
+  const VSocket &vsocket() const
   {
     return m_vsocket;
   }
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 f4728098050..77b4fceb511 100644
--- a/source/blender/functions/intern/vtree_multi_function_network/generate.cc
+++ b/source/blender/functions/intern/vtree_multi_function_network/generate.cc
@@ -10,6 +10,8 @@
 
 namespace FN {
 
+using BKE::XGroupInput;
+
 static bool insert_nodes(VTreeMFNetworkBuilder &builder,
                          const VTreeMultiFunctionMappings &mappings)
 {
@@ -30,6 +32,16 @@ static bool insert_nodes(VTreeMFNetworkBuilder &builder,
     }
   }
 
+  for (const XGroupInput *group_input : vtree.all_group_inputs()) {
+    VSocketMFNetworkBuilder socket_builder{builder, group_input->vsocket()};
+    const InsertVSocketFunction *inserter = mappings.vsocket_inserters.lookup_ptr(
+        group_input->vsocket().idname());
+    if (inserter != nullptr) {
+      (*inserter)(socket_builder);
+      builder.map_group_input(*group_input, socket_builder.built_socket());
+    }
+  }
+
   return true;
 }
 
@@ -37,21 +49,34 @@ static bool insert_links(VTreeMFNetworkBuilder &builder,
                          const VTreeMultiFunctionMappings &mappings)
 {
   for (const XInputSocket *to_vsocket : builder.vtree().all_input_sockets()) {
-    ArrayRef<const XOutputSocket *> origins = to_vsocket->linked_sockets();
-    if (origins.size() != 1) {
+    if (!builder.is_data_socket(*to_vsocket)) {
       continue;
     }
 
-    if (!builder.is_data_socket(*to_vsocket)) {
+    ArrayRef<const XOutputSocket *> origin_sockets = to_vsocket->linked_sockets();
+    ArrayRef<const XGroupInput *> origin_group_inputs = to_vsocket->linked_group_inputs();
+    if (origin_sockets.size() + origin_group_inputs.size() != 1) {
       continue;
     }
 
-    const XOutputSocket *from_vsocket = origins[0];
-    if (!builder.is_data_socket(*from_vsocket)) {
-      return false;
+    MFBuilderOutputSocket *from_socket = nullptr;
+    StringRef from_idname;
+
+    if (origin_sockets.size() == 1) {
+      if (!builder.is_data_socket(*origin_sockets[0])) {
+        return false;
+      }
+      from_socket = &builder.lookup_socket(*origin_sockets[0]);
+      from_idname = origin_sockets[0]->idname();
+    }
+    else {
+      if (!builder.is_data_group_input(*origin_group_inputs[0])) {
+        return false;
+      }
+      from_socket = &builder.lookup_group_input(*origin_group_inputs[0]);
+      from_idname = origin_group_inputs[0]->vsocket().idname();
     }
 
-    MFBuilderOutputSocket *from_socket = &builder.lookup_socket(*from_vsocket);
     Vector<MFBuilderInputSocket *> to_sockets = builder.lookup_socket(*to_vsocket);
     BLI_assert(to_sockets.size() >= 1);
 
@@ -60,7 +85,7 @@ static bool insert_links(VTreeMFNetworkBuilder &builder,
 
     if (from_type != to_type) {
       const InsertImplicitConversionFunction *inserter = mappings.conversion_inserters.lookup_ptr(
-          {from_vsocket->idname(), to_vsocket->idname()});
+          {from_idname, to_vsocket->idname()});
       if (inserter == nullptr) {
         return false;
       }
@@ -97,7 +122,7 @@ static bool insert_unlinked_inputs(VTreeMFNetworkBuilder &builder,
       return false;
     }
 
-    VSocketMFNetworkBuilder vsocket_builder{builder, *vsocket};
+    VSocketMFNetworkBuilder vsocket_builder{builder, vsocket->vsocket()};
     (*inserter)(vsocket_builder);
     for (MFBuilderInputSocket *to_socket : builder.lookup_socket(*vsocket)) {
       builder.add_link(vsocket_builder.built_socket(), *to_socket);



More information about the Bf-blender-cvs mailing list