[Bf-blender-cvs] [1a90ef6e58a] functions-experimental-refactor: cleanup builder

Jacques Lucke noreply at git.blender.org
Sun Nov 3 14:31:08 CET 2019


Commit: 1a90ef6e58a45f9d7ca5dfdb873b412351afca17
Author: Jacques Lucke
Date:   Sun Nov 3 14:19:05 2019 +0100
Branches: functions-experimental-refactor
https://developer.blender.org/rB1a90ef6e58a45f9d7ca5dfdb873b412351afca17

cleanup builder

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

M	source/blender/functions2/CMakeLists.txt
A	source/blender/functions2/intern/vtree_multi_function_network/builder.cc
M	source/blender/functions2/intern/vtree_multi_function_network/builder.h

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

diff --git a/source/blender/functions2/CMakeLists.txt b/source/blender/functions2/CMakeLists.txt
index 5454be0599d..5fcc35d1a39 100644
--- a/source/blender/functions2/CMakeLists.txt
+++ b/source/blender/functions2/CMakeLists.txt
@@ -25,6 +25,7 @@ set(SRC
   intern/multi_functions/lists.cc
   intern/multi_functions/mixed.cc
   intern/multi_functions/network.cc
+  intern/vtree_multi_function_network/builder.cc
   intern/vtree_multi_function_network/generate.cc
   intern/vtree_multi_function_network/mappings_nodes.cc
   intern/vtree_multi_function_network/mappings_sockets.cc
diff --git a/source/blender/functions2/intern/vtree_multi_function_network/builder.cc b/source/blender/functions2/intern/vtree_multi_function_network/builder.cc
new file mode 100644
index 00000000000..b5c6412d2be
--- /dev/null
+++ b/source/blender/functions2/intern/vtree_multi_function_network/builder.cc
@@ -0,0 +1,167 @@
+#include "builder.h"
+
+namespace FN {
+
+VTreeMFNetworkBuilder::VTreeMFNetworkBuilder(const VirtualNodeTree &vtree,
+                                             const VTreeMultiFunctionMappings &vtree_mappings,
+                                             OwnedResources &resources)
+    : m_vtree(vtree),
+      m_vtree_mappings(vtree_mappings),
+      m_resources(resources),
+      m_socket_map(vtree.socket_count(), nullptr),
+      m_type_by_vsocket(vtree.socket_count()),
+      m_builder(BLI::make_unique<MFNetworkBuilder>())
+{
+  for (const VSocket *vsocket : vtree.all_sockets()) {
+    MFDataType data_type = vtree_mappings.data_type_by_idname.lookup_default(
+        vsocket->idname(), MFDataType::ForNone());
+    m_type_by_vsocket[vsocket->id()] = data_type;
+  }
+}
+
+MFBuilderFunctionNode &VTreeMFNetworkBuilder::add_function(const MultiFunction &function,
+                                                           ArrayRef<uint> input_param_indices,
+                                                           ArrayRef<uint> output_param_indices)
+{
+  return m_builder->add_function(function, input_param_indices, output_param_indices);
+}
+
+MFBuilderFunctionNode &VTreeMFNetworkBuilder::add_function(const MultiFunction &function,
+                                                           ArrayRef<uint> input_param_indices,
+                                                           ArrayRef<uint> output_param_indices,
+                                                           const VNode &vnode)
+{
+  MFBuilderFunctionNode &node = m_builder->add_function(
+      function, input_param_indices, output_param_indices);
+  this->map_sockets_exactly(vnode, node);
+  return node;
+}
+
+MFBuilderDummyNode &VTreeMFNetworkBuilder::add_dummy(const VNode &vnode)
+{
+  Vector<MFDataType> input_types;
+  for (const VInputSocket *vsocket : vnode.inputs()) {
+    MFDataType data_type = this->try_get_data_type(*vsocket);
+    if (!data_type.is_none()) {
+      input_types.append(data_type);
+    }
+  }
+
+  Vector<MFDataType> output_types;
+  for (const VOutputSocket *vsocket : vnode.outputs()) {
+    MFDataType data_type = this->try_get_data_type(*vsocket);
+    if (!data_type.is_none()) {
+      output_types.append(data_type);
+    }
+  }
+
+  MFBuilderDummyNode &node = m_builder->add_dummy(input_types, output_types);
+  this->map_data_sockets(vnode, node);
+  return node;
+}
+
+void VTreeMFNetworkBuilder::map_sockets_exactly(const VNode &vnode, MFBuilderNode &node)
+{
+  BLI_assert(vnode.inputs().size() == node.inputs().size());
+  BLI_assert(vnode.outputs().size() == node.outputs().size());
+
+  for (uint i = 0; i < vnode.inputs().size(); i++) {
+    m_socket_map[vnode.inputs()[i]->id()] = node.inputs()[i];
+  }
+  for (uint i = 0; i < vnode.outputs().size(); i++) {
+    m_socket_map[vnode.outputs()[i]->id()] = node.outputs()[i];
+  }
+}
+
+void VTreeMFNetworkBuilder::map_data_sockets(const VNode &vnode, MFBuilderNode &node)
+{
+  uint data_inputs = 0;
+  for (const VInputSocket *vsocket : vnode.inputs()) {
+    if (this->is_data_socket(*vsocket)) {
+      this->map_sockets(*vsocket, *node.inputs()[data_inputs]);
+      data_inputs++;
+    }
+  }
+
+  uint data_outputs = 0;
+  for (const VOutputSocket *vsocket : vnode.outputs()) {
+    if (this->is_data_socket(*vsocket)) {
+      this->map_sockets(*vsocket, *node.outputs()[data_outputs]);
+      data_outputs++;
+    }
+  }
+}
+
+bool VTreeMFNetworkBuilder::data_sockets_are_mapped(ArrayRef<const VSocket *> vsockets) const
+{
+  for (const VSocket *vsocket : vsockets) {
+    if (this->is_data_socket(*vsocket)) {
+      if (!this->vsocket_is_mapped(*vsocket)) {
+        return false;
+      }
+    }
+  }
+  return true;
+}
+
+bool VTreeMFNetworkBuilder::data_sockets_of_vnode_are_mapped(const VNode &vnode) const
+{
+  if (!this->data_sockets_are_mapped(vnode.inputs().cast<const VSocket *>())) {
+    return false;
+  }
+  if (!this->data_sockets_are_mapped(vnode.outputs().cast<const VSocket *>())) {
+    return false;
+  }
+  return true;
+}
+
+bool VTreeMFNetworkBuilder::has_data_sockets(const VNode &vnode) const
+{
+  for (const VInputSocket *vsocket : vnode.inputs()) {
+    if (this->is_data_socket(*vsocket)) {
+      return true;
+    }
+  }
+  for (const VOutputSocket *vsocket : vnode.outputs()) {
+    if (this->is_data_socket(*vsocket)) {
+      return true;
+    }
+  }
+  return false;
+}
+
+const CPPType &VTreeMFNetworkBuilder::cpp_type_from_property(const VNode &vnode,
+                                                             StringRefNull prop_name) const
+{
+  char *type_name = RNA_string_get_alloc(vnode.rna(), prop_name.data(), nullptr, 0);
+  const CPPType &type = this->cpp_type_by_name(type_name);
+  MEM_freeN(type_name);
+  return type;
+}
+
+std::unique_ptr<VTreeMFNetwork> VTreeMFNetworkBuilder::build()
+{
+  m_builder->to_dot__clipboard();
+
+  Array<int> socket_ids(m_vtree.socket_count(), -1);
+  for (uint vsocket_id = 0; vsocket_id < m_vtree.socket_count(); vsocket_id++) {
+    MFBuilderSocket *builder_socket = m_socket_map[vsocket_id];
+    if (builder_socket != nullptr) {
+      socket_ids[vsocket_id] = builder_socket->id();
+    }
+  }
+
+  auto network = BLI::make_unique<MFNetwork>(std::move(m_builder));
+
+  Array<const MFSocket *> socket_map(m_vtree.socket_count(), nullptr);
+  for (uint vsocket_id = 0; vsocket_id < m_vtree.socket_count(); vsocket_id++) {
+    int id = socket_ids[vsocket_id];
+    if (id != -1) {
+      socket_map[vsocket_id] = &network->socket_by_id(socket_ids[vsocket_id]);
+    }
+  }
+
+  return BLI::make_unique<VTreeMFNetwork>(m_vtree, std::move(network), std::move(socket_map));
+}
+
+}  // namespace FN
diff --git a/source/blender/functions2/intern/vtree_multi_function_network/builder.h b/source/blender/functions2/intern/vtree_multi_function_network/builder.h
index a54c1a8b7d5..ce8c2776d5d 100644
--- a/source/blender/functions2/intern/vtree_multi_function_network/builder.h
+++ b/source/blender/functions2/intern/vtree_multi_function_network/builder.h
@@ -18,20 +18,7 @@ class VTreeMFNetworkBuilder : BLI::NonCopyable, BLI::NonMovable {
  public:
   VTreeMFNetworkBuilder(const VirtualNodeTree &vtree,
                         const VTreeMultiFunctionMappings &vtree_mappings,
-                        OwnedResources &resources)
-      : m_vtree(vtree),
-        m_vtree_mappings(vtree_mappings),
-        m_resources(resources),
-        m_socket_map(vtree.socket_count(), nullptr),
-        m_type_by_vsocket(vtree.socket_count()),
-        m_builder(BLI::make_unique<MFNetworkBuilder>())
-  {
-    for (const VSocket *vsocket : vtree.all_sockets()) {
-      MFDataType data_type = vtree_mappings.data_type_by_idname.lookup_default(
-          vsocket->idname(), MFDataType::ForNone());
-      m_type_by_vsocket[vsocket->id()] = data_type;
-    }
-  }
+                        OwnedResources &resources);
 
   const VirtualNodeTree &vtree() const
   {
@@ -40,44 +27,14 @@ class VTreeMFNetworkBuilder : BLI::NonCopyable, BLI::NonMovable {
 
   MFBuilderFunctionNode &add_function(const MultiFunction &function,
                                       ArrayRef<uint> input_param_indices,
-                                      ArrayRef<uint> output_param_indices)
-  {
-    return m_builder->add_function(function, input_param_indices, output_param_indices);
-  }
+                                      ArrayRef<uint> output_param_indices);
 
   MFBuilderFunctionNode &add_function(const MultiFunction &function,
                                       ArrayRef<uint> input_param_indices,
                                       ArrayRef<uint> output_param_indices,
-                                      const VNode &vnode)
-  {
-    MFBuilderFunctionNode &node = m_builder->add_function(
-        function, input_param_indices, output_param_indices);
-    this->map_sockets_exactly(vnode, node);
-    return node;
-  }
-
-  MFBuilderDummyNode &add_dummy(const VNode &vnode)
-  {
-    Vector<MFDataType> input_types;
-    for (const VInputSocket *vsocket : vnode.inputs()) {
-      MFDataType data_type = this->try_get_data_type(*vsocket);
-      if (!data_type.is_none()) {
-        input_types.append(data_type);
-      }
-    }
+                                      const VNode &vnode);
 
-    Vector<MFDataType> output_types;
-    for (const VOutputSocket *vsocket : vnode.outputs()) {
-      MFDataType data_type = this->try_get_data_type(*vsocket);
-      if (!data_type.is_none()) {
-        output_types.append(data_type);
-      }
-    }
-
-    MFBuilderDummyNode &node = m_builder->add_dummy(input_types, output_types);
-    this->map_data_sockets(vnode, node);
-    return node;
-  }
+  MFBuilderDummyNode &add_dummy(const VNode &vnode);
 
   MFBuilderDummyNode &add_dummy(ArrayRef<MFDataType> input_types,
                                 ArrayRef<MFDataType> output_types)
@@ -108,37 +65,9 @@ class VTreeMFNetworkBuilder : BLI::NonCopyable, BLI::NonMovable {
     return !m_type_by_vsocket[vsocket.id()].is_none();
   }
 
-  void map_sockets_exactly(const VNode &vnode, MFBuilderNode &node)
-  {
-    BLI_assert(vnode.inputs().size() == node.inputs().size());
-    BLI_assert(vnode.outputs().size() == node.outputs().size());
-
-    for (uint i = 0; i < vnode.inputs().size(); i++) {
-      m_socket_map[vnode.inputs()[i]

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list