Commit: fad9241b9fc3f5eb396e28e126f1a28ef410d461
Author: Jeroen Bakker
Date:   Tue Jun 7 09:07:45 2022 +0200
Branches: temp-T97352-3d-texturing-seam-bleeding-b2
https://developer.blender.org/rBfad9241b9fc3f5eb396e28e126f1a28ef410d461

Make UVIsland own UVVertex.

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

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 9992c0da4a9..ec9cf65af66 100644
--- a/source/blender/blenkernel/BKE_uv_islands.hh
+++ b/source/blender/blenkernel/BKE_uv_islands.hh
@@ -183,19 +183,24 @@ struct UVVertex {
 };
 
 struct UVEdge {
-  UVVertex vertices[2];
+  std::array<UVVertex *, 2> vertices;
   Vector<UVPrimitive *, 2> uv_primitives;
 
-  bool has_shared_edge(const UVEdge &other) const
+  bool has_shared_edge(const MeshUVVert &v1, const MeshUVVert &v2) const
   {
-    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);
+    return (vertices[0]->uv == v1.uv && vertices[1]->uv == v2.uv) ||
+           (vertices[0]->uv == v2.uv && vertices[1]->uv == v1.uv);
   }
 
-  bool has_shared_edge(const MeshUVVert &v1, const MeshUVVert &v2) const
+  bool has_shared_edge(const UVVertex &v1, const UVVertex &v2) const
+  {
+    return (vertices[0]->uv == v1.uv && vertices[1]->uv == v2.uv) ||
+           (vertices[0]->uv == v2.uv && vertices[1]->uv == v1.uv);
+  }
+
+  bool has_shared_edge(const UVEdge &other) const
   {
-    return (vertices[0].uv == v1.uv && vertices[1].uv == v2.uv) ||
-           (vertices[0].uv == v2.uv && vertices[1].uv == v1.uv);
+    return has_shared_edge(*other.vertices[0], *other.vertices[1]);
   }
 
   bool is_border_edge() const
