From 3d10dfb0a3baa35213949cfe6b8e8a88cbd4f1f9 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Fri, 24 Feb 2023 16:25:44 +0100 Subject: [PATCH] Fix #105166: Sample UV Surface node does not take index mask into account The `call` method was reading from and writing to memory that it was not supposed to access based on the passed in `mask`. --- .../nodes/node_geo_sample_uv_surface.cc | 34 ++++++------------- 1 file changed, 11 insertions(+), 23 deletions(-) diff --git a/source/blender/nodes/geometry/nodes/node_geo_sample_uv_surface.cc b/source/blender/nodes/geometry/nodes/node_geo_sample_uv_surface.cc index 0b7c574eca6..2da0e088598 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_sample_uv_surface.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_sample_uv_surface.cc @@ -218,29 +218,17 @@ class ReverseUVSampleFunction : public mf::MultiFunction { MutableSpan bary_weights = params.uninitialized_single_output_if_required( 3, "Barycentric Weights"); - Array results(mask.min_array_size()); - reverse_uv_sampler_->sample_many(sample_uvs, results); - - if (!is_valid.is_empty()) { - std::transform(results.begin(), - results.end(), - is_valid.begin(), - [](const ReverseUVSampler::Result &result) { - return result.type == ReverseUVSampler::ResultType::Ok; - }); - } - if (!tri_index.is_empty()) { - std::transform(results.begin(), - results.end(), - tri_index.begin(), - [](const ReverseUVSampler::Result &result) { return result.looptri_index; }); - } - - if (!bary_weights.is_empty()) { - std::transform(results.begin(), - results.end(), - bary_weights.begin(), - [](const ReverseUVSampler::Result &result) { return result.bary_weights; }); + for (const int i : mask) { + const ReverseUVSampler::Result result = reverse_uv_sampler_->sample(sample_uvs[i]); + if (!is_valid.is_empty()) { + is_valid[i] = result.type == ReverseUVSampler::ResultType::Ok; + } + if (!tri_index.is_empty()) { + tri_index[i] = result.looptri_index; + } + if (!bary_weights.is_empty()) { + bary_weights[i] = result.bary_weights; + } } }