[Bf-blender-cvs] [7bef9b83fb5] functions-experimental-refactor: initial MultiFunction generation from node tree

Jacques Lucke noreply at git.blender.org
Tue Oct 22 13:55:10 CEST 2019


Commit: 7bef9b83fb587e3b69ec4a37a3de5273896b1e6f
Author: Jacques Lucke
Date:   Tue Oct 22 13:54:55 2019 +0200
Branches: functions-experimental-refactor
https://developer.blender.org/rB7bef9b83fb587e3b69ec4a37a3de5273896b1e6f

initial MultiFunction generation from node tree

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

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

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

diff --git a/source/blender/blenkernel/BKE_multi_function.h b/source/blender/blenkernel/BKE_multi_function.h
index a776ff8dcee..4b343fc12f9 100644
--- a/source/blender/blenkernel/BKE_multi_function.h
+++ b/source/blender/blenkernel/BKE_multi_function.h
@@ -520,6 +520,9 @@ class MFParamsBuilder {
 
 class MultiFunction {
  public:
+  virtual ~MultiFunction()
+  {
+  }
   virtual void call(ArrayRef<uint> mask_indices, MFParams &params, MFContext &context) const = 0;
 
   const MFSignature &signature() const
diff --git a/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc b/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
index b890e236561..4eb941d2ed4 100644
--- a/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
+++ b/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
@@ -57,13 +57,9 @@ static MFDataType get_type_by_socket(const VirtualSocket &vsocket)
   if (idname == "fn_FloatSocket") {
     return MFDataType::ForSingle<float>();
   }
-  else if (idname == "fn_IntegerSocket") {
-    return MFDataType::ForSingle<int>();
-  }
   else if (idname == "fn_VectorSocket") {
     return MFDataType::ForSingle<float3>();
   }
-  BLI_assert(false);
   return MFDataType();
 }
 
@@ -91,7 +87,7 @@ class VTreeMFNetwork {
     return *m_network;
   }
 
-  const MFSocket &lookup_socket(VirtualSocket &vsocket)
+  const MFSocket &lookup_socket(const VirtualSocket &vsocket)
   {
     return *m_socket_map[vsocket.id()];
   }
@@ -128,14 +124,14 @@ class VTreeMFNetworkBuilder {
     return m_vtree;
   }
 
-  MFBuilderFunctionNode &add_function(MultiFunction &function,
+  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);
   }
 
