[Bf-blender-cvs] [16f7804d5f8] functions: bring back Clamp and Map Range nodes
Jacques Lucke
noreply at git.blender.org
Wed Nov 13 14:23:44 CET 2019
Commit: 16f7804d5f88a34b29bbde5ca8ffd20de213ce62
Author: Jacques Lucke
Date: Wed Nov 13 14:23:21 2019 +0100
Branches: functions
https://developer.blender.org/rB16f7804d5f88a34b29bbde5ca8ffd20de213ce62
bring back Clamp and Map Range nodes
===================================================================
M release/scripts/startup/nodes/function_nodes/math.py
M source/blender/functions/intern/multi_functions/mixed.cc
M source/blender/functions/intern/multi_functions/mixed.h
M source/blender/functions/intern/vtree_multi_function_network/mappings_nodes.cc
===================================================================
diff --git a/release/scripts/startup/nodes/function_nodes/math.py b/release/scripts/startup/nodes/function_nodes/math.py
index bff9f13c404..8b921a5a360 100644
--- a/release/scripts/startup/nodes/function_nodes/math.py
+++ b/release/scripts/startup/nodes/function_nodes/math.py
@@ -82,3 +82,34 @@ VectorDistanceNode = create_two_inputs_other_output_math_node("Vector", "Float",
BooleanAndNode = create_variadic_math_node("Boolean", "fn_BooleanAndNode", "And")
BooleanOrNode = create_variadic_math_node("Boolean", "fn_BooleanOrNode", "Or")
BooleanNotNode = create_single_input_math_node("Boolean", "fn_BooleanNotNode", "Not")
+
+
+class MapRangeNode(bpy.types.Node, FunctionNode):
+ bl_idname = "fn_MapRangeNode"
+ bl_label = "Map Range"
+
+ clamp: BoolProperty(
+ name="Clamp",
+ default=True,
+ )
+
+ def declaration(self, builder: NodeBuilder):
+ builder.fixed_input("value", "Value", "Float")
+ builder.fixed_input("from_min", "From Min", "Float", default=0)
+ builder.fixed_input("from_max", "From Max", "Float", default=1)
+ builder.fixed_input("to_min", "To Min", "Float", default=0)
+ builder.fixed_input("to_max", "To Max", "Float", default=1)
+ builder.fixed_output("value", "Value", "Float")
+
+ def draw(self, layout):
+ layout.prop(self, "clamp")
+
+class FloatClampNode(bpy.types.Node, FunctionNode):
+ bl_idname = "fn_FloatClampNode"
+ bl_label = "Clamp"
+
+ def declaration(self, builder: NodeBuilder):
+ builder.fixed_input("value", "Value", "Float")
+ builder.fixed_input("min", "Min", "Float", default=0)
+ builder.fixed_input("max", "Max", "Float", default=1)
+ builder.fixed_output("value", "Value", "Float")
diff --git a/source/blender/functions/intern/multi_functions/mixed.cc b/source/blender/functions/intern/multi_functions/mixed.cc
index 97f745b7348..c24f9e00a66 100644
--- a/source/blender/functions/intern/multi_functions/mixed.cc
+++ b/source/blender/functions/intern/multi_functions/mixed.cc
@@ -650,4 +650,59 @@ void MF_ClosestPointOnObject::call(MFMask mask, MFParams params, MFContext conte
}
}
+MF_MapRange::MF_MapRange()
+{
+ MFSignatureBuilder signature("Map Range");
+ signature.readonly_single_input<float>("Value");
+ signature.readonly_single_input<float>("From Min");
+ signature.readonly_single_input<float>("From Max");
+ signature.readonly_single_input<float>("To Min");
+ signature.readonly_single_input<float>("To Max");
+ signature.single_output<float>("Value");
+ this->set_signature(signature);
+}
+
+void MF_MapRange::call(MFMask mask, MFParams params, MFContext UNUSED(context)) const
+{
+ VirtualListRef<float> values = params.readonly_single_input<float>(0, "Value");
+ VirtualListRef<float> from_min = params.readonly_single_input<float>(1, "From Min");
+ VirtualListRef<float> from_max = params.readonly_single_input<float>(2, "From Max");
+ VirtualListRef<float> to_min = params.readonly_single_input<float>(3, "To Min");
+ VirtualListRef<float> to_max = params.readonly_single_input<float>(4, "To Max");
+ MutableArrayRef<float> r_values = params.uninitialized_single_output<float>(5, "Value");
+
+ for (uint i : mask.indices()) {
+ float diff = from_max[i] - from_min[i];
+ if (diff != 0.0f) {
+ r_values[i] = (values[i] - from_min[i]) / diff * (to_max[i] - to_min[i]) + to_min[i];
+ }
+ else {
+ r_values[i] = to_min[i];
+ }
+ }
+}
+
+MF_Clamp::MF_Clamp()
+{
+ MFSignatureBuilder signature("Clamp");
+ signature.readonly_single_input<float>("Value");
+ signature.readonly_single_input<float>("Min");
+ signature.readonly_single_input<float>("Max");
+ signature.single_output<float>("Value");
+ this->set_signature(signature);
+}
+
+void MF_Clamp::call(MFMask mask, MFParams params, MFContext UNUSED(context)) const
+{
+ VirtualListRef<float> values = params.readonly_single_input<float>(0, "Value");
+ VirtualListRef<float> min_values = params.readonly_single_input<float>(1, "Min");
+ VirtualListRef<float> max_values = params.readonly_single_input<float>(2, "Max");
+ MutableArrayRef<float> r_values = params.uninitialized_single_output<float>(3, "Value");
+
+ for (uint i : mask.indices()) {
+ float value = std::min(std::max(values[i], min_values[i]), max_values[i]);
+ r_values[i] = value;
+ }
+}
+
} // namespace FN
diff --git a/source/blender/functions/intern/multi_functions/mixed.h b/source/blender/functions/intern/multi_functions/mixed.h
index 3d58dcfdd55..1e794db94b6 100644
--- a/source/blender/functions/intern/multi_functions/mixed.h
+++ b/source/blender/functions/intern/multi_functions/mixed.h
@@ -193,6 +193,18 @@ class MF_ClosestPointOnObject final : public MultiFunction {
void call(MFMask mask, MFParams params, MFContext context) const override;
};
+class MF_MapRange final : public MultiFunction {
+ public:
+ MF_MapRange();
+ void call(MFMask mask, MFParams params, MFContext context) const override;
+};
+
+class MF_Clamp final : public MultiFunction {
+ public:
+ MF_Clamp();
+ void call(MFMask mask, MFParams params, MFContext context) const override;
+};
+
template<typename FromT, typename ToT, ToT (*Compute)(const FromT &)>
class MF_Mappping final : public MultiFunction {
public:
diff --git a/source/blender/functions/intern/vtree_multi_function_network/mappings_nodes.cc b/source/blender/functions/intern/vtree_multi_function_network/mappings_nodes.cc
index e80c0ccd0b4..85a9b65e606 100644
--- a/source/blender/functions/intern/vtree_multi_function_network/mappings_nodes.cc
+++ b/source/blender/functions/intern/vtree_multi_function_network/mappings_nodes.cc
@@ -495,6 +495,32 @@ static void INSERT_closest_point_on_object(VTreeMFNetworkBuilder &builder, const
builder.add_function(fn, {0, 1}, {2}, vnode);
}
+static void INSERT_clamp_float(VTreeMFNetworkBuilder &builder, const VNode &vnode)
+{
+ const MultiFunction &fn = builder.construct_fn<MF_Clamp>();
+ builder.add_function(fn, {0, 1, 2}, {3}, vnode);
+}
+
+static void INSERT_map_range(VTreeMFNetworkBuilder &builder, const VNode &vnode)
+{
+ bool clamp = RNA_boolean_get(vnode.rna(), "clamp");
+
+ const MultiFunction &map_range_fn = builder.construct_fn<MF_MapRange>();
+ MFBuilderFunctionNode &map_node = builder.add_function(map_range_fn, {0, 1, 2, 3, 4}, {5});
+ builder.map_sockets(vnode.inputs(), map_node.inputs());
+
+ if (clamp) {
+ const MultiFunction &clamp_fn = builder.construct_fn<MF_Clamp>();
+ MFBuilderFunctionNode &clamp_node = builder.add_function(clamp_fn, {0, 1, 2}, {3});
+ builder.add_link(map_node.output(0), clamp_node.input(0));
+ builder.map_sockets(vnode.inputs().slice(3, 2), clamp_node.inputs().slice(1, 2));
+ builder.map_sockets(vnode.output(0), clamp_node.output(0));
+ }
+ else {
+ builder.map_sockets(vnode.output(0), map_node.output(0));
+ }
+}
+
void add_vtree_node_mapping_info(VTreeMultiFunctionMappings &mappings)
{
mappings.vnode_inserters.add_new("fn_CombineColorNode", INSERT_combine_color);
@@ -515,6 +541,8 @@ void add_vtree_node_mapping_info(VTreeMultiFunctionMappings &mappings)
mappings.vnode_inserters.add_new("fn_PerlinNoiseNode", INSERT_perlin_noise);
mappings.vnode_inserters.add_new("fn_ParticleInfoNode", INSERT_particle_info);
mappings.vnode_inserters.add_new("fn_ClosestPointOnObjectNode", INSERT_closest_point_on_object);
+ mappings.vnode_inserters.add_new("fn_MapRangeNode", INSERT_map_range);
+ mappings.vnode_inserters.add_new("fn_FloatClampNode", INSERT_clamp_float);
mappings.vnode_inserters.add_new("fn_AddFloatsNode", INSERT_add_floats);
mappings.vnode_inserters.add_new("fn_MultiplyFloatsNode", INSERT_multiply_floats);
More information about the Bf-blender-cvs
mailing list