[Bf-blender-cvs] [16150b75ac7] functions-experimental-refactor: cleanup network generation code

Jacques Lucke noreply at git.blender.org
Thu Oct 31 14:12:50 CET 2019


Commit: 16150b75ac7c7020b04e3e8c3af39b89f62b644e
Author: Jacques Lucke
Date:   Thu Oct 31 12:27:35 2019 +0100
Branches: functions-experimental-refactor
https://developer.blender.org/rB16150b75ac7c7020b04e3e8c3af39b89f62b644e

cleanup network generation code

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

M	source/blender/modifiers/intern/MOD_functiondeform_cxx.cc

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

diff --git a/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc b/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
index 411964f4c80..2365f4bc253 100644
--- a/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
+++ b/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
@@ -360,58 +360,81 @@ using InsertImplicitConversionFunction =
     std::function<std::pair<MFBuilderInputSocket *, MFBuilderOutputSocket *>(
         VTreeMFNetworkBuilder &builder, OwnedResources &resources)>;
 
+template<typename T, typename... Args>
+T &allocate_resource(const char *name, OwnedResources &resources, Args &&... args)
+{
+  std::unique_ptr<T> value = BLI::make_unique<T>(std::forward<Args>(args)...);
+  T &value_ref = *value;
+  resources.add(std::move(value), name);
+  return value_ref;
+}
+
 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");
+  const MultiFunction &fn = allocate_resource<BKE::MultiFunction_AddFloat3s>(
+      "vector math function", resources);
+  builder.add_function(fn, {0, 1}, {2}, vnode);
 }
 
-static void INSERT_float_math(VTreeMFNetworkBuilder &builder,
-                              OwnedResources &resources,
-                              const VirtualNode &vnode)
+static const MultiFunction &get_vectorized_function(
+    const MultiFunction &base_function,
+    OwnedResources &resources,
+    PointerRNA rna,
+    ArrayRef<const char *> is_vectorized_prop_names)
 {
-  PointerRNA rna = vnode.rna();
-  char state[5];
-  RNA_string_get(&rna, "use_list__a", state);
-  bool use_list__a = STREQ(state, "LIST");
-  RNA_string_get(&rna, "use_list__b", state);
-  bool use_list__b = STREQ(state, "LIST");
-
-  if (use_list__a || use_list__b) {
-    Vector<bool> input_is_vectorized = {use_list__a, use_list__b};
-    auto base_function = BLI::make_unique<BKE::MultiFunction_AddFloats>();
-    auto vectorized_function = BLI::make_unique<BKE::MultiFunction_SimpleVectorize>(
-        *base_function, input_is_vectorized);
-    builder.add_function(*vectorized_function, {0, 1}, {2}, vnode);
-    resources.add(std::move(base_function), "float math function");
-    resources.add(std::move(vectorized_function), "vectorized float math function");
+  Vector<bool> input_is_vectorized;
+  for (const char *prop_name : is_vectorized_prop_names) {
+    char state[5];
+    RNA_string_get(&rna, prop_name, state);
+    BLI_assert(STREQ(state, "BASE") || STREQ(state, "LIST"));
+
+    bool is_vectorized = STREQ(state, "LIST");
+    input_is_vectorized.append(is_vectorized);
+  }
+
+  if (input_is_vectorized.contains(true)) {
+    return allocate_resource<BKE::MultiFunction_SimpleVectorize>(
+        "vectorized function", resources, base_function, input_is_vectorized);
   }
   else {
-    auto function = BLI::make_unique<BKE::MultiFunction_AddFloats>();
-    builder.add_function(*function, {0, 1}, {2}, vnode);
-    resources.add(std::move(function), "float math function");
+    return base_function;
   }
 }
 
+static void INSERT_float_math(VTreeMFNetworkBuilder &builder,
+                              OwnedResources &resources,
+                              const VirtualNode &vnode)
+{
+  const MultiFunction &base_fn = allocate_resource<BKE::MultiFunction_AddFloats>(
+      "float math function", resources);
+  const MultiFunction &fn = get_vectorized_function(
+      base_fn, resources, vnode.rna(), {"use_list__a", "use_list__b"});
+
+  builder.add_function(fn, {0, 1}, {2}, vnode);
+}
+
 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");
+  const MultiFunction &base_fn = allocate_resource<BKE::MultiFunction_CombineVector>(
+      "combine vector function", resources);
+  const MultiFunction &fn = get_vectorized_function(
+      base_fn, resources, vnode.rna(), {"use_list__x", "use_list__y", "use_list__z"});
+  builder.add_function(fn, {0, 1, 2}, {3}, vnode);
 }
 
 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");
+  const MultiFunction &base_fn = allocate_resource<BKE::MultiFunction_SeparateVector>(
+      "separate vector function", resources);
+  const MultiFunction &fn = get_vectorized_function(
+      base_fn, resources, vnode.rna(), {"use_list__vector"});
+  builder.add_function(fn, {0}, {1, 2, 3}, vnode);
 }
 
 static void INSERT_list_length(VTreeMFNetworkBuilder &builder,
@@ -423,9 +446,9 @@ static void INSERT_list_length(VTreeMFNetworkBuilder &builder,
   const CPPType &type = get_cpp_type_by_name(type_name);
   MEM_freeN(type_name);
 
-  auto function = BLI::make_unique<BKE::MultiFunction_ListLength>(type);
-  builder.add_function(*function, {0}, {1}, vnode);
-  resources.add(std::move(function), "list length function");
+  const MultiFunction &fn = allocate_resource<BKE::MultiFunction_ListLength>(
+      "list length function", resources, type);
+  builder.add_function(fn, {0}, {1}, vnode);
 }
 
 static void INSERT_get_list_element(VTreeMFNetworkBuilder &builder,
@@ -437,9 +460,9 @@ static void INSERT_get_list_element(VTreeMFNetworkBuilder &builder,
   const CPPType &type = get_cpp_type_by_name(type_name);
   MEM_freeN(type_name);
 
-  auto function = BLI::make_unique<BKE::MultiFunction_GetListElement>(type);
-  builder.add_function(*function, {0, 1, 2}, {3}, vnode);
-  resources.add(std::move(function), "get list element");
+  const MultiFunction &fn = allocate_resource<BKE::MultiFunction_GetListElement>(
+      "get list element function", resources, type);
+  builder.add_function(fn, {0, 1, 2}, {3}, vnode);
 }
 
 static MFBuilderOutputSocket &build_pack_list_node(VTreeMFNetworkBuilder &builder,
@@ -471,10 +494,10 @@ static MFBuilderOutputSocket &build_pack_list_node(VTreeMFNetworkBuilder &builde
   uint input_amount = input_is_list.size();
   uint output_param_index = (input_amount > 0 && input_is_list[0]) ? 0 : input_amount;
 
-  auto function = BLI::make_unique<BKE::MultiFunction_PackList>(base_type, input_is_list);
+  const MultiFunction &fn = allocate_resource<BKE::MultiFunction_PackList>(
+      "pack list function", resources, base_type, input_is_list);
   MFBuilderFunctionNode &node = builder.add_function(
-      *function, IndexRange(input_amount).as_array_ref(), {output_param_index});
-  resources.add(std::move(function), "pack list function");
+      fn, IndexRange(input_amount).as_array_ref(), {output_param_index});
 
   for (uint i = 0; i < input_amount; i++) {
     builder.map_sockets(vnode.input(start_index + i), *node.inputs()[i]);
@@ -518,10 +541,9 @@ static MFBuilderOutputSocket &INSERT_vector_socket(VTreeMFNetworkBuilder &builde
   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 socket");
+  const MultiFunction &fn = allocate_resource<BKE::MultiFunction_ConstantValue<float3>>(
+      "vector socket", resources, value);
+  MFBuilderFunctionNode &node = builder.add_function(fn, {}, {0});
   return *node.outputs()[0];
 }
 
@@ -532,10 +554,9 @@ static MFBuilderOutputSocket &INSERT_float_socket(VTreeMFNetworkBuilder &builder
   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 socket");
+  const MultiFunction &fn = allocate_resource<BKE::MultiFunction_ConstantValue<float>>(
+      "float socket", resources, value);
+  MFBuilderFunctionNode &node = builder.add_function(fn, {}, {0});
   return *node.outputs()[0];
 }
 
@@ -546,10 +567,9 @@ static MFBuilderOutputSocket &INSERT_int_socket(VTreeMFNetworkBuilder &builder,
   PointerRNA rna = vsocket.rna();
   int value = RNA_int_get(&rna, "value");
 
-  auto function = BLI::make_unique<BKE::MultiFunction_ConstantValue<int>>(value);
-  auto &node = builder.add_function(*function, {}, {0});
-
-  resources.add(std::move(function), "int socket");
+  const MultiFunction &fn = allocate_resource<BKE::MultiFunction_ConstantValue<int>>(
+      "int socket", resources, value);
+  MFBuilderFunctionNode &node = builder.add_function(fn, {}, {0});
   return *node.outputs()[0];
 }
 
@@ -558,10 +578,9 @@ static MFBuilderOutputSocket &INSERT_empty_list_socket(VTreeMFNetworkBuilder &bu
                                                        OwnedResources &resources,
                                                        const VirtualSocket &UNUSED(vsocket))
 {
-  auto function = BLI::make_unique<BKE::MultiFunction_EmptyList<T>>();
-  auto &node = builder.add_function(*function, {}, {0});
-
-  resources.add(std::move(function), "empty list socket");
+  const MultiFunction &fn = allocate_resource<BKE::MultiFunction_EmptyList<T>>("empty list socket",
+                                                                               resources);
+  MFBuilderFunctionNode &node = builder.add_function(fn, {}, {0});
   return *node.outputs()[0];
 }
 
@@ -581,9 +600,9 @@ template<typename FromT, typename ToT>
 static std::pair<MFBuilderInputSocket *, MFBuilderOutputSocket *> INSERT_convert(
     VTreeMFNetworkBuilder &builder, OwnedResources &resources)
 {
-  auto function = BLI::make_unique<BKE::M

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list