[Bf-blender-cvs] [35af9ecd3d6] functions: support deduplicating all math nodes

Jacques Lucke noreply at git.blender.org
Sun Jan 19 12:46:00 CET 2020


Commit: 35af9ecd3d6eab03bcec8812fefc439898406e41
Author: Jacques Lucke
Date:   Sun Jan 19 11:35:22 2020 +0100
Branches: functions
https://developer.blender.org/rB35af9ecd3d6eab03bcec8812fefc439898406e41

support deduplicating all math nodes

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

M	source/blender/functions/FN_multi_function.h
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/FN_multi_function.h b/source/blender/functions/FN_multi_function.h
index b837d86056c..9c940fcc8bc 100644
--- a/source/blender/functions/FN_multi_function.h
+++ b/source/blender/functions/FN_multi_function.h
@@ -159,6 +159,11 @@ class MFSignatureBuilder {
     m_data.operation_hash.set(hash);
   }
 
+  void operation_hash(Optional<uint32_t> maybe_hash)
+  {
+    m_data.operation_hash = maybe_hash;
+  }
+
   void constant_operation_hash()
   {
     const std::type_info &type_info = typeid(*this);
diff --git a/source/blender/functions/intern/multi_functions/customizable.h b/source/blender/functions/intern/multi_functions/customizable.h
index 15ca38b801f..25085832d31 100644
--- a/source/blender/functions/intern/multi_functions/customizable.h
+++ b/source/blender/functions/intern/multi_functions/customizable.h
@@ -38,11 +38,13 @@ template<typename InT, typename OutT> class MF_Custom_In1_Out1 final : public Mu
   FunctionT m_fn;
 
  public:
-  MF_Custom_In1_Out1(StringRef name, FunctionT fn) : m_fn(std::move(fn))
+  MF_Custom_In1_Out1(StringRef name, FunctionT fn, Optional<uint32_t> operation_hash = {})
+      : m_fn(std::move(fn))
   {
     MFSignatureBuilder signature = this->get_builder(name);
     signature.single_input<InT>("Input");
     signature.single_output<OutT>("Output");
+    signature.operation_hash(operation_hash);
   }
 
   void call(IndexMask mask, MFParams params, MFContext UNUSED(context)) const override
@@ -62,12 +64,14 @@ class MF_Custom_In2_Out1 final : public MultiFunction {
   FunctionT m_fn;
 
  public:
-  MF_Custom_In2_Out1(StringRef name, FunctionT fn) : m_fn(std::move(fn))
+  MF_Custom_In2_Out1(StringRef name, FunctionT fn, Optional<uint32_t> operation_hash = {})
+      : m_fn(std::move(fn))
   {
     MFSignatureBuilder signature = this->get_builder(name);
     signature.single_input<InT1>("Input 1");
     signature.single_input<InT2>("Input 2");
     signature.single_output<OutT>("Output");
+    signature.operation_hash(operation_hash);
   }
 
   void call(IndexMask mask, MFParams params, MFContext UNUSED(context)) const override
@@ -88,7 +92,10 @@ template<typename T> class MF_VariadicMath final : public MultiFunction {
   FunctionT m_fn;
 
  public:
-  MF_VariadicMath(StringRef name, uint input_amount, FunctionT fn)
+  MF_VariadicMath(StringRef name,
+                  uint input_amount,
+                  FunctionT fn,
+                  Optional<uint32_t> operation_hash)
       : m_input_amount(input_amount), m_fn(fn)
   {
     BLI_STATIC_ASSERT(std::is_trivial<T>::value, "");
@@ -98,6 +105,7 @@ template<typename T> class MF_VariadicMath final : public MultiFunction {
       signature.single_input<T>("Input");
     }
     signature.single_output<T>("Output");
+    signature.operation_hash(operation_hash);
   }
 
   void call(IndexMask mask, MFParams params, MFContext UNUSED(context)) const override
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 aca9aa68e64..63214b9705f 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
@@ -5,6 +5,7 @@
 #include "FN_node_tree_multi_function_network_generation.h"
 
 #include "BLI_math_cxx.h"
+#include "BLI_rand_cxx.h"
 
 #include "BKE_surface_hook.h"
 
@@ -181,12 +182,14 @@ vectorize_function_1in_1out(FuncT func)
 }
 
 template<typename InT, typename OutT, typename FuncT>
-static void build_math_fn_1in_1out(FNodeMFBuilder &builder, FuncT func)
+static void build_math_fn_1in_1out(FNodeMFBuilder &builder,
+                                   FuncT func,
+                                   Optional<uint32_t> operation_hash = {})
 {
   auto fn = vectorize_function_1in_1out<InT, OutT>(func);
 
   builder.set_vectorized_constructed_matching_fn<MF_Custom_In1_Out1<InT, OutT>>(
-      {"use_list"}, builder.fnode().name(), fn);
+      {"use_list"}, builder.fnode().name(), fn, operation_hash);
 }
 
 template<typename InT1, typename InT2, typename OutT, typename FuncT>
@@ -227,15 +230,20 @@ vectorize_function_2in_1out(FuncT func)
 }
 
 template<typename InT1, typename InT2, typename OutT, typename FuncT>
