[Bf-blender-cvs] [bc8d4427177] functions-experimental-refactor: initial new node inserters

Jacques Lucke noreply at git.blender.org
Tue Oct 22 12:52:00 CEST 2019


Commit: bc8d442717704e1ed46cffad66350cb72d3c2350
Author: Jacques Lucke
Date:   Tue Oct 22 11:47:29 2019 +0200
Branches: functions-experimental-refactor
https://developer.blender.org/rBbc8d442717704e1ed46cffad66350cb72d3c2350

initial new node inserters

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

M	source/blender/blenkernel/BKE_virtual_node_tree_cxx.h
M	source/blender/modifiers/intern/MOD_functiondeform_cxx.cc

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

diff --git a/source/blender/blenkernel/BKE_virtual_node_tree_cxx.h b/source/blender/blenkernel/BKE_virtual_node_tree_cxx.h
index 8b4f64542ed..705d8c392bd 100644
--- a/source/blender/blenkernel/BKE_virtual_node_tree_cxx.h
+++ b/source/blender/blenkernel/BKE_virtual_node_tree_cxx.h
@@ -122,12 +122,12 @@ class VirtualNode {
   MutableArrayRef<VirtualSocket *> m_outputs;
 
  public:
-  ArrayRef<VirtualSocket *> inputs()
+  ArrayRef<VirtualSocket *> inputs() const
   {
     return m_inputs;
   }
 
-  ArrayRef<VirtualSocket *> outputs()
+  ArrayRef<VirtualSocket *> outputs() const
   {
     return m_outputs;
   }
@@ -211,7 +211,7 @@ class VirtualSocket {
     return m_btree;
   }
 
-  uint id()
+  uint id() const
   {
     return m_id;
   }
diff --git a/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc b/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
index f0be0f1de75..5d336c2dec3 100644
--- a/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
+++ b/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
@@ -6,6 +6,8 @@
 #include "BKE_multi_function_network.h"
 
 #include "BLI_math_cxx.h"
+#include "BLI_string_map.h"
+#include "BLI_owned_resources.h"
 
 #include "DEG_depsgraph_query.h"
 
@@ -38,6 +40,8 @@ using BLI::Array;
 using BLI::ArrayRef;
 using BLI::float3;
 using BLI::IndexRange;
+using BLI::OwnedResources;
+using BLI::StringMap;
 using BLI::StringRef;
 using BLI::TemporaryVector;
 using BLI::Vector;
@@ -119,6 +123,11 @@ class VTreeMFNetworkBuilder {
     }
   }
 
+  const VirtualNodeTree &vtree() const
+  {
+    return m_vtree;
+  }
+
   MFBuilderFunctionNode &add_function(MultiFunction &function,
                                       ArrayRef<uint> input_param_indices,
                                       ArrayRef<uint> output_param_indices)
