[Bf-blender-cvs] [44126f76ea7] temp-T97352-3d-texturing-seam-bleeding: Determine region to update from changed pixels.

Jeroen Bakker noreply at git.blender.org
Fri Apr 22 10:51:45 CEST 2022


Commit: 44126f76ea7bca07c2eb2ab2f3c709e17a7c5d8d
Author: Jeroen Bakker
Date:   Fri Apr 22 09:45:12 2022 +0200
Branches: temp-T97352-3d-texturing-seam-bleeding
https://developer.blender.org/rB44126f76ea7bca07c2eb2ab2f3c709e17a7c5d8d

Determine region to update from changed pixels.

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

M	source/blender/blenkernel/BKE_pbvh_pixels.hh
M	source/blender/blenkernel/intern/pbvh_pixels.cc
M	source/blender/blenkernel/intern/pbvh_pixels_seams.cc

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

diff --git a/source/blender/blenkernel/BKE_pbvh_pixels.hh b/source/blender/blenkernel/BKE_pbvh_pixels.hh
index 63e110775e9..07c17279a44 100644
--- a/source/blender/blenkernel/BKE_pbvh_pixels.hh
+++ b/source/blender/blenkernel/BKE_pbvh_pixels.hh
@@ -141,13 +141,10 @@ struct UDIMSeamFixes {
   uint16_t src_tile_number;
   uint16_t dst_tile_number;
   Vector<SeamFix> pixels;
-  /* Region of the dst image buffer for partial update. Should cover all `pixels.dst_pixels`. */
-  rcti dst_partial_region;
 
   UDIMSeamFixes(uint16_t src_tile_number, uint16_t dst_tile_number)
       : src_tile_number(src_tile_number), dst_tile_number(dst_tile_number)
   {
-    BLI_rcti_init_minmax(&dst_partial_region);
   }
 };
 
diff --git a/source/blender/blenkernel/intern/pbvh_pixels.cc b/source/blender/blenkernel/intern/pbvh_pixels.cc
index 6f32451e71f..d3c1f71931a 100644
--- a/source/blender/blenkernel/intern/pbvh_pixels.cc
+++ b/source/blender/blenkernel/intern/pbvh_pixels.cc
@@ -259,16 +259,35 @@ static void apply_watertight_check(PBVH *pbvh, Image *image, ImageUser *image_us
                            pixel_row.start_image_coordinate.x;
         for (int x = 0; x < pixel_row.num_pixels; x++) {
           if (image_buffer->rect_float) {
-            copy_v4_fl(&image_buffer->rect_float[pixel_offset * 4], 1.0);
+            copy_v4_fl4(&image_buffer->rect_float[pixel_offset * 4], 0.0f, 0.5f, 0.0f, 1.0f);
           }
           if (image_buffer->rect) {
             uint8_t *dest = static_cast<uint8_t *>(
                 static_cast<void *>(&image_buffer->rect[pixel_offset]));
-            copy_v4_uchar(dest, 255);
+            static uint8_t color[] = {0, 128, 0, 255};
+            copy_v4_v4_uchar(dest, color);
           }
           pixel_offset += 1;
         }
       }
+
+      for (UDIMSeamFixes &fixes : node_data->seams) {
+        if (fixes.dst_tile_number != image_tile.get_tile_number()) {
+          continue;
+        }
+        for (SeamFix &fix : fixes.pixels) {
+          int pixel_offset = fix.dst_pixel.y * image_buffer->x + fix.dst_pixel.x;
+          if (image_buffer->rect_float != nullptr) {
+            copy_v4_fl4(&image_buffer->rect_float[pixel_offset * 4], 1.0f, 0.0f, 0.0f, 1.0f);
+          }
+          else if (image_buffer->rect != nullptr) {
+            uint8_t *dest = static_cast<uint8_t *>(
+                static_cast<void *>(&image_buffer->rect[pixel_offset]));
+            static uint8_t seam_color[] = {255, 0, 0, 255};
+            copy_v4_v4_uchar(dest, seam_color);
+          }
+        }
+      }
     }
     BKE_image_release_ibuf(image, image_buffer, nullptr);
   }
