[Bf-blender-cvs] [11bcb614b5b] temp-T97352-3d-texturing-seam-bleeding: Seam building.

Jeroen Bakker noreply at git.blender.org
Tue Apr 19 15:00:22 CEST 2022


Commit: 11bcb614b5b1a6453f14994d049ba08530cedee9
Author: Jeroen Bakker
Date:   Tue Apr 19 12:25:24 2022 +0200
Branches: temp-T97352-3d-texturing-seam-bleeding
https://developer.blender.org/rB11bcb614b5b1a6453f14994d049ba08530cedee9

Seam building.

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

M	source/blender/blenkernel/BKE_pbvh_pixels.hh
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 4e37f13d916..5964959b761 100644
--- a/source/blender/blenkernel/BKE_pbvh_pixels.hh
+++ b/source/blender/blenkernel/BKE_pbvh_pixels.hh
@@ -132,6 +132,22 @@ struct UDIMTilePixels {
   }
 };
 
+struct SeamFix {
+  int2 src_pixel;
+  int2 dst_pixel;
+};
+
+struct UDIMSeamFixes {
+  ushort src_tile_number;
+  ushort dst_tile_number;
+  Vector<SeamFix> pixels;
+
+  UDIMSeamFixes(uint16_t src_tile_number, uint16_t dst_tile_number)
+      : src_tile_number(src_tile_number), dst_tile_number(dst_tile_number)
+  {
+  }
+};
+
 struct NodeData {
   struct {
     bool dirty : 1;
@@ -139,6 +155,8 @@ struct NodeData {
 
   Vector<UDIMTilePixels> tiles;
   Triangles triangles;
+  /* TODO: This should be ordered between source and destination UDIM tiles. */
+  Vector<UDIMSeamFixes> seams;
 
   NodeData()
   {
@@ -155,6 +173,17 @@ struct NodeData {
     return nullptr;
   }
 
+  UDIMSeamFixes &ensure_seam_fixes(uint16_t src_tile_number, uint16_t dst_tile_number)
+  {
+    for (UDIMSeamFixes &fixes : seams) {
+      if (fixes.src_tile_number == src_tile_number && fixes.dst_tile_number == dst_tile_number) {
+        return fixes;
+      }
+    }
+    seams.append(UDIMSeamFixes(src_tile_number, dst_tile_number));
+    return seams.last();
+  }
+
   void mark_region(Image &image, const image::ImageTileWrapper &image_tile, ImBuf &image_buffer)
   {
     UDIMTilePixels *tile = find_tile_data(image_tile);
@@ -183,5 +212,6 @@ void BKE_pbvh_pixels_mark_image_dirty(PBVHNode &node, Image &image, ImageUser &i
 
 void BKE_pbvh_pixels_rebuild_seams(
     PBVH *pbvh, Mesh *me, Image *image, ImageUser *image_user, int cd_loop_uv_offset);
+void BKE_pbvh_pixels_fix_seams(PBVH *pbvh, Image *image, ImageUser *image_user);
 
 }  // namespace blender::bke::pbvh::pixels
diff --git a/source/blender/blenkernel/intern/pbvh_pixels_seams.cc b/source/blender/blenkernel/intern/pbvh_pixels_seams.cc
index c5a27c9e470..5a0dffad919 100644
--- a/source/blender/blenkernel/intern/pbvh_pixels_seams.cc
+++ b/source/blender/blenkernel/intern/pbvh_pixels_seams.cc
@@ -78,6 +78,13 @@ struct PixelInfo {
     return result;
   }
 
+  static PixelInfo seam_fix()
+  {
+    PixelInfo result;
+    result.node = IS_SEAM_FIX;
+    return result;
+  }
+
   uint32_t get_node_index() const
   {
     return node >> 2;
@@ -106,6 +113,18 @@ struct Bitmap {
       : image_tile(image_tile), bitmap(bitmap), resolution(resolution)
   {
   }
+
+  void mark_seam_fix(int2 image_coordinate)
+  {
+    int offset = image_coordinate.y * resolution.x + image_coordinate.x;
+    bitmap[offset] = PixelInfo::seam_fix();
+  }
+
+  const PixelInfo &get_pixel_info(int2 image_coordinate) const
+  {
+    int offset = image_coordinate.y * resolution.x + image_coordinate.x;
+    return bitmap[offset];
+  }
 };
 
 struct Bitmaps {
@@ -161,6 +180,34 @@ Bitmaps create_tile_bitmap(const PBVH &pbvh, Image &image, ImageUser &image_user
   return result;
 }
 
+int2 find_source_pixel()
+{
+  return int2(0, 0);
+}
+
+static void BKE_pbvh_pixels_clear_seams(PBVH *pbvh)
+{
+  for (int n = 0; n < pbvh->totnode; n++) {
+    PBVHNode &node = pbvh->nodes[n];
+    if ((node.flag & PBVH_Leaf) == 0) {
+      continue;
+    }
+    NodeData &node_data = BKE_pbvh_pixels_node_data_get(node);
+    node_data.seams.clear();
+  }
+}
+
+static void add_seam_fix(PBVHNode &node,
+                         uint16_t src_tile_number,
+                         int2 src_pixel,
+                         uint16_t dst_tile_number,
+                         int2 dst_pixel)
+{
+  NodeData &node_data = BKE_pbvh_pixels_node_data_get(node);
+  UDIMSeamFixes &seam_fixes = node_data.ensure_seam_fixes(src_tile_number, dst_tile_number);
+  seam_fixes.pixels.append(SeamFix{src_pixel, dst_pixel});
+}
+
 void BKE_pbvh_pixels_rebuild_seams(
     PBVH *pbvh, Mesh *mesh, Image *image, ImageUser *image_user, int cd_loop_uv_offset)
 {
@@ -175,13 +222,14 @@ void BKE_pbvh_pixels_rebuild_seams(
   from_mesh_params.calc_vert_normal = false;
   BM_mesh_bm_from_me(bm, mesh, &from_mesh_params);
 
+  BKE_pbvh_pixels_clear_seams(pbvh);
+
   // find seams.
   // for each edge
   Vector<BMLoopPair> pairs = find_connected_loops(bm, cd_loop_uv_offset);
   printf("found %lld pairs\n", pairs.size());
 
   // Make a bitmap per tile indicating pixels that have already been assigned to a PBVHNode.
-  // to we could also loop over each node/tile/packed pixels, but that might take to much time.
   Bitmaps bitmaps = create_tile_bitmap(*pbvh, *image, *image_user);
 
   for (BMLoopPair &pair : pairs) {
@@ -215,6 +263,7 @@ void BKE_pbvh_pixels_rebuild_seams(
         continue;
       }
       else {
+
         for (int v = uvbounds_i.ymin; v < uvbounds_i.ymax; v++) {
           for (int u = uvbounds_i.xmin; u < uvbounds_i.xmax; u++) {
             if (u < 0 || u > bitmap.resolution[0] || v < 0 || v > bitmap.resolution[1]) {
@@ -224,8 +273,25 @@ void BKE_pbvh_pixels_rebuild_seams(
             int pixel_offset = v * bitmap.resolution[0] + u;
             PixelInfo &pixel_info = bitmap.bitmap[pixel_offset];
             if (pixel_info.is_extracted() || pixel_info.is_seam_fix()) {
+              /* Skip this pixel as it already has a solution. */
               continue;
             }
+
+            // What is the distance to the edge.
+            float2 uv(float(u) / bitmap.resolution[0], float(v) / bitmap.resolution[1]);
+            float2 closest_point;
+            float lambda = closest_to_line_v2(closest_point, uv, luv_1->uv, luv_2->uv);
+
+            int2 source_pixel = find_source_pixel();
+            int2 destination_pixel(u, v);
+            int source_node = bitmap.get_pixel_info(source_pixel).get_node_index();
+            PBVHNode &node = pbvh->nodes[source_node];
+            add_seam_fix(node,
+                         bitmap.image_tile.get_tile_number(),
+                         source_pixel,
+                         bitmap.image_tile.get_tile_number(),
+                         destination_pixel);
+            bitmap.mark_seam_fix(destination_pixel);
           }
         }
       }
@@ -235,4 +301,8 @@ void BKE_pbvh_pixels_rebuild_seams(
   BM_mesh_free(bm);
 }
 
+void BKE_pbvh_pixels_fix_seams(PBVH *pbvh, Image *image, ImageUser *image_user)
+{
+}
+
 }  // namespace blender::bke::pbvh::pixels



More information about the Bf-blender-cvs mailing list