[Bf-blender-cvs] [8e922806203] temp-T97352-3d-texturing-seam-bleeding-b: WIP (border extraction)

Jeroen Bakker noreply at git.blender.org
Wed May 25 09:01:31 CEST 2022


Commit: 8e922806203eadae4860e6edc6ca1e46c5a32439
Author: Jeroen Bakker
Date:   Mon May 23 12:26:56 2022 +0200
Branches: temp-T97352-3d-texturing-seam-bleeding-b
https://developer.blender.org/rB8e922806203eadae4860e6edc6ca1e46c5a32439

WIP (border extraction)

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

M	source/blender/blenkernel/BKE_uv_islands.hh
M	source/blender/blenkernel/intern/pbvh_pixels.cc

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

diff --git a/source/blender/blenkernel/BKE_uv_islands.hh b/source/blender/blenkernel/BKE_uv_islands.hh
index 514aac0ef6b..8273061c68f 100644
--- a/source/blender/blenkernel/BKE_uv_islands.hh
+++ b/source/blender/blenkernel/BKE_uv_islands.hh
@@ -33,6 +33,11 @@ struct UVEdge {
     return (vertices[0].uv == other.vertices[0].uv && vertices[1].uv == other.vertices[1].uv) ||
            (vertices[0].uv == other.vertices[1].uv && vertices[1].uv == other.vertices[0].uv);
   }
+
+  bool is_border_edge() const
+  {
+    return adjacent_uv_primitive == -1;
+  }
 };
 
 struct UVPrimitive {
@@ -79,14 +84,71 @@ struct UVPrimitive {
   }
 };
 
+struct UVBorderVert {
+  float2 uv;
+  explicit UVBorderVert(float2 &uv) : uv(uv)
+  {
+  }
+};
+
+struct UVBorderEdge {
+  UVEdge *edge;
+  bool tag = false;
+
+  explicit UVBorderEdge(UVEdge *edge) : edge(edge)
+  {
+  }
+};
+
 struct UVIsland {
   Vector<UVPrimitive> primitives;
+  Vector<UVBorderVert> border;
 
   UVIsland(const UVPrimitive &primitive)
   {
     append(primitive);
   }
 
+  void extract_border()
+  {
+    Vector<UVBorderEdge> edges;
+
+    for (UVPrimitive &primitive : primitives) {
+      for (UVEdge &edge : primitive.edges) {
+        if (edge.is_border_edge()) {
+          edges.append(UVBorderEdge(&edge));
+        }
+      }
+    }
+
+    edges.first().tag = true;
+    UVEdge *starting_edge = edges.first().edge;
+
+    border.append(UVBorderVert(starting_edge->vertices[0].uv));
+    border.append(UVBorderVert(starting_edge->vertices[1].uv));
+    UVBorderVert &first = border.first();
+    UVBorderVert &current = border.last();
+
+    while (current.uv != first.uv) {
+      for (UVBorderEdge &border_edge : edges) {
+        if (border_edge.tag == true) {
+          continue;
+        }
+        int i;
+        for (i = 0; i < 2; i++) {
+          if (border_edge.edge->vertices[i].uv == current.uv) {
+            border.append(UVBorderVert(border_edge.edge->vertices[1 - i].uv));
+            border_edge.tag = true;
+            break;
+          }
+        }
+        if (i != 2) {
+          break;
+        }
+      }
+    }
+  }
+
  private:
   void append(const UVPrimitive &primitive)
   {
@@ -183,7 +245,13 @@ struct UVIslands {
     svg_footer(of);
     of.close();
 #endif
-    // TODO: extract border.
+  }
+
+  void extract_borders()
+  {
+    for (UVIsland &island : islands) {
+      island.extract_border();
+    }
   }
 
  private:
diff --git a/source/blender/blenkernel/intern/pbvh_pixels.cc b/source/blender/blenkernel/intern/pbvh_pixels.cc
index 551393e3fd2..1c8013ae20f 100644
--- a/source/blender/blenkernel/intern/pbvh_pixels.cc
+++ b/source/blender/blenkernel/intern/pbvh_pixels.cc
@@ -41,6 +41,7 @@ static uv_islands::UVIslands build_uv_islands(const PBVH &pbvh, const MLoopUV *m
   uv_islands::UVIslandsMask uv_masks(float2(0.0, 0.0), ushort2(256, 256));
   uv_masks.add(islands);
   uv_masks.dilate();
+  islands.extract_borders();
   return islands;
 }



More information about the Bf-blender-cvs mailing list