@@ -303,13 +322,14 @@ static void update_pixels(PBVH *pbvh, Mesh *mesh, Image *image, ImageUser *image
   TaskParallelSettings settings;
   BKE_pbvh_parallel_range_settings(&settings, true, nodes_to_update.size());
   BLI_task_parallel_range(0, nodes_to_update.size(), &user_data, do_encode_pixels, &settings);
-  if (USE_WATERTIGHT_CHECK) {
-    apply_watertight_check(pbvh, image, image_user);
-  }
 
   int cd_loop_uv_offset = CustomData_get_offset(&mesh->ldata, CD_MLOOPUV);
   BKE_pbvh_pixels_rebuild_seams(pbvh, mesh, image, image_user, cd_loop_uv_offset);
 
+  if (USE_WATERTIGHT_CHECK) {
+    apply_watertight_check(pbvh, image, image_user);
+  }
+
   /* Clear the UpdatePixels flag. */
   for (PBVHNode *node : nodes_to_update) {
     node->flag = static_cast<PBVHNodeFlags>(node->flag & ~PBVH_RebuildPixels);
diff --git a/source/blender/blenkernel/intern/pbvh_pixels_seams.cc b/source/blender/blenkernel/intern/pbvh_pixels_seams.cc
index 5b973c5092c..9982888a5b7 100644
--- a/source/blender/blenkernel/intern/pbvh_pixels_seams.cc
+++ b/source/blender/blenkernel/intern/pbvh_pixels_seams.cc
@@ -234,7 +234,6 @@ static void add_seam_fix(PBVHNode &node,
 {
   NodeData &node_data = BKE_pbvh_pixels_node_data_get(node);
   UDIMSeamFixes &seam_fixes = node_data.ensure_seam_fixes(src_tile_number, dst_tile_number);
-  BLI_rcti_do_minmax_v(&seam_fixes.dst_partial_region, dst_pixel);
   seam_fixes.pixels.append(SeamFix{src_pixel, dst_pixel});
 }
 
@@ -275,7 +274,7 @@ static void build_fixes(PBVH &pbvh,
 
       /* Distance to the edge in pixel space. */
       float distance_to_edge = len_v2v2(closest_coord, uv_coord);
-      if (distance_to_edge > 2.5f) {
+      if (distance_to_edge > 3.5f) {
         continue;
       }
 
@@ -342,7 +341,7 @@ static void build_fixes(PBVH &pbvh,
 
     for (Bitmap &bitmap : bitmaps.bitmaps) {
       rcti uvbounds_i;
-      const int MARGIN = 1;
+      const int MARGIN = 2;
       uvbounds_i.xmin = (uvbounds.xmin - bitmap.image_tile.get_tile_x_offset()) *
                             bitmap.resolution[0] -
                         MARGIN;
@@ -507,10 +506,20 @@ void BKE_pbvh_pixels_fix_seams(PBVHNode *node, Image *image, ImageUser *image_us
       continue;
     }
 
+    /** Determine the region to update by checking actual changes. */
+    rcti region_to_update;
+    BLI_rcti_init_minmax(&region_to_update);
+
     if (src_image_buffer->rect_float != nullptr && dst_image_buffer->rect_float != nullptr) {
       for (SeamFix &fix : fixes.pixels) {
         int src_offset = fix.src_pixel.y * src_image_buffer->x + fix.src_pixel.x;
         int dst_offset = fix.dst_pixel.y * dst_image_buffer->x + fix.dst_pixel.x;
+
+        if (equals_v4v4(&dst_image_buffer->rect_float[dst_offset * 4],
+                        &src_image_buffer->rect_float[src_offset * 4])) {
+          continue;
+        }
+        BLI_rcti_do_minmax_v(&region_to_update, fix.dst_pixel);
         copy_v4_v4(&dst_image_buffer->rect_float[dst_offset * 4],
                    &src_image_buffer->rect_float[src_offset * 4]);
       }
@@ -519,19 +528,25 @@ void BKE_pbvh_pixels_fix_seams(PBVHNode *node, Image *image, ImageUser *image_us
       for (SeamFix &fix : fixes.pixels) {
         int src_offset = fix.src_pixel.y * src_image_buffer->x + fix.src_pixel.x;
         int dst_offset = fix.dst_pixel.y * dst_image_buffer->x + fix.dst_pixel.x;
+        if (dst_image_buffer->rect[dst_offset] == src_image_buffer->rect[src_offset]) {
+          continue;
+        }
+        BLI_rcti_do_minmax_v(&region_to_update, fix.dst_pixel);
         dst_image_buffer->rect[dst_offset] = src_image_buffer->rect[src_offset];
       }
     }
 
     /* Mark dst_image_buffer region dirty covering each dst_pixel. */
-    LISTBASE_FOREACH (ImageTile *, image_tile, &image->tiles) {
-      if (image_tile->tile_number != fixes.dst_tile_number) {
-        continue;
-      }
+    if (BLI_rcti_is_valid(&region_to_update)) {
+      LISTBASE_FOREACH (ImageTile *, image_tile, &image->tiles) {
+        if (image_tile->tile_number != fixes.dst_tile_number) {
+          continue;
+        }
 
-      BKE_image_partial_update_mark_region(
-          image, image_tile, dst_image_buffer, &fixes.dst_partial_region);
-      break;
+        BKE_image_partial_update_mark_region(
+            image, image_tile, dst_image_buffer, &region_to_update);
+        break;
+      }
     }
     BKE_image_release_ibuf(image, src_image_buffer, nullptr);
     BKE_image_release_ibuf(image, dst_image_buffer, nullptr);



More information about the Bf-blender-cvs mailing list