[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