-  MFBuilderFunctionNode &add_function(MultiFunction &function,
+  MFBuilderFunctionNode &add_function(const MultiFunction &function,
                                       ArrayRef<uint> input_param_indices,
                                       ArrayRef<uint> output_param_indices,
                                       const VirtualNode &vnode)
@@ -187,7 +183,7 @@ class VTreeMFNetworkBuilder {
 
   bool is_data_socket(const VirtualSocket &vsocket) const
   {
-    return m_type_by_vsocket[vsocket.id()].is_none();
+    return !m_type_by_vsocket[vsocket.id()].is_none();
   }
 
   void map_sockets_exactly(const VirtualNode &vnode, MFBuilderNode &node)
@@ -271,7 +267,13 @@ class VTreeMFNetworkBuilder {
     return false;
   }
 
-  MFBuilderOutputSocket &lookup_output_socket(const VirtualSocket &vsocket)
+  bool is_input_linked(const VirtualSocket &vsocket) const
+  {
+    auto &socket = this->lookup_input_socket(vsocket);
+    return socket.as_input().origin() != nullptr;
+  }
+
+  MFBuilderOutputSocket &lookup_output_socket(const VirtualSocket &vsocket) const
   {
     BLI_assert(vsocket.is_output());
     MFBuilderSocket *socket = m_socket_map[vsocket.id()];
@@ -279,7 +281,7 @@ class VTreeMFNetworkBuilder {
     return socket->as_output();
   }
 
-  MFBuilderInputSocket &lookup_input_socket(const VirtualSocket &vsocket)
+  MFBuilderInputSocket &lookup_input_socket(const VirtualSocket &vsocket) const
   {
     BLI_assert(vsocket.is_input());
     MFBuilderSocket *socket = m_socket_map[vsocket.id()];
@@ -289,13 +291,21 @@ class VTreeMFNetworkBuilder {
 
   std::unique_ptr<VTreeMFNetwork> build()
   {
+    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++) {
-      MFBuilderSocket *builder_socket = m_socket_map[vsocket_id];
-      if (builder_socket != nullptr) {
-        socket_map[vsocket_id] = &network->socket_by_id(builder_socket->id());
+      int id = socket_ids[vsocket_id];
+      if (id != -1) {
+        socket_map[vsocket_id] = &network->socket_by_id(socket_ids[vsocket_id]);
       }
     }
 
@@ -305,6 +315,8 @@ class VTreeMFNetworkBuilder {
 
 using InsertVNodeFunction = std::function<void(
     VTreeMFNetworkBuilder &builder, OwnedResources &resources, const VirtualNode &vnode)>;
+using InsertUnlinkedInputFunction = std::function<MFBuilderOutputSocket &(
+    VTreeMFNetworkBuilder &builder, OwnedResources &resources, const VirtualSocket &vsocket)>;
 
 static void INSERT_vector_math(VTreeMFNetworkBuilder &builder,
                                OwnedResources &resources,
@@ -342,7 +354,44 @@ static StringMap<InsertVNodeFunction> get_node_inserters()
   return inserters;
 }
 
-static void insert_nodes(VTreeMFNetworkBuilder &builder, OwnedResources &resources)
+static MFBuilderOutputSocket &INSERT_vector_socket(VTreeMFNetworkBuilder &builder,
+                                                   OwnedResources &resources,
+                                                   const VirtualSocket &vsocket)
+{
+  PointerRNA rna = vsocket.rna();
+  float3 value;
+  RNA_float_get_array(&rna, "value", value);
+
+  auto function = BLI::make_unique<BKE::MultiFunction_ConstantValue<float3>>(value);
+  auto &node = builder.add_function(*function, {}, {0});
+
+  resources.add(std::move(function), "vector input");
+  return *node.outputs()[0];
+}
+
+static MFBuilderOutputSocket &INSERT_float_socket(VTreeMFNetworkBuilder &builder,
+                                                  OwnedResources &resources,
+                                                  const VirtualSocket &vsocket)
+{
+  PointerRNA rna = vsocket.rna();
+  float value = RNA_float_get(&rna, "value");
+
+  auto function = BLI::make_unique<BKE::MultiFunction_ConstantValue<float>>(value);
+  auto &node = builder.add_function(*function, {}, {0});
+
+  resources.add(std::move(function), "float input");
+  return *node.outputs()[0];
+}
+
+static StringMap<InsertUnlinkedInputFunction> get_unlinked_input_inserter()
+{
+  StringMap<InsertUnlinkedInputFunction> inserters;
+  inserters.add_new("fn_VectorSocket", INSERT_vector_socket);
+  inserters.add_new("fn_FloatSocket", INSERT_float_socket);
+  return inserters;
+}
+
+static bool insert_nodes(VTreeMFNetworkBuilder &builder, OwnedResources &resources)
 {
   const VirtualNodeTree &vtree = builder.vtree();
   auto inserters = get_node_inserters();
@@ -359,9 +408,11 @@ static void insert_nodes(VTreeMFNetworkBuilder &builder, OwnedResources &resourc
       builder.add_placeholder(*vnode);
     }
   }
+
+  return true;
 }
 
-static bool insert_links(VTreeMFNetworkBuilder &builder, OwnedResources &resources)
+static bool insert_links(VTreeMFNetworkBuilder &builder, OwnedResources &UNUSED(resources))
 {
   for (const VirtualSocket *to_vsocket : builder.vtree().inputs_with_links()) {
     if (to_vsocket->links().size() > 1) {
@@ -387,48 +438,37 @@ static bool insert_links(VTreeMFNetworkBuilder &builder, OwnedResources &resourc
 
     builder.add_link(from_socket, to_socket);
   }
+
+  return true;
 }
 
-static std::unique_ptr<BKE::MultiFunction> get_multi_function_by_node(VirtualNode *vnode)
+static bool insert_unlinked_inputs(VTreeMFNetworkBuilder &builder, OwnedResources &resources)
 {
-  StringRef idname = vnode->idname();
-
-  if (idname == "fn_VectorMathNode") {
-    return BLI::make_unique<BKE::MultiFunction_AddFloat3s>();
-  }
-  else if (idname == "fn_CombineVectorNode") {
-    return BLI::make_unique<BKE::MultiFunction_CombineVector>();
-  }
-  else if (idname == "fn_SeparateVectorNode") {
-    return BLI::make_unique<BKE::MultiFunction_SeparateVector>();
-  }
-  else {
-    BLI_assert(false);
-    return {};
+  Vector<const VirtualSocket *> unlinked_data_inputs;
+  for (const VirtualNode *vnode : builder.vtree().nodes()) {
+    for (const VirtualSocket *vsocket : vnode->inputs()) {
+      if (builder.is_data_socket(*vsocket)) {
+        if (!builder.is_input_linked(*vsocket)) {
+          unlinked_data_inputs.append(vsocket);
+        }
+      }
+    }
   }
-}
 
-static void load_socket_value(VirtualSocket *vsocket, TupleRef tuple, uint index)
-{
-  StringRef idname = vsocket->idname();
-  PointerRNA rna = vsocket->rna();
+  auto inserters = get_unlinked_input_inserter();
 
-  if (idname == "fn_FloatSocket") {
-    float value = RNA_float_get(&rna, "value");
-    tuple.set<float>(index, value);
-  }
-  else if (idname == "fn_IntegerSocket") {
-    int value = RNA_int_get(&rna, "value");
-    tuple.set<int>(index, value);
-  }
-  else if (idname == "fn_VectorSocket") {
-    float3 value;
-    RNA_float_get_array(&rna, "value", value);
-    tuple.set<float3>(index, value);
-  }
-  else {
-    BLI_assert(false);
+  for (const VirtualSocket *vsocket : unlinked_data_inputs) {
+    InsertUnlinkedInputFunction *inserter = inserters.lookup_ptr(vsocket->idname());
+
+    if (inserter == nullptr) {
+      return false;
+    }
+    MFBuilderOutputSocket &from_socket = (*inserter)(builder, resources, *vsocket);
+    MFBuilderInputSocket &to_socket = builder.lookup_input_socket(*vsocket);
+    builder.add_link(from_socket, to_socket);
   }
+
+  return true;
 }
 
 class MultiFunction_FunctionTree : public BKE::MultiFunction {
@@ -544,36 +584,34 @@ void MOD_functiondeform_do(FunctionDeformModifierData *fdmd, float (*vertexCos)[
 
   bNodeTree *tree = (bNodeTree *)DEG_get_original_id((ID *)fdmd->function_tree);
   VirtualNodeTree vtree;
-  // vtree.add_all_of_tree(tree);
+  vtree.add_all_of_tree(tree);
   vtree.freeze_and_index();
 
-  VTreeMFNetworkBuilder builder(vtree);
-
-  auto &input_node = builder.add_placeholder(
-      {}, {MFDataType::ForSingle<float3>(), MFDataType::ForSingle<float>()});
-
-  auto &output_node = builder.add_placeholder({MFDataType::ForSingle<float3>()}, {});
+  const VirtualNode &input_vnode = *vtree.nodes_with_idname("fn_FunctionInputNode")[0];
+  const Virt

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list