From 0fcc04e7bfe1edf390bec06f488aa9a4ee220983 Mon Sep 17 00:00:00 2001 From: Chris Blackbourn Date: Sun, 24 Jul 2022 14:48:30 +1200 Subject: Cleanup: Fix off-by-half-errors with udim search --- source/blender/blenkernel/intern/image.cc | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'source') diff --git a/source/blender/blenkernel/intern/image.cc b/source/blender/blenkernel/intern/image.cc index 7fa3a5ad14d..c2b8ec95a46 100644 --- a/source/blender/blenkernel/intern/image.cc +++ b/source/blender/blenkernel/intern/image.cc @@ -867,28 +867,28 @@ int BKE_image_find_nearest_tile_with_offset(const Image *image, const float co[2], float r_uv_offset[2]) { - const float co_floor[2] = {floorf(co[0]), floorf(co[1])}; - /* Distance to the closest UDIM tile. */ + /* Distance squared to the closest UDIM tile. */ float dist_best_sq = FLT_MAX; float uv_offset_best[2] = {0, 0}; int tile_number_best = -1; + const float co_offset[2] = {co[0] - 0.5f, co[1] - 0.5f}; + LISTBASE_FOREACH (const ImageTile *, tile, &image->tiles) { float uv_offset[2]; BKE_image_get_tile_uv(image, tile->tile_number, uv_offset); - if (equals_v2v2(co_floor, uv_offset)) { - copy_v2_v2(r_uv_offset, uv_offset); - return tile->tile_number; - } - - /* Distance between co[2] and UDIM tile. */ - const float dist_sq = len_squared_v2v2(uv_offset, co); + /* Distance squared between co[2] and center of UDIM tile. */ + const float dist_sq = len_squared_v2v2(uv_offset, co_offset); if (dist_sq < dist_best_sq) { dist_best_sq = dist_sq; tile_number_best = tile->tile_number; copy_v2_v2(uv_offset_best, uv_offset); + + if (dist_best_sq < 0.5f * 0.5f) { + break; /* No other tile can be closer. */ + } } } if (tile_number_best != -1) { -- cgit v1.2.3