diff options
author | Leon Leno <lone_noel> | 2021-03-08 13:37:37 +0300 |
---|---|---|
committer | Jacques Lucke <jacques@blender.org> | 2021-03-08 13:37:37 +0300 |
commit | e12ad2bce0cca84a10915d8da1417b71142432d1 (patch) | |
tree | 3949d0dab2eb45770ce29bcb49b8527ce76ef6ae /source/blender/functions/FN_multi_function_builder.hh | |
parent | 2b9eea17cca4512fc47511ff3c596ce9a8f59356 (diff) |
Geometry Nodes: support Vector Rotate node
Differential Revision: https://developer.blender.org/D10410
Diffstat (limited to 'source/blender/functions/FN_multi_function_builder.hh')
-rw-r--r-- | source/blender/functions/FN_multi_function_builder.hh | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/source/blender/functions/FN_multi_function_builder.hh b/source/blender/functions/FN_multi_function_builder.hh index 6d5ca7f64ad..0cd1bc262be 100644 --- a/source/blender/functions/FN_multi_function_builder.hh +++ b/source/blender/functions/FN_multi_function_builder.hh @@ -170,6 +170,63 @@ class CustomMF_SI_SI_SI_SO : public MultiFunction { /** * Generates a multi-function with the following parameters: + * 1. single input (SI) of type In1 + * 2. single input (SI) of type In2 + * 3. single input (SI) of type In3 + * 4. single input (SI) of type In4 + * 5. single output (SO) of type Out1 + */ +template<typename In1, typename In2, typename In3, typename In4, typename Out1> +class CustomMF_SI_SI_SI_SI_SO : public MultiFunction { + private: + using FunctionT = std::function<void( + IndexMask, VSpan<In1>, VSpan<In2>, VSpan<In3>, VSpan<In4>, MutableSpan<Out1>)>; + FunctionT function_; + + public: + CustomMF_SI_SI_SI_SI_SO(StringRef name, FunctionT function) : function_(std::move(function)) + { + MFSignatureBuilder signature = this->get_builder(name); + signature.single_input<In1>("In1"); + signature.single_input<In2>("In2"); + signature.single_input<In3>("In3"); + signature.single_input<In4>("In4"); + signature.single_output<Out1>("Out1"); + } + + template<typename ElementFuncT> + CustomMF_SI_SI_SI_SI_SO(StringRef name, ElementFuncT element_fn) + : CustomMF_SI_SI_SI_SI_SO(name, CustomMF_SI_SI_SI_SI_SO::create_function(element_fn)) + { + } + + template<typename ElementFuncT> static FunctionT create_function(ElementFuncT element_fn) + { + return [=](IndexMask mask, + VSpan<In1> in1, + VSpan<In2> in2, + VSpan<In3> in3, + VSpan<In4> in4, + MutableSpan<Out1> out1) { + mask.foreach_index([&](int i) { + new (static_cast<void *>(&out1[i])) Out1(element_fn(in1[i], in2[i], in3[i], in4[i])); + }); + }; + } + + void call(IndexMask mask, MFParams params, MFContext UNUSED(context)) const override + { + VSpan<In1> in1 = params.readonly_single_input<In1>(0); + VSpan<In2> in2 = params.readonly_single_input<In2>(1); + VSpan<In3> in3 = params.readonly_single_input<In3>(2); + VSpan<In4> in4 = params.readonly_single_input<In4>(3); + MutableSpan<Out1> out1 = params.uninitialized_single_output<Out1>(4); + function_(mask, in1, in2, in3, in4, out1); + } +}; + +/** + * Generates a multi-function with the following parameters: * 1. single mutable (SM) of type Mut1 */ template<typename Mut1> class CustomMF_SM : public MultiFunction { |