[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