[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