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. */ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs