[Bf-blender-cvs] [0132873a37b] temp-T97352-3d-texturing-seam-bleeding-b2: Flipping borders.

Jeroen Bakker noreply at git.blender.org
Wed Jun 15 08:49:22 CEST 2022


Commit: 0132873a37b8386b22ba52cb8d9e103082b540f9
Author: Jeroen Bakker
Date:   Wed Jun 15 08:49:18 2022 +0200
Branches: temp-T97352-3d-texturing-seam-bleeding-b2
https://developer.blender.org/rB0132873a37b8386b22ba52cb8d9e103082b540f9

Flipping borders.

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

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

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

diff --git a/source/blender/blenkernel/BKE_uv_islands.hh b/source/blender/blenkernel/BKE_uv_islands.hh
index db32ca18c4f..6690b856ae9 100644
--- a/source/blender/blenkernel/BKE_uv_islands.hh
+++ b/source/blender/blenkernel/BKE_uv_islands.hh
@@ -127,11 +127,11 @@ struct MeshData {
     init_edges();
 
     for (const MeshVertex &v : vertices) {
-      printf("Vert {v%d}\n", v.v);
+      printf("Vert {v%lld}\n", v.v);
       for (const MeshEdge *e : v.edges) {
-        printf("-Edge {v%d v%d}\n", e->vert1->v, e->vert2->v);
+        printf("-Edge {v%lld v%lld}\n", e->vert1->v, e->vert2->v);
         for (const MeshPrimitive *p : e->primitives) {
-          printf(" -Prim {p%d, v%d v%d v%d}\n",
+          printf(" -Prim {p%lld, v%lld v%lld v%lld}\n",
                  p->index,
                  p->vertices[0].vertex->v,
                  p->vertices[1].vertex->v,
@@ -395,6 +395,33 @@ struct UVPrimitive {
     return nullptr;
   }
 
+  const bool contains_uv_vertex(const UVVertex *uv_vertex) const
+  {
+    for (UVEdge *edge : edges) {
+      if (std::find(edge->vertices.begin(), edge->vertices.end(), uv_vertex) !=
+          edge->vertices.end()) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  const UVVertex *get_other_uv_vertex(const UVVertex *v1, const UVVertex *v2) const
+  {
+    BLI_assert(contains_uv_vertex(v1));
+    BLI_assert(contains_uv_vertex(v2));
+
+    for (const UVEdge *edge : edges) {
+      for (const UVVertex *uv_vertex : edge->vertices) {
+        if (uv_vertex != v1 && uv_vertex != v2) {
+          return uv_vertex;
+        }
+      }
+    }
+    BLI_assert_unreachable();
+    return nullptr;
+  }
+
   UVBorder extract_border() const;
 };
 
@@ -426,12 +453,21 @@ struct UVBorderEdge {
     int actual_index = reverse_order ? 1 - index : index;
     return edge->vertices[actual_index];
   }
+
   const UVVertex *get_uv_vertex(int index) const
   {
     int actual_index = reverse_order ? 1 - index : index;
     return edge->vertices[actual_index];
   }
 
+  /**
+   * Get the uv vertex from the primitive that is not part of the edge.
+   */
+  const UVVertex *get_other_uv_vertex() const
+  {
+    return uv_primitive->get_other_uv_vertex(edge->vertices[0], edge->vertices[1]);
+  }
+
   float length() const
   {
     return len_v2v2(edge->vertices[0]->uv, edge->vertices[1]->uv);
@@ -468,10 +504,15 @@ struct UVBorder {
   // TODO: support multiple rings + order (CW, CCW)
   Vector<UVBorderEdge> edges;
 
+  /**
+   * Check if the border is counter clock wise from its island.
+   */
+  bool is_ccw() const;
+
   /**
    * Flip the order of the verts, changing the order between CW and CCW.
    */
-  void flip_order();
+  void flip();
 
   /**
    * Calculate the outside angle of the given vert.
diff --git a/source/blender/blenkernel/intern/uv_islands.cc b/source/blender/blenkernel/intern/uv_islands.cc
index fa1c9b379b1..59df6cd7a18 100644
--- a/source/blender/blenkernel/intern/uv_islands.cc
+++ b/source/blender/blenkernel/intern/uv_islands.cc
@@ -29,6 +29,9 @@ void UVIsland::extract_borders()
     if (!border.has_value()) {
       break;
     }
+    if (border->is_ccw()) {
+      border->flip();
+    }
     borders.append(*border);
   }
 }
@@ -594,11 +597,28 @@ std::optional<UVBorder> UVBorder::extract_from_edges(Vector<UVBorderEdge> &edges
   return border;
 }
 
-void UVBorder::flip_order()
+bool UVBorder::is_ccw() const
+{
+  const UVBorderEdge &edge = edges.first();
+  const UVVertex *uv_vertex1 = edge.get_uv_vertex(0);
+  const UVVertex *uv_vertex2 = edge.get_uv_vertex(1);
+  const UVVertex *uv_vertex3 = edge.get_other_uv_vertex();
+  float poly[3][2];
+  copy_v2_v2(poly[0], uv_vertex1->uv);
+  copy_v2_v2(poly[1], uv_vertex2->uv);
+  copy_v2_v2(poly[2], uv_vertex3->uv);
+  const bool ccw = cross_poly_v2(poly, 3) < 0.0;
+  return ccw;
+}
+
+void UVBorder::flip()
 {
+  uint64_t border_index = edges.first().border_index;
   for (UVBorderEdge &edge : edges) {
     edge.reverse_order = !edge.reverse_order;
   }
+  std::reverse(edges.begin(), edges.end());
+  update_indexes(border_index);
 }
 
 float UVBorder::outside_angle(const UVBorderEdge &edge) const



More information about the Bf-blender-cvs mailing list