[Bf-blender-cvs] [d176c5789b7] temp-T97352-3d-texturing-seam-bleeding-b2: Temp commit before removing UVBorderVert.

Jeroen Bakker noreply at git.blender.org
Tue Jun 7 14:45:24 CEST 2022


Commit: d176c5789b7ac911e83fa789b1b04a3789e03dc3
Author: Jeroen Bakker
Date:   Tue Jun 7 11:37:29 2022 +0200
Branches: temp-T97352-3d-texturing-seam-bleeding-b2
https://developer.blender.org/rBd176c5789b7ac911e83fa789b1b04a3789e03dc3

Temp commit before removing UVBorderVert.

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

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 b90fee409bb..33aecaceca9 100644
--- a/source/blender/blenkernel/BKE_uv_islands.hh
+++ b/source/blender/blenkernel/BKE_uv_islands.hh
@@ -31,6 +31,8 @@ struct MeshPrimitive;
 struct UVPrimitive;
 struct UVPrimitiveEdge;
 struct UVBorder;
+struct UVVertex;
+struct UVEdge;
 
 struct MeshEdge;
 struct MeshPrimitive;
@@ -56,8 +58,8 @@ struct MeshEdge {
 struct MeshPrimitive {
   int64_t index;
   int64_t poly;
-  Vector<MeshEdge *> edges;
-  Vector<MeshUVVert> vertices;
+  Vector<MeshEdge *, 3> edges;
+  Vector<MeshUVVert, 3> vertices;
 
   const MeshUVVert &get_uv_vert(const MeshVertex *vert)
   {
@@ -173,6 +175,9 @@ struct UVVertex {
   /* Position in uv space. */
   float2 uv;
 
+  /* uv edges that are connected to this uvvertex. */
+  Vector<UVEdge *> uv_edges;
+
   explicit UVVertex()
   {
   }
@@ -207,6 +212,13 @@ struct UVEdge {
   {
     return uv_primitives.size() == 1;
   }
+
+  void append_to_uv_vertices()
+  {
+    for (UVVertex *vertex : vertices) {
+      vertex->uv_edges.append_non_duplicates(this);
+    }
+  }
 };
 
 struct UVPrimitive {
@@ -220,6 +232,19 @@ struct UVPrimitive {
   {
   }
 
+  void append_to_uv_edges()
+  {
+    for (UVEdge *uv_edge : edges) {
+      uv_edge->uv_primitives.append_non_duplicates(this);
+    }
+  }
+  void append_to_uv_vertices()
+  {
+    for (UVEdge *uv_edge : edges) {
+      uv_edge->append_to_uv_vertices();
+    }
+  }
+
   Vector<std::pair<UVEdge *, UVEdge *>> shared_edges(UVPrimitive &other)
   {
     Vector<std::pair<UVEdge *, UVEdge *>> result;
@@ -284,10 +309,10 @@ struct UVBorderVert {
 struct UVBorderEdge {
   UVEdge *edge;
   bool tag = false;
-  int64_t uv_prim_index;
+  UVPrimitive *uv_primitive;
 
-  explicit UVBorderEdge(UVEdge *edge, int64_t uv_prim_index)
-      : edge(edge), uv_prim_index(uv_prim_index)
+  explicit UVBorderEdge(UVEdge *edge, UVPrimitive *uv_primitive)
+      : edge(edge), uv_primitive(uv_primitive)
   {
   }
 };
@@ -340,6 +365,7 @@ struct UVIsland {
       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->append_to_uv_vertices();
       uv_edge->uv_primitives.append(uv_primitive_ptr);
     }
     return uv_primitive_ptr;
@@ -355,6 +381,7 @@ struct UVIsland {
 
     uv_vertices.append(vertex);
     UVVertex *result = &uv_vertices.last();
+    result->uv_edges.clear();
     return result;
   }
 
@@ -390,6 +417,7 @@ struct UVIsland {
       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]->append_to_uv_vertices();
       new_prim_ptr->edges[i]->uv_primitives.append(new_prim_ptr);
     }
   }
diff --git a/source/blender/blenkernel/intern/uv_islands.cc b/source/blender/blenkernel/intern/uv_islands.cc
index ce66658e757..58e758a56d7 100644
--- a/source/blender/blenkernel/intern/uv_islands.cc
+++ b/source/blender/blenkernel/intern/uv_islands.cc
@@ -15,7 +15,7 @@ void UVIsland::extract_border()
     UVPrimitive &prim = uv_primitives[prim_index];
     for (UVEdge *edge : prim.edges) {
       if (edge->is_border_edge()) {
-        edges.append(UVBorderEdge(edge, prim_index));
+        edges.append(UVBorderEdge(edge, &prim));
       }
     }
   }
@@ -218,36 +218,84 @@ static void extend_at_vert(UVIsland &island, UVBorderVert &vert, const MeshData
   fan.init_uv_coordinates(vert, island);
   print(fan);
 
-#if 0
-  // add all verts that arent connected to the given border vert to the UVIsland.
-  for (FanTri &tri : fan.tris) {
-    tri.flags.found = false;
-    int2 test_edge(tri.v[0], tri.v[1]);
-    for (UVPrimitive &prim : island.uv_primitives) {
-      for (UVEdge &edge : prim.edges) {
-        if (edge.vertices[0].uv == vert.uv || edge.vertices[1].uv == vert.uv) {
-          int2 o(mesh_data.mloop[edge.vertices[0].loop].v,
-                 mesh_data.mloop[edge.vertices[1].loop].v);
-          if ((test_edge.x == o.x && test_edge.y == o.y) ||
-              (test_edge.x == o.y && test_edge.y == o.x)) {
-            tri.flags.found = true;
-          }
-        }
+  for (FanSegment &segment : fan.segments) {
+    segment.flags.found = false;
+    MeshVertex *v0 = segment.primitive->vertices[segment.vert_order[0]].vertex;
+    MeshVertex *v1 = segment.primitive->vertices[segment.vert_order[1]].vertex;
+    for (UVEdge *edge : vert.uv_vertex->uv_edges) {
+      if ((edge->vertices[0]->vertex == v0 && edge->vertices[1]->vertex == v1) ||
+          (edge->vertices[0]->vertex == v1 && edge->vertices[1]->vertex == v0)) {
+        segment.flags.found = true;
+        break;
       }
     }
   }
   print(fan);
+
   // tag them as being 'not fixed in uv space'. count them and determine a position in uv space.
   // add UV primitives for them.
   // recalc the border.
   int num_to_add = 0;
-  for (FanTri &tri : fan.tris) {
-    if (!tri.flags.found) {
+  for (FanSegment &segment : fan.segments) {
+    if (!segment.flags.found) {
       num_to_add++;
     }
   }
   printf("Found %d new edges to add\n", num_to_add);
 
+  if (num_to_add == 0) {
+    // no new triangles found. In this case we should extend the exising borders.
+    UVBorder &border = island.borders[vert.border_index];
+
+    UVVertex center_vertex;
+    center_vertex.loop = border.verts[vert.next_index].uv_vertex->loop;
+    center_vertex.uv = (border.verts[vert.next_index].uv_vertex->uv +
+                        border.verts[vert.prev_index].uv_vertex->uv) /
+                       2.0f;
+    center_vertex.vertex = border.verts[vert.next_index].uv_vertex->vertex;
+    center_vertex.uv_edges.clear();
+    UVVertex *center_vertex_ptr = island.lookup_or_create(center_vertex);
+
+    // What is the mesh primitive of the next
+
+    UVPrimitive prim1(0);
+    UVEdge edge_template;
+    edge_template.vertices[0] = border.verts[vert.index].uv_vertex;
+    edge_template.vertices[1] = border.verts[vert.prev_index].uv_vertex;
+    prim1.edges.append(island.lookup_or_create(edge_template));
+    edge_template.vertices[0] = border.verts[vert.prev_index].uv_vertex;
+    edge_template.vertices[1] = center_vertex_ptr;
+    prim1.edges.append(island.lookup_or_create(edge_template));
+    edge_template.vertices[0] = center_vertex_ptr;
+    edge_template.vertices[1] = border.verts[vert.index].uv_vertex;
+    prim1.edges.append(island.lookup_or_create(edge_template));
+    prim1.append_to_uv_edges();
+    prim1.append_to_uv_vertices();
+    island.uv_primitives.append(prim1);
+
+#if 0
+    prim1.edges[0].vertices[0].uv = border.verts[vert.index].uv;
+    prim1.edges[0].vertices[1].uv = border.verts[vert.prev_index].uv;
+    prim1.edges[1].vertices[0].uv = border.verts[vert.prev_index].uv;
+    prim1.edges[1].vertices[1].uv = center_uv;
+    prim1.edges[2].vertices[0].uv = center_uv;
+    prim1.edges[2].vertices[1].uv = border.verts[vert.index].uv;
+    island.uv_primitives.append(prim1);
+
+    UVPrimitive prim2(0);
+    prim2.edges[0].vertices[0].uv = border.verts[vert.index].uv;
+    prim2.edges[0].vertices[1].uv = center_uv;
+    prim2.edges[1].vertices[0].uv = center_uv;
+    prim2.edges[1].vertices[1].uv = border.verts[vert.next_index].uv;
+    prim2.edges[2].vertices[0].uv = border.verts[vert.next_index].uv;
+    prim2.edges[2].vertices[1].uv = border.verts[vert.index].uv;
+    island.uv_primitives.append(prim2);
+#endif
+  }
+  else {
+  }
+#if 0
+
   if (num_to_add > 0) {
     UVBorder &border = island.borders[vert.border_index];
     int i = 0;
@@ -355,7 +403,7 @@ void UVIsland::extend_border(const UVIslandsMask &mask,
   svg(of, *this, step++);
 #endif
 
-  int i = 5;
+  int i = 1;
   while (i) {
     int64_t border_index = 0;
     for (UVBorder &border : borders) {
@@ -717,9 +765,11 @@ void svg(std::ostream &ss, const UVPrimitive &primitive)
     }
   }
   center /= 3 * 2;
-  ss << "<text x=\"" << center.x * 1024 << "\"";
-  ss << " y=\"" << center.y * 1024 << "\">";
-  ss << primitive.primitive->index;
+  if (primitive.primitive) {
+    ss << "<text x=\"" << center.x * 1024 << "\"";
+    ss << " y=\"" << center.y * 1024 << "\">";
+    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;



More information about the Bf-blender-cvs mailing list