-static void build_math_fn_in2_out1(FNodeMFBuilder &builder, FuncT func)
+static void build_math_fn_in2_out1(FNodeMFBuilder &builder,
+                                   FuncT 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);
+      {"use_list__a", "use_list__b"}, builder.fnode().name(), fn, operation_hash);
 }
 
 template<typename T, typename FuncT>
-static void build_variadic_math_fn(FNodeMFBuilder &builder, FuncT func, T default_value)
+static void build_variadic_math_fn(FNodeMFBuilder &builder,
+                                   FuncT func,
+                                   T default_value,
+                                   Optional<uint32_t> operation_hash = {})
 {
   auto fn = vectorize_function_2in_1out<T, T, T>(func);
 
@@ -245,7 +253,7 @@ static void build_variadic_math_fn(FNodeMFBuilder &builder, FuncT func, T defaul
   }
   else {
     const MultiFunction &base_fn = builder.construct_fn<MF_VariadicMath<T>>(
-        builder.fnode().name(), list_states.size(), fn);
+        builder.fnode().name(), list_states.size(), fn, operation_hash);
     if (list_states.contains(true)) {
       builder.set_constructed_matching_fn<MF_SimpleVectorize>(base_fn, list_states);
     }
@@ -258,148 +266,176 @@ static void build_variadic_math_fn(FNodeMFBuilder &builder, FuncT func, T defaul
 static void INSERT_add_floats(FNodeMFBuilder &builder)
 {
   build_variadic_math_fn(
-      builder, [](float a, float b) -> float { return a + b; }, 0.0f);
+      builder, [](float a, float b) -> float { return a + b; }, 0.0f, BLI_RAND_PER_LINE_UINT32);
 }
 
 static void INSERT_multiply_floats(FNodeMFBuilder &builder)
 {
   build_variadic_math_fn(
-      builder, [](float a, float b) -> float { return a * b; }, 1.0f);
+      builder, [](float a, float b) -> float { return a * b; }, 1.0f, BLI_RAND_PER_LINE_UINT32);
 }
 
 static void INSERT_minimum_floats(FNodeMFBuilder &builder)
 {
   build_variadic_math_fn(
-      builder, [](float a, float b) -> float { return std::min(a, b); }, 0.0f);
+      builder,
+      [](float a, float b) -> float { return std::min(a, b); },
+      0.0f,
+      BLI_RAND_PER_LINE_UINT32);
 }
 
 static void INSERT_maximum_floats(FNodeMFBuilder &builder)
 {
   build_variadic_math_fn(
-      builder, [](float a, float b) -> float { return std::max(a, b); }, 0.0f);
+      builder,
+      [](float a, float b) -> float { return std::max(a, b); },
+      0.0f,
+      BLI_RAND_PER_LINE_UINT32);
 }
 
 static void INSERT_subtract_floats(FNodeMFBuilder &builder)
 {
-  build_math_fn_in2_out1<float, float, float>(builder,
-                                              [](float a, float b) -> float { return a - b; });
+  build_math_fn_in2_out1<float, float, float>(
+      builder, [](float a, float b) -> float { return a - b; }, BLI_RAND_PER_LINE_UINT32);
 }
 
 static void INSERT_divide_floats(FNodeMFBuilder &builder)
 {
   build_math_fn_in2_out1<float, float, float>(
-      builder, [](float a, float b) -> float { return (b != 0.0f) ? a / b : 0.0f; });
+      builder,
+      [](float a, float b) -> float { return (b != 0.0f) ? a / b : 0.0f; },
+      BLI_RAND_PER_LINE_UINT32);
 }
 
 static void INSERT_power_floats(FNodeMFBuilder &builder)
 {
-  build_math_fn_in2_out1<float, float, float>(builder, [](float a, float b) -> float {
-    return (a >= 0.0f) ? (float)std::pow(a, b) : 0.0f;
-  });
+  build_math_fn_in2_out1<float, float, float>(
+      builder,
+      [](float a, float b) -> float { return (a >= 0.0f) ? (float)std::pow(a, b) : 0.0f; },
+      BLI_RAND_PER_LINE_UINT32);
 }
 
 static void INSERT_sqrt_float(FNodeMFBuilder &builder)
 {
   build_math_fn_1in_1out<float, float>(
-      builder, [](float a) -> float { return (a >= 0.0f) ? (float)std::sqrt(a) : 0.0f; });
+      builder,
+      [](float a) -> float { return (a >= 0.0f) ? (float)std::sqrt(a) : 0.0f; },
+      BLI_RAND_PER_LINE_UINT32);
 }
 
 static void INSERT_abs_float(FNodeMFBuilder &builder)
 {
-  build_math_fn_1in_1out<float, float>(builder, [](float a) -> float { return std::abs(a); });
+  build_math_fn_1in_1out<float, float>(
+      builder, [](float a) -> float { return std::abs(a); }, BLI_RAND_PER_LINE_UINT32);
 }
 
 static void INSERT_sine_float(FNodeMFBuilder &builder)
 {
-  build_math_fn_1in_1out<float, float>(builder, [](float a) -> float { return std::sin(a); });
+  build_math_fn_1in_1out<float, float>(
+      builder, [](float a) -> float { return std::sin(a); }, BLI_RAND_PER_LINE_UINT32);
 }
 
 static void INSERT_cosine_float(FNodeMFBuilder &builder)
 {
-  build_math_fn_1in_1out<float, float>(builder, [](float a) -> float { return std::cos(a); });
+  build_math_fn_1in_1out<float, float>(
+      builder, [](float a) -> float { return std::cos(a); }, BLI_RAND_PER_LINE_UINT32);
 }
 
 static void INSERT_add_vectors(FNodeMFBuilder &builder)
 {
   build_variadic_math_fn(
-      builder, [](float3 a, float3 b) -> float3 { return a + b; }, float3(0, 0, 0));
+      builder,
+      [](float3 a, float3 b) -> float3 { return a + b; },
+      float3(0, 0, 0),
+      BLI_RAND_PER_LINE_UINT32);
 }
 
 static void INSERT_multiply_vectors(FNodeMFBuilder &builder)
 {
   build_variadic_math_fn(
-      builder, [](float3 a, float3 b) -> float3 { return a * b; }, float3(1, 1, 1));
+      builder,
+      [](float3 a, float3 b) -> float3 { return a * b; },
+      float3(1, 1, 1),
+      BLI_RAND_PER_LINE_UINT32);
 }
 
 static void INSERT_subtract_vectors(FNodeMFBuilder &builder)
 {
   build_math_fn_in2_out1<float3, float3, float3>(
-      builder, [](float3 a, float3 b) -> float3 { return a - b; });
+      builder, [](float3 a, float3 b) -> float3 { return a - b; }, BLI_RAND_PER_LINE_UINT32);

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list