[Bf-blender-cvs] [be57a27d6d9] functions: fix Map Range clamping
Jacques Lucke
noreply at git.blender.org
Fri Nov 15 16:04:06 CET 2019
Commit: be57a27d6d9af097906641404b9a73a50036b3e2
Author: Jacques Lucke
Date: Fri Nov 15 15:28:49 2019 +0100
Branches: functions
https://developer.blender.org/rBbe57a27d6d9af097906641404b9a73a50036b3e2
fix Map Range clamping
===================================================================
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/source/blender/functions/intern/multi_functions/mixed.cc b/source/blender/functions/intern/multi_functions/mixed.cc
index b05d84d076e..3c737cebc26 100644
--- a/source/blender/functions/intern/multi_functions/mixed.cc
+++ b/source/blender/functions/intern/multi_functions/mixed.cc
@@ -682,7 +682,7 @@ void MF_MapRange::call(MFMask mask, MFParams params, MFContext UNUSED(context))
}
}
-MF_Clamp::MF_Clamp()
+MF_Clamp::MF_Clamp(bool sort_minmax) : m_sort_minmax(sort_minmax)
{
MFSignatureBuilder signature("Clamp");
signature.readonly_single_input<float>("Value");
@@ -699,9 +699,26 @@ void MF_Clamp::call(MFMask mask, MFParams params, MFContext UNUSED(context)) con
VirtualListRef<float> max_values = params.readonly_single_input<float>(2, "Max");
MutableArrayRef<float> r_values = params.uninitialized_single_output<float>(3, "Value");
+ if (m_sort_minmax) {
for (uint i : mask.indices()) {
- float value = std::min(std::max(values[i], min_values[i]), max_values[i]);
- r_values[i] = value;
+ float min_v = min_values[i];
+ float max_v = max_values[i];
+ float value = values[i];
+ if (min_v < max_v) {
+ r_values[i] = std::min(std::max(value, min_v), max_v);
+ }
+ else {
+ r_values[i] = std::min(std::max(value, max_v), min_v);
+ }
+ }
+ }
+ else {
+ for (uint i : mask.indices()) {
+ float min_v = min_values[i];
+ float max_v = max_values[i];
+ float value = values[i];
+ r_values[i] = std::min(std::max(value, min_v), max_v);
+ }
}
}
diff --git a/source/blender/functions/intern/multi_functions/mixed.h b/source/blender/functions/intern/multi_functions/mixed.h
index 3fe6cb8630f..a5a338218ae 100644
--- a/source/blender/functions/intern/multi_functions/mixed.h
+++ b/source/blender/functions/intern/multi_functions/mixed.h
@@ -206,8 +206,11 @@ class MF_MapRange final : public MultiFunction {
};
class MF_Clamp final : public MultiFunction {
+ private:
+ bool m_sort_minmax;
+
public:
- MF_Clamp();
+ MF_Clamp(bool sort_minmax);
void call(MFMask mask, MFParams params, MFContext context) const override;
};
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 a969f18a5a7..ea4382f7611 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
@@ -498,7 +498,7 @@ static void INSERT_closest_point_on_object(VTreeMFNetworkBuilder &builder, const
static void INSERT_clamp_float(VTreeMFNetworkBuilder &builder, const VNode &vnode)
{
- const MultiFunction &fn = builder.construct_fn<MF_Clamp>();
+ const MultiFunction &fn = builder.construct_fn<MF_Clamp>(false);
builder.add_function(fn, {0, 1, 2}, {3}, vnode);
}
@@ -511,7 +511,7 @@ static void INSERT_map_range(VTreeMFNetworkBuilder &builder, const VNode &vnode)
builder.map_sockets(vnode.inputs(), map_node.inputs());
if (clamp) {
- const MultiFunction &clamp_fn = builder.construct_fn<MF_Clamp>();
+ const MultiFunction &clamp_fn = builder.construct_fn<MF_Clamp>(true);
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));
More information about the Bf-blender-cvs
mailing list