@@ -129,7 +138,7 @@ class VTreeMFNetworkBuilder {
   MFBuilderFunctionNode &add_function(MultiFunction &function,
                                       ArrayRef<uint> input_param_indices,
                                       ArrayRef<uint> output_param_indices,
-                                      VirtualNode &vnode)
+                                      const VirtualNode &vnode)
   {
     MFBuilderFunctionNode &node = m_builder->add_function(
         function, input_param_indices, output_param_indices);
@@ -137,7 +146,7 @@ class VTreeMFNetworkBuilder {
     return node;
   }
 
-  MFBuilderPlaceholderNode &add_placeholder(VirtualNode &vnode)
+  MFBuilderPlaceholderNode &add_placeholder(const VirtualNode &vnode)
   {
     Vector<MFDataType> input_types;
     for (VirtualSocket *vsocket : vnode.inputs()) {
@@ -171,17 +180,17 @@ class VTreeMFNetworkBuilder {
     m_builder->add_link(from, to);
   }
 
-  MFDataType try_get_data_type(VirtualSocket &vsocket) const
+  MFDataType try_get_data_type(const VirtualSocket &vsocket) const
   {
     return m_type_by_vsocket[vsocket.id()];
   }
 
-  bool is_data_socket(VirtualSocket &vsocket) const
+  bool is_data_socket(const VirtualSocket &vsocket) const
   {
     return m_type_by_vsocket[vsocket.id()].is_none();
   }
 
-  void map_sockets_exactly(VirtualNode &vnode, MFBuilderNode &node)
+  void map_sockets_exactly(const VirtualNode &vnode, MFBuilderNode &node)
   {
     BLI_assert(vnode.inputs().size() == node.inputs().size());
     BLI_assert(vnode.outputs().size() == node.outputs().size());
@@ -194,7 +203,7 @@ class VTreeMFNetworkBuilder {
     }
   }
 
-  void map_data_sockets(VirtualNode &vnode, MFBuilderNode &node)
+  void map_data_sockets(const VirtualNode &vnode, MFBuilderNode &node)
   {
     uint data_inputs = 0;
     for (VirtualSocket *vsocket : vnode.inputs()) {
@@ -219,6 +228,49 @@ class VTreeMFNetworkBuilder {
     m_socket_map[vsocket.id()] = &socket;
   }
 
+  bool vsocket_is_mapped(const VirtualSocket &vsocket) const
+  {
+    return m_socket_map[vsocket.id()] != nullptr;
+  }
+
+  bool data_sockets_are_mapped(ArrayRef<const VirtualSocket *> vsockets) const
+  {
+    for (const VirtualSocket *vsocket : vsockets) {
+      if (this->is_data_socket(*vsocket)) {
+        if (!this->vsocket_is_mapped(*vsocket)) {
+          return false;
+        }
+      }
+    }
+    return true;
+  }
+
+  bool data_sockets_of_vnode_are_mapped(const VirtualNode &vnode) const
+  {
+    if (!this->data_sockets_are_mapped(vnode.inputs())) {
+      return false;
+    }
+    if (!this->data_sockets_are_mapped(vnode.outputs())) {
+      return false;
+    }
+    return true;
+  }
+
+  bool has_data_sockets(const VirtualNode &vnode) const
+  {
+    for (const VirtualSocket *vsocket : vnode.inputs()) {
+      if (this->is_data_socket(*vsocket)) {
+        return true;
+      }
+    }
+    for (const VirtualSocket *vsocket : vnode.outputs()) {
+      if (this->is_data_socket(*vsocket)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
   std::unique_ptr<VTreeMFNetwork> build()
   {
     auto network = BLI::make_unique<MFNetwork>(std::move(m_builder));
@@ -235,6 +287,64 @@ class VTreeMFNetworkBuilder {
   }
 };
 
+using InsertVNodeFunction = std::function<void(
+    VTreeMFNetworkBuilder &builder, OwnedResources &resources, const VirtualNode &vnode)>;
+
+static void INSERT_vector_math(VTreeMFNetworkBuilder &builder,
+                               OwnedResources &resources,
+                               const VirtualNode &vnode)
+{
+  auto function = BLI::make_unique<BKE::MultiFunction_AddFloat3s>();
+  builder.add_function(*function, {0, 1}, {2}, vnode);
+  resources.add(std::move(function), "vector math function");
+}
+
+static void INSERT_combine_vector(VTreeMFNetworkBuilder &builder,
+                                  OwnedResources &resources,
+                                  const VirtualNode &vnode)
+{
+  auto function = BLI::make_unique<BKE::MultiFunction_CombineVector>();
+  builder.add_function(*function, {0, 1, 2}, {3}, vnode);
+  resources.add(std::move(function), "combine vector function");
+}
+
+static void INSERT_separate_vector(VTreeMFNetworkBuilder &builder,
+                                   OwnedResources &resources,
+                                   const VirtualNode &vnode)
+{
+  auto function = BLI::make_unique<BKE::MultiFunction_SeparateVector>();
+  builder.add_function(*function, {0}, {1, 2, 3}, vnode);
+  resources.add(std::move(function), "separate vector function");
+}
+
+static StringMap<InsertVNodeFunction> get_node_inserters()
+{
+  StringMap<InsertVNodeFunction> inserters;
+  inserters.add_new("fn_VectorMathNode", INSERT_vector_math);
+  inserters.add_new("fn_CombineVectorNode", INSERT_combine_vector);
+  inserters.add_new("fn_SeparateVectorNode", INSERT_separate_vector);
+  return inserters;
+}
+
+static void insert_nodes(VTreeMFNetworkBuilder &builder, OwnedResources &resources)
+{
+  const VirtualNodeTree &vtree = builder.vtree();
+  auto inserters = get_node_inserters();
+
+  for (const VirtualNode *vnode : vtree.nodes()) {
+    StringRef idname = vnode->idname();
+    InsertVNodeFunction *inserter = inserters.lookup_ptr(idname);
+
+    if (inserter != nullptr) {
+      (*inserter)(builder, resources, *vnode);
+      BLI_assert(builder.data_sockets_of_vnode_are_mapped(*vnode));
+    }
+    else if (builder.has_data_sockets(*vnode)) {
+      builder.add_placeholder(*vnode);
+    }
+  }
+}
+
 static std::unique_ptr<BKE::MultiFunction> get_multi_function_by_node(VirtualNode *vnode)
 {
   StringRef idname = vnode->idname();



More information about the Bf-blender-cvs mailing list