[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