[Bf-blender-cvs] [0fcc04e7bfe] master: Cleanup: Fix off-by-half-errors with udim search

Chris Blackbourn noreply at git.blender.org
Sun Jul 24 05:02:47 CEST 2022


Commit: 0fcc04e7bfe1edf390bec06f488aa9a4ee220983
Author: Chris Blackbourn
Date:   Sun Jul 24 14:48:30 2022 +1200
Branches: master
https://developer.blender.org/rB0fcc04e7bfe1edf390bec06f488aa9a4ee220983

Cleanup: Fix off-by-half-errors with udim search

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

M	source/blender/blenkernel/intern/image.cc

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

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) {



More information about the Bf-blender-cvs mailing list