[Bf-blender-cvs] [ab2625529c4] functions-experimental-refactor: bring back more math nodes
Jacques Lucke
noreply at git.blender.org
Tue Nov 5 15:55:07 CET 2019
Commit: ab2625529c4d30842e7fbec711fb40e87dacb9d5
Author: Jacques Lucke
Date: Tue Nov 5 14:17:35 2019 +0100
Branches: functions-experimental-refactor
https://developer.blender.org/rBab2625529c4d30842e7fbec711fb40e87dacb9d5
bring back more math nodes
===================================================================
M release/scripts/startup/nodes/function_nodes/float_math.py
M source/blender/functions2/intern/multi_functions/mixed.h
M source/blender/functions2/intern/vtree_multi_function_network/mappings_nodes.cc
===================================================================
diff --git a/release/scripts/startup/nodes/function_nodes/float_math.py b/release/scripts/startup/nodes/function_nodes/float_math.py
index a7d03a42fc8..d0aeb716957 100644
--- a/release/scripts/startup/nodes/function_nodes/float_math.py
+++ b/release/scripts/startup/nodes/function_nodes/float_math.py
@@ -24,11 +24,30 @@ def create_variadic_math_node(data_type, idname, label):
return MathNode
+def create_single_input_math_node(data_type, idname, label):
+
+ class MathNode(bpy.types.Node, FunctionNode):
+ bl_idname = idname
+ bl_label = label
+
+ use_list: NodeBuilder.VectorizedProperty()
+
+ def declaration(self, builder: NodeBuilder):
+ builder.vectorized_input("input", "use_list", "Value", "Values", data_type)
+ builder.vectorized_output("output", ["use_list"], "Result", "Result", data_type)
+
+ return MathNode
+
AddFloatsNode = create_variadic_math_node("Float", "fn_AddFloatsNode", "Add Floats")
MultiplyFloatsNode = create_variadic_math_node("Float", "fn_MultiplyFloatsNode", "Multiply Floats")
MinimumFloatsNode = create_variadic_math_node("Float", "fn_MinimumFloatsNode", "Minimum Floats")
MaximumFloatsNode = create_variadic_math_node("Float", "fn_MaximumFloatsNode", "Maximum Floats")
+SqrtFloatNode = create_single_input_math_node("Float", "fn_SqrtFloatNode", "Sqrt Float")
+AbsFloatNode = create_single_input_math_node("Float", "fn_AbsoluteFloatNode", "Absolute Float")
+SineNode = create_single_input_math_node("Float", "fn_SineNode", "Sine")
+CosineNode = create_single_input_math_node("Float", "fn_CosineNode", "Cosine")
+
operation_items = [
("ADD", "Add", "", "", 1),
diff --git a/source/blender/functions2/intern/multi_functions/mixed.h b/source/blender/functions2/intern/multi_functions/mixed.h
index 57d24eedce5..610ba378d71 100644
--- a/source/blender/functions2/intern/multi_functions/mixed.h
+++ b/source/blender/functions2/intern/multi_functions/mixed.h
@@ -124,6 +124,30 @@ class MF_ContextCurrentFrame final : public MultiFunction {
void call(const MFMask &mask, MFParams ¶ms, MFContext &context) const override;
};
+template<typename FromT, typename ToT, ToT (*Compute)(const FromT &)>
+class MF_Mappping final : public MultiFunction {
+ public:
+ MF_Mappping(StringRef name)
+ {
+ MFSignatureBuilder signature(name);
+ signature.readonly_single_input<FromT>("Input");
+ signature.single_output<ToT>("Output");
+ this->set_signature(signature);
+ }
+
+ void call(const MFMask &mask, MFParams ¶ms, MFContext &UNUSED(context)) const override
+ {
+ VirtualListRef<FromT> inputs = params.readonly_single_input<FromT>(0, "Input");
+ MutableArrayRef<ToT> outputs = params.single_output<ToT>(1, "Output");
+
+ for (uint i : mask.indices()) {
+ const FromT &from_value = inputs[i];
+ ToT to_value = Compute(from_value);
+ new (&outputs[i]) ToT(std::move(to_value));
+ }
+ }
+};
+
template<typename T, T (*Compute)(T, T)> class MF_SimpleMath final : public MultiFunction {
private:
uint m_input_amount;
diff --git a/source/blender/functions2/intern/vtree_multi_function_network/mappings_nodes.cc b/source/blender/functions2/intern/vtree_multi_function_network/mappings_nodes.cc
index 61c09a91b3b..ea352610365 100644
--- a/source/blender/functions2/intern/vtree_multi_function_network/mappings_nodes.cc
+++ b/source/blender/functions2/intern/vtree_multi_function_network/mappings_nodes.cc
@@ -155,26 +155,6 @@ static void INSERT_time_info(VTreeMFNetworkBuilder &builder, const VNode &vnode)
builder.add_function(fn, {}, {0}, vnode);
}
-template<typename T> T add_func_cb(T a, T b)
-{
- return a + b;
-}
-
-template<typename T> T mul_func_cb(T a, T b)
-{
- return a * b;
-}
-
-template<typename T> T min_func_cb(T a, T b)
-{
- return std::min(a, b);
-}
-
-template<typename T> T max_func_cb(T a, T b)
-{
- return std::max(a, b);
-}
-
template<typename T, T (*Compute)(T, T)>
static const MultiFunction &get_simple_math_function(VTreeMFNetworkBuilder &builder,
StringRef name,
@@ -198,9 +178,9 @@ static const MultiFunction &get_simple_math_function(VTreeMFNetworkBuilder &buil
}
template<typename T, T (*Compute)(T, T)>
-void insert_simple_math_function(VTreeMFNetworkBuilder &builder,
- const VNode &vnode,
- T default_value)
+static void insert_simple_math_function(VTreeMFNetworkBuilder &builder,
+ const VNode &vnode,
+ T default_value)
{
Vector<bool> list_states = get_list_base_variadic_states(vnode, "variadic");
const MultiFunction &fn = get_simple_math_function<T, Compute>(
@@ -209,6 +189,26 @@ void insert_simple_math_function(VTreeMFNetworkBuilder &builder,
fn, IndexRange(list_states.size()).as_array_ref(), {list_states.size()}, vnode);
}
+template<typename T> T add_func_cb(T a, T b)
+{
+ return a + b;
+}
+
+template<typename T> T mul_func_cb(T a, T b)
+{
+ return a * b;
+}
+
+template<typename T> T min_func_cb(T a, T b)
+{
+ return std::min(a, b);
+}
+
+template<typename T> T max_func_cb(T a, T b)
+{
+ return std::max(a, b);
+}
+
static void INSERT_add_floats(VTreeMFNetworkBuilder &builder, const VNode &vnode)
{
insert_simple_math_function<float, add_func_cb<float>>(builder, vnode, 0.0f);
@@ -229,6 +229,55 @@ static void INSERT_maximum_floats(VTreeMFNetworkBuilder &builder, const VNode &v
insert_simple_math_function<float, max_func_cb<float>>(builder, vnode, 0.0f);
}
+template<typename T, T (*Compute)(const T &)>
+static void insert_single_input_math_function(VTreeMFNetworkBuilder &builder, const VNode &vnode)
+{
+ const MultiFunction &base_fn = builder.allocate_function<FN::MF_Mappping<T, T, Compute>>(
+ vnode.name());
+ const MultiFunction &fn = get_vectorized_function(builder, base_fn, vnode.rna(), {"use_list"});
+ builder.add_function(fn, {0}, {1}, vnode);
+}
+
+template<typename T> T safe_sqrt_func_cb(const T &a)
+{
+ return (a >= 0.0) ? (T)std::sqrt(a) : 0.0f;
+}
+
+template<typename T> T abs_func_cb(const T &a)
+{
+ return (T)std::abs(a);
+}
+
+template<typename T> T sine_func_cb(const T &a)
+{
+ return (T)std::sin(a);
+}
+
+template<typename T> T cosine_func_cb(const T &a)
+{
+ return (T)std::cos(a);
+}
+
+static void INSERT_sqrt_float(VTreeMFNetworkBuilder &builder, const VNode &vnode)
+{
+ insert_single_input_math_function<float, safe_sqrt_func_cb<float>>(builder, vnode);
+}
+
+static void INSERT_abs_float(VTreeMFNetworkBuilder &builder, const VNode &vnode)
+{
+ insert_single_input_math_function<float, abs_func_cb<float>>(builder, vnode);
+}
+
+static void INSERT_sine(VTreeMFNetworkBuilder &builder, const VNode &vnode)
+{
+ insert_single_input_math_function<float, sine_func_cb<float>>(builder, vnode);
+}
+
+static void INSERT_cosine(VTreeMFNetworkBuilder &builder, const VNode &vnode)
+{
+ insert_single_input_math_function<float, cosine_func_cb<float>>(builder, vnode);
+}
+
void add_vtree_node_mapping_info(VTreeMultiFunctionMappings &mappings)
{
mappings.vnode_inserters.add_new("fn_FloatMathNode", INSERT_float_math);
@@ -248,6 +297,11 @@ void add_vtree_node_mapping_info(VTreeMultiFunctionMappings &mappings)
mappings.vnode_inserters.add_new("fn_MultiplyFloatsNode", INSERT_multiply_floats);
mappings.vnode_inserters.add_new("fn_MinimumFloatsNode", INSERT_minimum_floats);
mappings.vnode_inserters.add_new("fn_MaximumFloatsNode", INSERT_maximum_floats);
+
+ mappings.vnode_inserters.add_new("fn_SqrtFloatNode", INSERT_sqrt_float);
+ mappings.vnode_inserters.add_new("fn_AbsoluteFloatNode", INSERT_abs_float);
+ mappings.vnode_inserters.add_new("fn_SineNode", INSERT_sine);
+ mappings.vnode_inserters.add_new("fn_CosineNode", INSERT_cosine);
}
}; // namespace FN
More information about the Bf-blender-cvs
mailing list