[Bf-blender-cvs] [f52e43554f5] functions-experimental-refactor: simplify interface for generating functions from node trees

Jacques Lucke noreply at git.blender.org
Sun Nov 3 16:32:30 CET 2019


Commit: f52e43554f58a2db9b62231a19bbc7be899eabab
Author: Jacques Lucke
Date:   Sun Nov 3 16:32:23 2019 +0100
Branches: functions-experimental-refactor
https://developer.blender.org/rBf52e43554f58a2db9b62231a19bbc7be899eabab

simplify interface for generating functions from node trees

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

M	source/blender/functions2/FN_vtree_multi_function_network.h
M	source/blender/functions2/FN_vtree_multi_function_network_generation.h
M	source/blender/functions2/intern/vtree_multi_function_network/generate.cc
M	source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
M	source/blender/modifiers/intern/MOD_functionpoints_cxx.cc

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

diff --git a/source/blender/functions2/FN_vtree_multi_function_network.h b/source/blender/functions2/FN_vtree_multi_function_network.h
index 028063e0696..c08aa56c0fa 100644
--- a/source/blender/functions2/FN_vtree_multi_function_network.h
+++ b/source/blender/functions2/FN_vtree_multi_function_network.h
@@ -37,9 +37,32 @@ class VTreeMFNetwork {
     return *m_network;
   }
 
-  const MFSocket &lookup_socket(const VSocket &vsocket)
+  const MFInputSocket &lookup_socket(const VInputSocket &vsocket)
   {
-    return *m_socket_map[vsocket.id()];
+    return m_socket_map[vsocket.id()]->as_input();
+  }
+
+  const MFOutputSocket &lookup_socket(const VOutputSocket &vsocket)
+  {
+    return m_socket_map[vsocket.id()]->as_output();
+  }
+
+  void lookup_sockets(ArrayRef<const VOutputSocket *> vsockets,
+                      MutableArrayRef<const MFOutputSocket *> r_result)
+  {
+    BLI_assert(vsockets.size() == r_result.size());
+    for (uint i = 0; i < vsockets.size(); i++) {
+      r_result[i] = &this->lookup_socket(*vsockets[i]);
+    }
+  }
+
+  void lookup_sockets(ArrayRef<const VInputSocket *> vsockets,
+                      MutableArrayRef<const MFInputSocket *> r_result)
+  {
+    BLI_assert(vsockets.size() == r_result.size());
+    for (uint i = 0; i < vsockets.size(); i++) {
+      r_result[i] = &this->lookup_socket(*vsockets[i]);
+    }
   }
 };
 
diff --git a/source/blender/functions2/FN_vtree_multi_function_network_generation.h b/source/blender/functions2/FN_vtree_multi_function_network_generation.h
index 93c54883827..a0c27f9ac4e 100644
--- a/source/blender/functions2/FN_vtree_multi_function_network_generation.h
+++ b/source/blender/functions2/FN_vtree_multi_function_network_generation.h
@@ -3,6 +3,7 @@
 
 #include "FN_vtree_multi_function_network.h"
 #include "BLI_owned_resources.h"
+#include "intern/multi_functions/network.h"
 
 namespace FN {
 
@@ -11,6 +12,9 @@ using BLI::OwnedResources;
 std::unique_ptr<VTreeMFNetwork> generate_vtree_multi_function_network(const VirtualNodeTree &vtree,
                                                                       OwnedResources &resources);
 
+std::unique_ptr<MF_EvaluateNetwork> generate_vtree_multi_function(const VirtualNodeTree &vtree,
+                                                                  OwnedResources &resources);
+
 }  // namespace FN
 
 #endif /* __FN_VTREE_MULTI_FUNCTION_NETWORK_GENERATION_H__ */
diff --git a/source/blender/functions2/intern/vtree_multi_function_network/generate.cc b/source/blender/functions2/intern/vtree_multi_function_network/generate.cc
index 54a841e1885..8ac2164a64a 100644
--- a/source/blender/functions2/intern/vtree_multi_function_network/generate.cc
+++ b/source/blender/functions2/intern/vtree_multi_function_network/generate.cc
@@ -116,4 +116,34 @@ std::unique_ptr<VTreeMFNetwork> generate_vtree_multi_function_network(const Virt
   return vtree_network;
 }
 
+std::unique_ptr<MF_EvaluateNetwork> generate_vtree_multi_function(const VirtualNodeTree &vtree,
+                                                                  OwnedResources &resources)
+{
+  std::unique_ptr<VTreeMFNetwork> network = generate_vtree_multi_function_network(vtree,
+                                                                                  resources);
+
+  auto input_vnodes = vtree.nodes_with_idname("fn_FunctionInputNode");
+  auto output_vnodes = vtree.nodes_with_idname("fn_FunctionOutputNode");
+
+  Vector<const MFOutputSocket *> function_inputs;
+  Vector<const MFInputSocket *> function_outputs;
+
+  if (input_vnodes.size() == 1) {
+    auto vsockets = input_vnodes.first()->outputs().drop_back(1);
+    function_inputs.append_n_times(nullptr, vsockets.size());
+    network->lookup_sockets(vsockets, function_inputs);
+  }
+
+  if (output_vnodes.size() == 1) {
+    auto vsockets = output_vnodes.first()->inputs().drop_back(1);
+    function_outputs.append_n_times(nullptr, vsockets.size());
+    network->lookup_sockets(vsockets, function_outputs);
+  }
+
+  auto function = BLI::make_unique<MF_EvaluateNetwork>(std::move(function_inputs),
+                                                       std::move(function_outputs));
+  resources.add(std::move(network), "VTree Multi Function Network");
+  return function;
+}
+
 }  // namespace FN
diff --git a/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc b/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
index 4d1ca16a54d..f8845e2893e 100644
--- a/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
+++ b/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
@@ -35,23 +35,10 @@ void MOD_functiondeform_do(FunctionDeformModifierData *fdmd, float (*vertexCos)[
   vtree_builder.add_all_of_node_tree(btree);
   auto vtree = vtree_builder.build();
 
-  const VNode &input_vnode = *vtree->nodes_with_idname("fn_FunctionInputNode")[0];
-  const VNode &output_vnode = *vtree->nodes_with_idname("fn_FunctionOutputNode")[0];
-
   BLI::OwnedResources resources;
-  auto vtree_network = FN::generate_vtree_multi_function_network(*vtree, resources);
-
-  Vector<const MFOutputSocket *> function_inputs = {
-      &vtree_network->lookup_socket(input_vnode.output(0)).as_output(),
-      &vtree_network->lookup_socket(input_vnode.output(1)).as_output(),
-      &vtree_network->lookup_socket(input_vnode.output(2)).as_output()};
-
-  Vector<const MFInputSocket *> function_outputs = {
-      &vtree_network->lookup_socket(output_vnode.input(0)).as_input()};
-
-  FN::MF_EvaluateNetwork function{function_inputs, function_outputs};
+  auto function = FN::generate_vtree_multi_function(*vtree, resources);
 
-  MFParamsBuilder params(function, numVerts);
+  MFParamsBuilder params(*function, numVerts);
   params.add_readonly_single_input(ArrayRef<float3>((float3 *)vertexCos, numVerts));
   params.add_readonly_single_input(&fdmd->control1);
   params.add_readonly_single_input(&fdmd->control2);
@@ -61,7 +48,7 @@ void MOD_functiondeform_do(FunctionDeformModifierData *fdmd, float (*vertexCos)[
 
   MFContext context;
   context.vertex_positions = ArrayRef<float3>((float3 *)vertexCos, numVerts);
-  function.call(IndexRange(numVerts).as_array_ref(), params.build(), context);
+  function->call(IndexRange(numVerts).as_array_ref(), params.build(), context);
 
   memcpy(vertexCos, output_vectors.begin(), output_vectors.size() * sizeof(float3));
 }
diff --git a/source/blender/modifiers/intern/MOD_functionpoints_cxx.cc b/source/blender/modifiers/intern/MOD_functionpoints_cxx.cc
index 0338582f5d3..9ec468feea1 100644
--- a/source/blender/modifiers/intern/MOD_functionpoints_cxx.cc
+++ b/source/blender/modifiers/intern/MOD_functionpoints_cxx.cc
@@ -39,22 +39,10 @@ Mesh *MOD_functionpoints_do(FunctionPointsModifierData *fpmd)
   vtree_builder.add_all_of_node_tree(btree);
   auto vtree = vtree_builder.build();
 
-  const VNode &input_vnode = *vtree->nodes_with_idname("fn_FunctionInputNode")[0];
-  const VNode &output_vnode = *vtree->nodes_with_idname("fn_FunctionOutputNode")[0];
-
   BLI::OwnedResources resources;
-  auto vtree_network = FN::generate_vtree_multi_function_network(*vtree, resources);
-
-  Vector<const MFOutputSocket *> function_inputs = {
-      &vtree_network->lookup_socket(input_vnode.output(0)).as_output(),
-      &vtree_network->lookup_socket(input_vnode.output(1)).as_output()};
-
-  Vector<const MFInputSocket *> function_outputs = {
-      &vtree_network->lookup_socket(output_vnode.input(0)).as_input()};
-
-  FN::MF_EvaluateNetwork function{function_inputs, function_outputs};
+  auto function = FN::generate_vtree_multi_function(*vtree, resources);
 
-  MFParamsBuilder params(function, 1);
+  MFParamsBuilder params(*function, 1);
   params.add_readonly_single_input(&fpmd->control1);
   params.add_readonly_single_input(&fpmd->control2);
 
@@ -62,7 +50,7 @@ Mesh *MOD_functionpoints_do(FunctionPointsModifierData *fpmd)
   params.add_vector_output(vector_array);
 
   MFContext context;
-  function.call(FN::MFMask({0}), params.build(), context);
+  function->call(FN::MFMask({0}), params.build(), context);
 
   ArrayRef<float3> output_points = vector_array[0].as_typed_ref<float3>();



More information about the Bf-blender-cvs mailing list