[Bf-blender-cvs] [2929bc8d7e6] functions: cleanup

Jacques Lucke noreply at git.blender.org
Wed Jan 29 21:05:34 CET 2020


Commit: 2929bc8d7e627968093d88bfa138898d1bee02fd
Author: Jacques Lucke
Date:   Wed Jan 29 18:56:49 2020 +0100
Branches: functions
https://developer.blender.org/rB2929bc8d7e627968093d88bfa138898d1bee02fd

cleanup

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

M	source/blender/functions/intern/multi_functions/customizable.h
M	source/blender/functions/intern/node_tree_multi_function_network/mappings_nodes.cc

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

diff --git a/source/blender/functions/intern/multi_functions/customizable.h b/source/blender/functions/intern/multi_functions/customizable.h
index d0d9d0d09dd..cef8164cd68 100644
--- a/source/blender/functions/intern/multi_functions/customizable.h
+++ b/source/blender/functions/intern/multi_functions/customizable.h
@@ -99,6 +99,51 @@ class MF_Custom_In2_Out1 final : public MultiFunction {
     signature.operation_hash(operation_hash);
   }
 
+  template<typename ElementFuncT>
+  MF_Custom_In2_Out1(StringRef name,
+                     ElementFuncT element_fn,
+                     Optional<uint32_t> operation_hash = {})
+      : MF_Custom_In2_Out1(name, MF_Custom_In2_Out1::create_function(element_fn), operation_hash)
+  {
+  }
+
+  template<typename ElementFuncT> static FunctionT create_function(ElementFuncT element_fn)
+  {
+    return [=](IndexMask mask,
+               VirtualListRef<InT1> inputs1,
+               VirtualListRef<InT2> inputs2,
+               MutableArrayRef<OutT> outputs) -> void {
+      if (inputs1.is_non_single_full_array() && inputs2.is_non_single_full_array()) {
+        ArrayRef<InT1> in1_array = inputs1.as_full_array();
+        ArrayRef<InT2> in2_array = inputs2.as_full_array();
+        mask.foreach_index(
+            [=](uint i) { new (&outputs[i]) OutT(element_fn(in1_array[i], in2_array[i])); });
+      }
+      else if (inputs1.is_non_single_full_array() && inputs2.is_single_element()) {
+        ArrayRef<InT1> in1_array = inputs1.as_full_array();
+        InT2 in2_single = inputs2.as_single_element();
+        mask.foreach_index(
+            [=](uint i) { new (&outputs[i]) OutT(element_fn(in1_array[i], in2_single)); });
+      }
+      else if (inputs1.is_single_element() && inputs2.is_non_single_full_array()) {
+        InT1 in1_single = inputs1.as_single_element();
+        ArrayRef<InT2> in2_array = inputs2.as_full_array();
+        mask.foreach_index(
+            [=](uint i) { new (&outputs[i]) OutT(element_fn(in1_single, in2_array[i])); });
+      }
+      else if (inputs1.is_single_element() && inputs2.is_single_element()) {
+        InT1 in1_single = inputs1.as_single_element();
+        InT2 in2_single = inputs2.as_single_element();
+        OutT out_single = element_fn(in1_single, in2_single);
+        outputs.fill_indices(mask.indices(), out_single);
+      }
+      else {
+        mask.foreach_index(
+            [=](uint i) { new (&outputs[i]) OutT(element_fn(inputs1[i], inputs2[i])); });
+      }
+    };
+  }
+
   void call(IndexMask mask, MFParams params, MFContext UNUSED(context)) const override
   {
     VirtualListRef<InT1> inputs1 = params.readonly_single_input<InT1>(0);
@@ -133,6 +178,18 @@ template<typename T> class MF_VariadicMath final : public MultiFunction {
     signature.operation_hash(operation_hash);
   }
 
+  template<typename ElementFuncT>
+  MF_VariadicMath(StringRef name,
+                  uint input_amount,
+                  ElementFuncT element_func,
+                  Optional<uint32_t> operation_hash = {})
+      : MF_VariadicMath(name,
+                        input_amount,
+                        MF_Custom_In2_Out1<T, T, T>::create_function(element_func),
+                        operation_hash)
+  {
+  }
+
   void call(IndexMask mask, MFParams params, MFContext UNUSED(context)) const override
   {
     MutableArrayRef<T> outputs = params.uninitialized_single_output<T>(m_input_amount, "Output");
diff --git a/source/blender/functions/intern/node_tree_multi_function_network/mappings_nodes.cc b/source/blender/functions/intern/node_tree_multi_function_network/mappings_nodes.cc
index 327da6a2175..ddc5a257495 100644
--- a/source/blender/functions/intern/node_tree_multi_function_network/mappings_nodes.cc
+++ b/source/blender/functions/intern/node_tree_multi_function_network/mappings_nodes.cc
@@ -171,68 +171,28 @@ static void build_math_fn_1in_1out(FNodeMFBuilder &builder,
       {"use_list"}, builder.fnode().name(), func, operation_hash);
 }
 
-template<typename InT1, typename InT2, typename OutT, typename FuncT>
-static std::function<
-    void(IndexMask, VirtualListRef<InT1>, VirtualListRef<InT2>, MutableArrayRef<OutT>)>
-vectorize_function_2in_1out(FuncT func)
-{
-  return [=](IndexMask mask,
-             VirtualListRef<InT1> inputs1,
-             VirtualListRef<InT2> inputs2,
-             MutableArrayRef<OutT> outputs) -> void {
-    if (inputs1.is_non_single_full_array() && inputs2.is_non_single_full_array()) {
-      ArrayRef<InT1> in1_array = inputs1.as_full_array();
-      ArrayRef<InT2> in2_array = inputs2.as_full_array();
-      mask.foreach_index(
-          [=](uint i) { new (&outputs[i]) OutT(func(in1_array[i], in2_array[i])); });
-    }
-    else if (inputs1.is_non_single_full_array() && inputs2.is_single_element()) {
-      ArrayRef<InT1> in1_array = inputs1.as_full_array();
-      InT2 in2_single = inputs2.as_single_element();
-      mask.foreach_index([=](uint i) { new (&outputs[i]) OutT(func(in1_array[i], in2_single)); });
-    }
-    else if (inputs1.is_single_element() && inputs2.is_non_single_full_array()) {
-      InT1 in1_single = inputs1.as_single_element();
-      ArrayRef<InT2> in2_array = inputs2.as_full_array();
-      mask.foreach_index([=](uint i) { new (&outputs[i]) OutT(func(in1_single, in2_array[i])); });
-    }
-    else if (inputs1.is_single_element() && inputs2.is_single_element()) {
-      InT1 in1_single = inputs1.as_single_element();
-      InT2 in2_single = inputs2.as_single_element();
-      OutT out_single = func(in1_single, in2_single);
-      outputs.fill_indices(mask.indices(), out_single);
-    }
-    else {
-      mask.foreach_index([=](uint i) { new (&outputs[i]) OutT(func(inputs1[i], inputs2[i])); });
-    }
-  };
-}
-
 template<typename InT1, typename InT2, typename OutT, typename FuncT>
 static void build_math_fn_in2_out1(FNodeMFBuilder &builder,
-                                   FuncT func,
+                                   FuncT element_func,
                                    Optional<uint32_t> operation_hash = {})
 {
-  auto fn = vectorize_function_2in_1out<InT1, InT2, OutT>(func);
   builder.set_vectorized_constructed_matching_fn<MF_Custom_In2_Out1<InT1, InT2, OutT>>(
-      {"use_list__a", "use_list__b"}, builder.fnode().name(), fn, operation_hash);
+      {"use_list__a", "use_list__b"}, builder.fnode().name(), element_func, operation_hash);
 }
 
 template<typename T, typename FuncT>
 static void build_variadic_math_fn(FNodeMFBuilder &builder,
-                                   FuncT func,
+                                   FuncT element_func,
                                    T default_value,
                                    Optional<uint32_t> operation_hash = {})
 {
-  auto fn = vectorize_function_2in_1out<T, T, T>(func);
-
   Vector<bool> list_states = builder.get_list_base_variadic_states("variadic");
   if (list_states.size() == 0) {
     builder.set_constructed_matching_fn<MF_ConstantValue<T>>(default_value);
   }
   else {
     const MultiFunction &base_fn = builder.construct_fn<MF_VariadicMath<T>>(
-        builder.fnode().name(), list_states.size(), fn, operation_hash);
+        builder.fnode().name(), list_states.size(), element_func, operation_hash);
     if (list_states.contains(true)) {
       builder.set_constructed_matching_fn<MF_SimpleVectorize>(base_fn, list_states);
     }



More information about the Bf-blender-cvs mailing list