[Bf-blender-cvs] [e97c6511fbd] temp-T97352-3d-texturing-seam-bleeding-b2: Added more debug statements.

Jeroen Bakker noreply at git.blender.org
Fri Jun 10 15:35:36 CEST 2022


Commit: e97c6511fbda6bacbcd5e4ee1ffdd43f70bf1760
Author: Jeroen Bakker
Date:   Fri Jun 10 15:34:03 2022 +0200
Branches: temp-T97352-3d-texturing-seam-bleeding-b2
https://developer.blender.org/rBe97c6511fbda6bacbcd5e4ee1ffdd43f70bf1760

Added more debug statements.

There seems to be some data mismatch that corrupts some UVPrimitives.
The corrupted UVPrimitives don't point to the same geometric primitives
it was generated from.
This doesn't happen in the first iteration, but when generating a derivative
from another derivative.

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

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 a9864d4286a..4a07077d816 100644
--- a/source/blender/blenkernel/BKE_uv_islands.hh
+++ b/source/blender/blenkernel/BKE_uv_islands.hh
@@ -75,6 +75,8 @@ struct MeshPrimitive {
 
   MeshUVVert *get_other_uv_vertex(const MeshVertex *v1, const MeshVertex *v2)
   {
+    BLI_assert(vertices[0].vertex == v1 || vertices[1].vertex == v1 || vertices[2].vertex == v1);
+    BLI_assert(vertices[0].vertex == v2 || vertices[1].vertex == v2 || vertices[2].vertex == v2);
     for (MeshUVVert &uv_vertex : vertices) {
       if (uv_vertex.vertex != v1 && uv_vertex.vertex != v2) {
         return &uv_vertex;
@@ -396,6 +398,8 @@ struct UVBorder {
   void update_indexes(uint64_t border_index);
 
   static std::optional<UVBorder> extract_from_edges(Vector<UVBorderEdge> &edges);
+
+  void validate() const;
 };
 
 struct UVIsland {
@@ -527,6 +531,51 @@ struct UVIsland {
       append(other_prim);
     }
   }
+
+  void validate_primitives() const
+  {
+    /* Each UVPrimitive that points to the same mesh primitive should contain the same mesh
+     * vertices (and can be retrieved in the same order). */
+    for (const UVPrimitive &prim_a : uv_primitives) {
+      validate_primitive(prim_a);
+    }
+  }
+  void validate_primitive(const UVPrimitive &prim_a) const
+  {
+    /* Each UVPrimitive that points to the same mesh primitive should contain the same mesh
+     * vertices (and can be retrieved in the same order). */
+    for (const UVPrimitive &prim_b : uv_primitives) {
+      if (prim_a.primitive != prim_b.primitive) {
+        continue;
+      }
+      for (int i = 0; i < 3; i++) {
+        const UVVertex *v1 = prim_a.get_uv_vertex(i);
+        const UVVertex *v2 = prim_b.get_uv_vertex(i);
+        BLI_assert(v1->vertex->v == v2->vertex->v);
+      }
+    }
+  }
+
+  void validate_border() const
+  {
+    /* Each UVPrimitive that points to the same mesh primitive should contain the same mesh
+     * vertices (and can be retrieved in the same order). */
+    for (const UVPrimitive &prim_a : uv_primitives) {
+      for (const UVPrimitive &prim_b : uv_primitives) {
+        if (prim_a.primitive != prim_b.primitive) {
+          continue;
+        }
+        for (int i = 0; i < 3; i++) {
+          const UVVertex *v1 = prim_a.get_uv_vertex(i);
+          const UVVertex *v2 = prim_b.get_uv_vertex(i);
+          BLI_assert(v1->vertex->v == v2->vertex->v);
+        }
+      }
+    }
+    for (const UVBorder &border : borders) {
+      border.validate();
+    }
+  }
 };
 
 /* Debug functions to export to a SVG file. */
diff --git a/source/blender/blenkernel/intern/uv_islands.cc b/source/blender/blenkernel/intern/uv_islands.cc
index eb83218301c..54d89682386 100644
--- a/source/blender/blenkernel/intern/uv_islands.cc
+++ b/source/blender/blenkernel/intern/uv_islands.cc
@@ -219,7 +219,7 @@ static void extend_at_vert(UVIsland &island, UVBorderCorner &corner, const MeshD
     float2 center_uv = corner.uv(0.5f);
     // no new triangles found. In this case we should extend the existing borders.
     UVVertex center_vertex;
-    center_vertex.loop = uv_vertex->loop;
+    center_vertex.loop = -1;
     center_vertex.uv = center_uv;
     center_vertex.uv_edges.clear();
     {
@@ -244,14 +244,7 @@ static void extend_at_vert(UVIsland &island, UVBorderCorner &corner, const MeshD
       prim1.append_to_uv_edges();
       prim1.append_to_uv_vertices();
       island.uv_primitives.append(prim1);
-
-      /* Update border */
-      UVPrimitive &new_prim = island.uv_primitives.last();
-      UVEdge *new_edge = new_prim.edges[1];
-      UVBorderEdge *border_edge = corner.first;
-      border_edge->uv_primitive = &new_prim;
-      border_edge->edge = new_edge;
-      border_edge->reverse_order = new_edge->vertices[0]->uv == center_vertex_ptr->uv;
+      island.validate_primitive(island.uv_primitives.last());
     }
     {
       MeshPrimitive *mesh_primitive = corner.first->uv_primitive->primitive;
@@ -275,14 +268,27 @@ static void extend_at_vert(UVIsland &island, UVBorderCorner &corner, const MeshD
       prim1.append_to_uv_edges();
       prim1.append_to_uv_vertices();
       island.uv_primitives.append(prim1);
+      island.validate_primitive(island.uv_primitives.last());
+    }
 
-      /* Update border */
-      UVPrimitive &new_prim = island.uv_primitives.last();
-      UVEdge *new_edge = new_prim.edges[1];
-      UVBorderEdge *border_edge = corner.second;
-      border_edge->uv_primitive = &new_prim;
-      border_edge->edge = new_edge;
-      border_edge->reverse_order = new_edge->vertices[1]->uv == center_vertex_ptr->uv;
+    /* Update border after adding the new geometry. */
+    {
+      {
+        UVPrimitive &new_prim = island.uv_primitives[island.uv_primitives.size() - 2];
+        UVEdge *new_edge = new_prim.edges[1];
+        UVBorderEdge *border_edge = corner.first;
+        border_edge->uv_primitive = &new_prim;
+        border_edge->edge = new_edge;
+        border_edge->reverse_order = new_edge->vertices[0]->uv == center_uv;
+      }
+      {
+        UVPrimitive &new_prim = island.uv_primitives[island.uv_primitives.size() - 1];
+        UVEdge *new_edge = new_prim.edges[2];
+        UVBorderEdge *border_edge = corner.second;
+        border_edge->uv_primitive = &new_prim;
+        border_edge->edge = new_edge;
+        border_edge->reverse_order = new_edge->vertices[1]->uv == center_uv;
+      }
     }
   }
   else {
@@ -323,8 +329,13 @@ void UVIsland::extend_border(const UVIslandsMask &mask,
     border.update_indexes(border_index++);
   }
 
-  int i = 4;
-  while (i) {
+  // Debug setting to reduce the extension to a number of iterations as long as not all corner
+  // cases have been implemented.
+  int num_iterations = 5;
+  while (num_iterations) {
+    if (num_iterations == 1) {
+      printf("");
+    }
     std::optional<UVBorderCorner> extension_corner = sharpest_border_corner(*this);
     if (!extension_corner.has_value()) {
       break;
@@ -338,10 +349,11 @@ void UVIsland::extend_border(const UVIslandsMask &mask,
 
     // TODO: extend
     extend_at_vert(*this, *extension_corner, mesh_data);
+    validate_border();
 
     /* Mark that the vert is extended. Unable to extend twice. */
     extension_corner->second->flags.extendable = false;
-    i--;
+    num_iterations--;
 #ifdef DEBUG_SVG
     svg(of, *this, step++);
 #endif
@@ -428,6 +440,22 @@ void UVBorder::update_indexes(uint64_t border_index)
   }
 }
 
+void UVBorder::validate() const
+{
+  for (const UVBorderEdge &edge : edges) {
+    float2 uv1 = edge.get_uv_vertex(0)->uv;
+    float2 uv2 = edge.get_uv_vertex(1)->uv;
+    std::cout << uv1;
+    std::cout << "->";
+    std::cout << uv2;
+    std::cout << "\n";
+  }
+  for (const UVBorderEdge &edge : edges) {
+    BLI_assert(edges[edge.prev_index].get_uv_vertex(1)->uv == edge.get_uv_vertex(0)->uv);
+    BLI_assert(edge.get_uv_vertex(1)->uv == edges[edge.next_index].get_uv_vertex(0)->uv);
+  }
+}
+
 /** \} */
 
 /* -------------------------------------------------------------------- */



More information about the Bf-blender-cvs mailing list