[Bf-blender-cvs] [198bcbb4d53] temp-T97352-3d-texturing-seam-bleeding-b2: Fix issue where input mesh wasn't compact.

Jeroen Bakker noreply at git.blender.org
Tue Jun 14 14:57:00 CEST 2022


Commit: 198bcbb4d5336b3ea943642831065decabe315ff
Author: Jeroen Bakker
Date:   Tue Jun 14 14:53:04 2022 +0200
Branches: temp-T97352-3d-texturing-seam-bleeding-b2
https://developer.blender.org/rB198bcbb4d5336b3ea943642831065decabe315ff

Fix issue where input mesh wasn't compact.

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

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 31f0144539a..db32ca18c4f 100644
--- a/source/blender/blenkernel/BKE_uv_islands.hh
+++ b/source/blender/blenkernel/BKE_uv_islands.hh
@@ -125,6 +125,20 @@ struct MeshData {
     init_vertices();
     init_primitives();
     init_edges();
+
+    for (const MeshVertex &v : vertices) {
+      printf("Vert {v%d}\n", v.v);
+      for (const MeshEdge *e : v.edges) {
+        printf("-Edge {v%d v%d}\n", e->vert1->v, e->vert2->v);
+        for (const MeshPrimitive *p : e->primitives) {
+          printf(" -Prim {p%d, v%d v%d v%d}\n",
+                 p->index,
+                 p->vertices[0].vertex->v,
+                 p->vertices[1].vertex->v,
+                 p->vertices[2].vertex->v);
+        }
+      }
+    }
   }
   void init_vertices()
   {
@@ -166,11 +180,12 @@ struct MeshData {
       for (int j = 0; j < 3; j++) {
         int v1 = mloop[tri.tri[j]].v;
         int v2 = mloop[tri.tri[(j + 1) % 3]].v;
+        /* TODO: Use lookup_ptr to be able to store edge 0. */
         void *v = BLI_edgehash_lookup(eh, v1, v2);
         int64_t edge_index;
         if (v == nullptr) {
           edge_index = edges.size();
-          BLI_edgehash_insert(eh, v1, v2, POINTER_FROM_INT(edge_index));
+          BLI_edgehash_insert(eh, v1, v2, POINTER_FROM_INT(edge_index + 1));
           MeshEdge edge;
           edge.vert1 = &vertices[v1];
           edge.vert2 = &vertices[v2];
@@ -180,7 +195,7 @@ struct MeshData {
           vertices[v2].edges.append(edge_ptr);
         }
         else {
-          edge_index = POINTER_AS_INT(v);
+          edge_index = POINTER_AS_INT(v) - 1;
         }
 
         MeshEdge *edge = &edges[edge_index];
@@ -367,6 +382,19 @@ struct UVPrimitive {
     return nullptr;
   }
 
+  UVEdge *get_uv_edge(const MeshVertex *v1, const MeshVertex *v2) const
+  {
+    for (UVEdge *uv_edge : edges) {
+      const MeshVertex *e1 = uv_edge->vertices[0]->vertex;
+      const MeshVertex *e2 = uv_edge->vertices[1]->vertex;
+      if ((e1 == v1 && e2 == v2) || (e1 == v2 && e2 == v1)) {
+        return uv_edge;
+      }
+    }
+    BLI_assert_unreachable();
+    return nullptr;
+  }
+
   UVBorder extract_border() const;
 };
 
@@ -649,7 +677,7 @@ void svg(std::ostream &ss, const UVIslands &islands, int step);
 void svg(std::ostream &ss, const UVPrimitive &primitive);
 void svg(std::ostream &ss, const UVPrimitive &primitive, int step);
 void svg(std::ostream &ss, const UVIslandsMask &mask, int step);
-void svg(std::ostream &ss, const UVBorder &border);
+void svg(std::ostream &ss, const UVBorder &border, int step);
 void svg_footer(std::ostream &ss);
 
 struct UVIslands {
@@ -692,7 +720,7 @@ struct UVIslands {
       for (UVBorder &border : island.borders) {
         border.update_indexes(index);
         index++;
-        svg(of, border);
+        svg(of, border, 0);
       }
     }
     svg_footer(of);
@@ -713,7 +741,7 @@ struct UVIslands {
     svg_header(of);
     for (const UVIsland &island : islands) {
       for (const UVBorder &border : island.borders) {
-        svg(of, border);
+        svg(of, border, 0);
       }
     }
     svg_footer(of);
diff --git a/source/blender/blenkernel/intern/uv_islands.cc b/source/blender/blenkernel/intern/uv_islands.cc
index 4728a3e85f1..fa1c9b379b1 100644
--- a/source/blender/blenkernel/intern/uv_islands.cc
+++ b/source/blender/blenkernel/intern/uv_islands.cc
@@ -384,6 +384,9 @@ static void extend_at_vert(UVIsland &island, UVBorderCorner &corner, const MeshD
   }
   else {
     UVEdge *current_edge = corner.first->edge;
+
+    Vector<UVBorderEdge> new_border_edges;
+
     for (int i = 0; i < num_to_add; i++) {
       float2 old_uv = current_edge->get_other_uv_vertex(uv_vertex->vertex)->uv;
       MeshVertex *shared_edge_vertex =
@@ -425,10 +428,11 @@ static void extend_at_vert(UVIsland &island, UVBorderCorner &corner, const MeshD
 
         segment.flags.found = true;
 
-        /* TODO: should be done based on meshvertex */
         UVPrimitive &new_prim = island.uv_primitives[island.uv_primitives.size() - 1];
-        current_edge = new_prim.get_uv_edge(uv_vertex->uv, new_uv);
-
+        current_edge = new_prim.get_uv_edge(uv_vertex->vertex, other_prim_vertex);
+        UVBorderEdge new_border(new_prim.get_uv_edge(shared_edge_vertex, other_prim_vertex),
+                                &new_prim);
+        new_border_edges.append(new_border);
         break;
       }
     }
@@ -455,7 +459,28 @@ static void extend_at_vert(UVIsland &island, UVBorderCorner &corner, const MeshD
       uv_vertex_template.uv = corner.second->get_uv_vertex(1)->uv;
       UVVertex *vertex_3_ptr = island.lookup_or_create(uv_vertex_template);
       add_uv_primitive_fill(island, *vertex_1_ptr, *vertex_2_ptr, *vertex_3_ptr, *fill_primitive);
+
+      UVPrimitive &new_prim = island.uv_primitives[island.uv_primitives.size() - 1];
+      UVBorderEdge new_border(new_prim.get_uv_edge(shared_edge_vertex, other_prim_vertex),
+                              &new_prim);
+      new_border_edges.append(new_border);
+    }
+
+    int border_index = corner.first->border_index;
+    UVBorder &border = island.borders[border_index];
+    int border_insert = corner.first->index;
+    int border_next = corner.second->index;
+    border.remove(border_insert);
+    if (border_next != 0) {
+      border_next--;
     }
+    border.remove(border_next);
+    for (UVBorderEdge &edge : new_border_edges) {
+      edge.flags.extendable = false;
+    }
+    border.edges.insert(border_insert, new_border_edges);
+
+    border.update_indexes(border_index);
   }
 }
 
@@ -471,6 +496,10 @@ void UVIsland::extend_border(const UVIslandsMask &mask,
   of.open("/tmp/extend.svg");
   svg_header(of);
   svg(of, *this, step++);
+  for (UVBorder &border : borders) {
+    svg(of, border, step);
+  }
+  step++;
 #endif
 
   int64_t border_index = 0;
@@ -480,7 +509,7 @@ void UVIsland::extend_border(const UVIslandsMask &mask,
 
   // Debug setting to reduce the extension to a number of iterations as long as not all corner
   // cases have been implemented.
-  int num_iterations = 7;
+  int num_iterations = 999999;
   while (num_iterations) {
     if (num_iterations == 1) {
       printf("Last iteration");
@@ -498,13 +527,17 @@ void UVIsland::extend_border(const UVIslandsMask &mask,
 
     // TODO: extend
     extend_at_vert(*this, *extension_corner, mesh_data);
-    // validate_border();
+    validate_border();
 
     /* Mark that the vert is extended. Unable to extend twice. */
     extension_corner->second->flags.extendable = false;
     num_iterations--;
 #ifdef DEBUG_SVG
     svg(of, *this, step++);
+    for (UVBorder &border : borders) {
+      svg(of, border, step);
+    }
+    step++;
 #endif
   }
 #ifdef DEBUG_SVG
@@ -926,11 +959,11 @@ void svg(std::ostream &ss, const UVPrimitive &primitive, int step)
   ss << "</g>\n";
 }
 
-void svg(std::ostream &ss, const UVBorder &border)
+void svg(std::ostream &ss, const UVBorder &border, int step)
 {
-  ss << "<g>\n";
+  ss << "<g transform=\"translate(" << step * 1024 << " 0)\">\n";
 
-  ss << " <g stroke=\"lightgrey\">\n";
+  ss << " <g stroke=\"grey\">\n";
   for (const UVBorderEdge &edge : border.edges) {
     float2 v1 = edge.get_uv_vertex(0)->uv;
     float2 v2 = edge.get_uv_vertex(1)->uv;
@@ -939,7 +972,7 @@ void svg(std::ostream &ss, const UVBorder &border)
   }
   ss << " </g>\n";
 
-  ss << " <g fill=\"red\">\n";
+  ss << " <g fill=\"black\">\n";
   for (const UVBorderEdge &edge : border.edges) {
     float2 v1 = edge.get_uv_vertex(0)->uv;
     ss << "       <text x=\"" << svg_x(v1) << "\" y=\"" << svg_y(v1) << "\">"



More information about the Bf-blender-cvs mailing list