@@ -337,8 +342,8 @@ struct UVIsland {
       const MeshUVVert &v1 = primitive.get_uv_vert(edge->vert1);
       const MeshUVVert &v2 = primitive.get_uv_vert(edge->vert2);
       UVEdge uv_edge_template;
-      uv_edge_template.vertices[0] = UVVertex(v1);
-      uv_edge_template.vertices[1] = UVVertex(v2);
+      uv_edge_template.vertices[0] = lookup_or_create(UVVertex(v1));
+      uv_edge_template.vertices[1] = lookup_or_create(UVVertex(v2));
       UVEdge *uv_edge = lookup_or_create(uv_edge_template);
       uv_primitive_ptr->edges.append(uv_edge);
       uv_edge->uv_primitives.append(uv_primitive_ptr);
@@ -346,6 +351,19 @@ struct UVIsland {
     return uv_primitive_ptr;
   }
 
+  UVVertex *lookup_or_create(const UVVertex &vertex)
+  {
+    for (UVVertex &uv_vertex : uv_vertices) {
+      if (uv_vertex.uv == vertex.uv && uv_vertex.vertex == vertex.vertex) {
+        return &uv_vertex;
+      }
+    }
+
+    uv_vertices.append(vertex);
+    UVVertex *result = &uv_vertices.last();
+    return result;
+  }
+
   UVEdge *lookup_or_create(const UVEdge &edge)
   {
     for (UVEdge &uv_edge : uv_edges) {
@@ -373,7 +391,11 @@ struct UVIsland {
     uv_primitives.append(primitive);
     UVPrimitive *new_prim_ptr = &uv_primitives.last();
     for (int i = 0; i < 3; i++) {
-      new_prim_ptr->edges[i] = lookup_or_create(*new_prim_ptr->edges[i]);
+      UVEdge *other_edge = primitive.edges[i];
+      UVEdge uv_edge_template;
+      uv_edge_template.vertices[0] = 
lookup_or_create(*other_edge->vertices[0]);
+      uv_edge_template.vertices[1] = 
lookup_or_create(*other_edge->vertices[1]);
+      new_prim_ptr->edges[i] = lookup_or_create(uv_edge_template);
       new_prim_ptr->edges[i]->uv_primitives.append(new_prim_ptr);
     }
   }
@@ -586,7 +608,7 @@ struct UVIslandsMask {
     float2 p;
     for (int i = 0; i < 10; i++) {
       float f = i / 10.0f;
-      interp_v2_v2v2(p, edge.vertices[0].uv, edge.vertices[1].uv, f);
+      interp_v2_v2v2(p, edge.vertices[0]->uv, edge.vertices[1]->uv, f);
       add(island_index, p);
     }
   }
diff --git a/source/blender/blenkernel/intern/uv_islands.cc 
b/source/blender/blenkernel/intern/uv_islands.cc
index 0bf4964aa10..6d592d84f2c 100644
--- a/source/blender/blenkernel/intern/uv_islands.cc
+++ b/source/blender/blenkernel/intern/uv_islands.cc
@@ -35,10 +35,10 @@ void UVIsland::extract_border()
     }
 
     starting_border_edge->tag = true;
-    float2 first_uv = starting_border_edge->edge->vertices[0].uv;
-    float2 current_uv = starting_border_edge->edge->vertices[1].uv;
-    MeshVertex *current_vert = starting_border_edge->edge->vertices[1].vertex;
-    border.verts.append(UVBorderVert(first_uv, 
starting_border_edge->edge->vertices[0].vertex));
+    float2 first_uv = starting_border_edge->edge->vertices[0]->uv;
+    float2 current_uv = starting_border_edge->edge->vertices[1]->uv;
+    MeshVertex *current_vert = starting_border_edge->edge->vertices[1]->vertex;
+    border.verts.append(UVBorderVert(first_uv, 
starting_border_edge->edge->vertices[0]->vertex));
     while (current_uv != first_uv) {
       for (UVBorderEdge &border_edge : edges) {
         if (border_edge.tag == true) {
@@ -46,10 +46,10 @@ void UVIsland::extract_border()
         }
         int i;
         for (i = 0; i < 2; i++) {
-          if (border_edge.edge->vertices[i].uv == current_uv) {
+          if (border_edge.edge->vertices[i]->uv == current_uv) {
             border.verts.append(UVBorderVert(current_uv, current_vert));
-            current_uv = border_edge.edge->vertices[1 - i].uv;
-            current_vert = border_edge.edge->vertices[1 - i].vertex;
+            current_uv = border_edge.edge->vertices[1 - i]->uv;
+            current_vert = border_edge.edge->vertices[1 - i]->vertex;
             border_edge.tag = true;
             break;
           }
@@ -175,13 +175,13 @@ struct Fan {
                             
segment.primitive->vertices[segment.vert_order[1]].vertex->v);
       for (const UVPrimitive &uv_primitive : island.uv_primitives) {
         for (UVEdge *edge : uv_primitive.edges) {
-          int2 o(edge->vertices[0].vertex->v, edge->vertices[1].vertex->v);
+          int2 o(edge->vertices[0]->vertex->v, edge->vertices[1]->vertex->v);
           if ((test_edge.x == o.x && test_edge.y == o.y) ||
               (test_edge.x == o.y && test_edge.y == o.x)) {
             segment.uvs[0] = vert.uv;
             for (int i = 0; i < 2; i++) {
-              if (edge->vertices[i].uv == vert.uv) {
-                segment.uvs[1] = edge->vertices[1 - i].uv;
+              if (edge->vertices[i]->uv == vert.uv) {
+                segment.uvs[1] = edge->vertices[1 - i]->uv;
                 break;
               }
             }
@@ -546,6 +546,25 @@ bool UVIslandsMask::is_masked(const short island_index, 
const float2 uv) const
  *
  * Debugging functions to export UV islands to SVG files.
  * \{ */
+static float svg_x(const float2 &uv)
+{
+  return uv.x * 1024;
+}
+
+static float svg_y(const float2 &uv)
+{
+  return uv.y * 1024;
+}
+
+static float svg_x(const UVVertex &vertex)
+{
+  return svg_x(vertex.uv);
+}
+
+static float svg_y(const UVVertex &vertex)
+{
+  return svg_y(vertex.uv);
+}
 
 void svg_header(std::ostream &ss)
 {
@@ -558,9 +577,9 @@ void svg_footer(std::ostream &ss)
 }
 void svg(std::ostream &ss, const UVEdge &edge)
 {
-  ss << "       <line x1=\"" << edge.vertices[0].uv.x * 1024 << "\" y1=\""
-     << edge.vertices[0].uv.y * 1024 << "\" x2=\"" << edge.vertices[1].uv.x * 
1024 << "\" y2=\""
-     << edge.vertices[1].uv.y * 1024 << "\"/>\n";
+  ss << "       <line x1=\"" << svg_x(*edge.vertices[0]) << "\" y1=\"" << 
svg_y(*edge.vertices[0])
+     << "\" x2=\"" << svg_x(*edge.vertices[1]) << "\" y2=\"" << 
svg_y(*edge.vertices[1])
+     << "\"/>\n";
 }
 
 void svg(std::ostream &ss, const UVIsland &island, int step)
@@ -685,7 +704,7 @@ void svg(std::ostream &ss, const UVPrimitive &primitive)
 {
   ss << "       <polygon points=\"";
   for (int i = 0; i < 3; i++) {
-    svg_coords(ss, primitive.edges[i]->vertices[0].uv);
+    svg_coords(ss, primitive.edges[i]->vertices[0]->uv);
     ss << " ";
   }
   ss << "\"/>\n";
@@ -693,7 +712,7 @@ void svg(std::ostream &ss, const UVPrimitive &primitive)
   float2 center(0.0, 0.0);
   for (int i = 0; i < 3; i++) {
     for (int j = 0; j < 2; j++) {
-      center += primitive.edges[i]->vertices[j].uv;
+      center += primitive.edges[i]->vertices[j]->uv;
     }
   }
   center /= 3 * 2;
@@ -702,10 +721,10 @@ void svg(std::ostream &ss, const UVPrimitive &primitive)
   ss << primitive.primitive->index;
   ss << "</text>\n";
   for (int i = 0; i < 3; i++) {
-    float2 co = (center + primitive.edges[i]->vertices[0].uv) / 2.0;
+    float2 co = (center + primitive.edges[i]->vertices[0]->uv) / 2.0;
     ss << "<text x=\"" << co.x * 1024 << "\"";
     ss << " y=\"" << co.y * 1024 << "\">";
-    ss << primitive.edges[i]->vertices[0].vertex->v;
+    ss << primitive.edges[i]->vertices[0]->vertex->v;
     ss << "</text>\n";
   }
 }

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
List details, subscription details or unsubscribe:
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to