[Bf-blender-cvs] [213145ba3a2] temp-T97352-3d-texturing-seam-bleeding-b2: Fix extending when corner verts are different.

Jeroen Bakker noreply at git.blender.org
Wed Jun 15 14:29:25 CEST 2022


Commit: 213145ba3a2b7c7e86c4b77e0dbecbf846f16c77
Author: Jeroen Bakker
Date:   Wed Jun 15 13:47:45 2022 +0200
Branches: temp-T97352-3d-texturing-seam-bleeding-b2
https://developer.blender.org/rB213145ba3a2b7c7e86c4b77e0dbecbf846f16c77

Fix extending when corner verts are different.

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

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 6690b856ae9..caf18a2b29b 100644
--- a/source/blender/blenkernel/BKE_uv_islands.hh
+++ b/source/blender/blenkernel/BKE_uv_islands.hh
@@ -521,6 +521,13 @@ struct UVBorder {
 
   void update_indexes(uint64_t border_index);
 
+  /**
+   * Mark edges not extendable when they don't share the same vertex.
+   *
+   * No solutions exists (yet) when the vertexes are different.
+   */
+  void update_extendability();
+
   static std::optional<UVBorder> extract_from_edges(Vector<UVBorderEdge> &edges);
 
   void validate() const;
@@ -771,8 +778,12 @@ struct UVIslands {
 
   void extend_borders(const UVIslandsMask &islands_mask, const MeshData &mesh_data)
   {
+    printf("Extending borders\n");
+    printf("=================\n");
     ushort index = 0;
     for (UVIsland &island : islands) {
+      printf("Island %d\n", index);
+      printf("---------\n");
       island.extend_border(islands_mask, index++, mesh_data);
     }
 
diff --git a/source/blender/blenkernel/intern/uv_islands.cc b/source/blender/blenkernel/intern/uv_islands.cc
index 59df6cd7a18..ebc2248634b 100644
--- a/source/blender/blenkernel/intern/uv_islands.cc
+++ b/source/blender/blenkernel/intern/uv_islands.cc
@@ -29,7 +29,7 @@ void UVIsland::extract_borders()
     if (!border.has_value()) {
       break;
     }
-    if (border->is_ccw()) {
+    if (!border->is_ccw()) {
       border->flip();
     }
     borders.append(*border);
@@ -135,7 +135,6 @@ struct Fan {
           break;
         }
       }
-      printf("%lld %lld (%p)\n", stop_primitive->index, previous_primitive->index, current_edge);
       if (stop_primitive == previous_primitive) {
         break;
       }
@@ -318,6 +317,9 @@ static void add_uv_primitive_fill(UVIsland &island,
 
 static void extend_at_vert(UVIsland &island, UVBorderCorner &corner, const MeshData &mesh_data)
 {
+  int border_index = corner.first->border_index;
+  UVBorder &border = island.borders[border_index];
+
   UVVertex *uv_vertex = corner.second->get_uv_vertex(0);
   Fan fan(*(uv_vertex->vertex));
   fan.init_uv_coordinates(*uv_vertex, island);
@@ -331,58 +333,47 @@ static void extend_at_vert(UVIsland &island, UVBorderCorner &corner, const MeshD
   printf("Found %d new edges to add\n", num_to_add);
 
   if (num_to_add == 0) {
+    MeshPrimitive *fill_primitive_1 = corner.second->uv_primitive->primitive;
+    MeshPrimitive *fill_primitive_2 = corner.first->uv_primitive->primitive;
+
     MeshPrimitive *fill_primitive = find_fill_border(corner);
+    // Although the fill_primitive can fill the missing segment it could lead to a squashed
+    // triangle when the corner angle is near 180 degrees. In order to fix this we will
+    // always add two segments both using the found fill primitive.
     if (fill_primitive) {
-      add_uv_primitive_fill(island,
-                            *corner.first->get_uv_vertex(0),
-                            *corner.first->get_uv_vertex(1),
-                            *corner.second->get_uv_vertex(1),
-                            *fill_primitive);
-      // Update border, remove second.
-
-      UVPrimitive &new_prim = island.uv_primitives[island.uv_primitives.size() - 1];
+      fill_primitive_1 = fill_primitive;
+      fill_primitive_2 = fill_primitive;
+    }
+
+    float2 center_uv = corner.uv(0.5f);
+    printf(" - add new projection for {%lld}\n", fill_primitive_1->index);
+    add_uv_primitive_shared_uv_edge(island,
+                                    corner.first->get_uv_vertex(1),
+                                    corner.first->get_uv_vertex(0),
+                                    center_uv,
+                                    fill_primitive_1);
+    printf(" - add new projection for {%lld}\n", fill_primitive_2->index);
+    add_uv_primitive_shared_uv_edge(island,
+                                    corner.second->get_uv_vertex(0),
+                                    corner.second->get_uv_vertex(1),
+                                    center_uv,
+                                    fill_primitive_2);
+    /* Update border after adding the new geometry. */
+    {
+      UVPrimitive &new_prim = island.uv_primitives[island.uv_primitives.size() - 2];
       UVBorderEdge *border_edge = corner.first;
       border_edge->uv_primitive = &new_prim;
       border_edge->edge = border_edge->uv_primitive->get_uv_edge(
-          corner.first->get_uv_vertex(0)->uv, corner.second->get_uv_vertex(1)->uv);
-      border_edge->reverse_order = border_edge->edge->vertices[0] ==
-                                   corner.second->get_uv_vertex(1);
-      island.borders[corner.second->border_index].remove(corner.second->index);
+          corner.first->get_uv_vertex(0)->uv, center_uv);
+      border_edge->reverse_order = border_edge->edge->vertices[0]->uv == center_uv;
     }
-    else {
-      float2 center_uv = corner.uv(0.5f);
-      // no new triangles found. In this case we should extend the existing borders.
-      printf(" - add new projection for {%lld}\n", corner.second->uv_primitive->primitive->index);
-      add_uv_primitive_shared_uv_edge(island,
-                                      corner.first->get_uv_vertex(1),
-                                      corner.first->get_uv_vertex(0),
-                                      center_uv,
-                                      corner.second->uv_primitive->primitive);
-      printf(" - add new projection for {%lld}\n", corner.first->uv_primitive->primitive->index);
-      add_uv_primitive_shared_uv_edge(island,
-                                      corner.second->get_uv_vertex(0),
-                                      corner.second->get_uv_vertex(1),
-                                      center_uv,
-                                      corner.first->uv_primitive->primitive);
-
-      /* Update border after adding the new geometry. */
-
-      {
-        UVPrimitive &new_prim = island.uv_primitives[island.uv_primitives.size() - 2];
-        UVBorderEdge *border_edge = corner.first;
-        border_edge->uv_primitive = &new_prim;
-        border_edge->edge = border_edge->uv_primitive->get_uv_edge(
-            corner.first->get_uv_vertex(0)->uv, center_uv);
-        border_edge->reverse_order = border_edge->edge->vertices[0]->uv == center_uv;
-      }
-      {
-        UVPrimitive &new_prim = island.uv_primitives[island.uv_primitives.size() - 1];
-        UVBorderEdge *border_edge = corner.second;
-        border_edge->uv_primitive = &new_prim;
-        border_edge->edge = border_edge->uv_primitive->get_uv_edge(
-            corner.second->get_uv_vertex(1)->uv, center_uv);
-        border_edge->reverse_order = border_edge->edge->vertices[1]->uv == center_uv;
-      }
+    {
+      UVPrimitive &new_prim = island.uv_primitives[island.uv_primitives.size() - 1];
+      UVBorderEdge *border_edge = corner.second;
+      border_edge->uv_primitive = &new_prim;
+      border_edge->edge = border_edge->uv_primitive->get_uv_edge(
+          corner.second->get_uv_vertex(1)->uv, center_uv);
+      border_edge->reverse_order = border_edge->edge->vertices[1]->uv == center_uv;
     }
   }
   else {
@@ -469,8 +460,6 @@ static void extend_at_vert(UVIsland &island, UVBorderCorner &corner, const MeshD
       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);
@@ -478,13 +467,13 @@ static void extend_at_vert(UVIsland &island, UVBorderCorner &corner, const MeshD
       border_next--;
     }
     border.remove(border_next);
-    for (UVBorderEdge &edge : new_border_edges) {
-      edge.flags.extendable = false;
-    }
+    border_insert = min_ii(border_insert, border.edges.size() - 1);
     border.edges.insert(border_insert, new_border_edges);
 
     border.update_indexes(border_index);
   }
+
+  border.update_extendability();
 }
 
 void UVIsland::extend_border(const UVIslandsMask &mask,
@@ -512,10 +501,11 @@ 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 = 999999;
+  int num_iterations = 99999;
   while (num_iterations) {
+    printf("**iterations left %d**\n", num_iterations);
     if (num_iterations == 1) {
-      printf("Last iteration");
+      printf("Last iteration\n");
     }
     std::optional<UVBorderCorner> extension_corner = sharpest_border_corner(*this);
     if (!extension_corner.has_value()) {
@@ -642,6 +632,16 @@ void UVBorder::update_indexes(uint64_t border_index)
   }
 }
 
+void UVBorder::update_extendability()
+{
+  for (UVBorderEdge &edge : edges) {
+    UVBorderEdge &prev_edge = edges[edge.prev_index];
+    if (prev_edge.get_uv_vertex(1) != edge.get_uv_vertex(0)) {
+      edge.flags.extendable = false;
+    }
+  }
+}
+
 void UVBorder::validate() const
 {
   for (const UVBorderEdge &edge : edges) {
@@ -908,10 +908,10 @@ void svg(std::ostream &ss, const UVIslandsMask &mask, int step)
       if (x > 0 && mask.mask[offset] == mask.mask[offset2]) {
         continue;
       }
-      float2 start = float2(float(x), float(y)) / resolution * float2(1024, 1024);
-      float2 end = float2(float(x), float(y + 1)) / resolution * float2(1024, 1024);
-      ss << "       <line x1=\"" << start.x << "\" y1=\"" << start.y << "\" x2=\"" << end.x
-         << "\" y2=\"" << end.y << "\"/>\n";
+      float2 start = float2(float(x), float(y)) / resolution;
+      float2 end = float2(float(x), float(y + 1)) / resolution;
+      ss << "       <line x1=\"" << svg_x(start) << "\" y1=\"" << svg_y(start) << "\" x2=\""
+         << svg_x(end) << "\" y2=\"" << svg_y(end) << "\"/>\n";
     }
   }
 
@@ -925,10 +925,10 @@ void svg(std::ostream &ss, const UVIslandsMask &mask, int step)
       if (y > 0 && mask.mask[offset] == mask.mask[offset2]) {
         continue;
       }
-      float2 start = float2(float(x), float(y)) / resolution * float2(1024, 1024);
-      float2 end = float2(float(x + 1), float(y)) / resol

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list