[Bf-blender-cvs] [d79abb5d4f5] master: Fix: missing clamping in single mode in Sample Index node

Jacques Lucke noreply at git.blender.org
Fri Jan 20 14:33:14 CET 2023


Commit: d79abb5d4f559fad4d2e057c7d163334ac9c30d8
Author: Jacques Lucke
Date:   Fri Jan 20 14:33:06 2023 +0100
Branches: master
https://developer.blender.org/rBd79abb5d4f559fad4d2e057c7d163334ac9c30d8

Fix: missing clamping in single mode in Sample Index node

===================================================================

M	source/blender/nodes/geometry/nodes/node_geo_sample_index.cc

===================================================================

diff --git a/source/blender/nodes/geometry/nodes/node_geo_sample_index.cc b/source/blender/nodes/geometry/nodes/node_geo_sample_index.cc
index 2ac19b02f9c..b6267d2439a 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_sample_index.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_sample_index.cc
@@ -298,6 +298,7 @@ static void node_geo_exec(GeoNodeExecParams params)
   const NodeGeometrySampleIndex &storage = node_storage(params.node());
   const eCustomDataType data_type = eCustomDataType(storage.data_type);
   const eAttrDomain domain = eAttrDomain(storage.domain);
+  const bool use_clamp = bool(storage.clamp);
 
   GField value_field = get_input_attribute_field(params, data_type);
   ValueOrField<int> index_value_or_field = params.extract_input<ValueOrField<int>>("Index");
@@ -307,24 +308,33 @@ static void node_geo_exec(GeoNodeExecParams params)
   if (index_value_or_field.is_field()) {
     /* If the index is a field, the output has to be a field that still depends on the input. */
     auto fn = std::make_shared<SampleIndexFunction>(
-        std::move(geometry), std::move(value_field), domain, bool(storage.clamp));
+        std::move(geometry), std::move(value_field), domain, use_clamp);
     auto op = FieldOperation::Create(std::move(fn), {index_value_or_field.as_field()});
     output_field = GField(std::move(op));
   }
   else if (const GeometryComponent *component = find_source_component(geometry, domain)) {
     /* Optimization for the case when the index is a single value. Here only that one index has to
      * be evaluated. */
-    const int index = index_value_or_field.as_value();
-    const IndexMask mask = IndexRange(index, 1);
-    bke::GeometryFieldContext geometry_context(*component, domain);
-    FieldEvaluator evaluator(geometry_context, &mask);
-    evaluator.add(value_field);
-    evaluator.evaluate();
-    const GVArray &data = evaluator.get_evaluated(0);
-    BUFFER_FOR_CPP_TYPE_VALUE(cpp_type, buffer);
-    data.get_to_uninitialized(index, buffer);
-    output_field = fn::make_constant_field(cpp_type, buffer);
-    cpp_type.destruct(buffer);
+    const int domain_size = component->attribute_domain_size(domain);
+    int index = index_value_or_field.as_value();
+    if (use_clamp) {
+      index = std::clamp(index, 0, domain_size - 1);
+    }
+    if (index >= 0 && index < domain_size) {
+      const IndexMask mask = IndexRange(index, 1);
+      bke::GeometryFieldContext geometry_context(*component, domain);
+      FieldEvaluator evaluator(geometry_context, &mask);
+      evaluator.add(value_field);
+      evaluator.evaluate();
+      const GVArray &data = evaluator.get_evaluated(0);
+      BUFFER_FOR_CPP_TYPE_VALUE(cpp_type, buffer);
+      data.get_to_uninitialized(index, buffer);
+      output_field = fn::make_constant_field(cpp_type, buffer);
+      cpp_type.destruct(buffer);
+    }
+    else {
+      output_field = fn::make_constant_field(cpp_type, cpp_type.default_value());
+    }
   }
   else {
     /* Output default value if there is no geometry. */



More information about the Bf-blender-cvs mailing list