[Bf-blender-cvs] [1ce7fbca5e1] temp-pbvh-seam-texturing-tweaks: Remove MeshUVVert, use loop indices instead of "UV verts"

Hans Goudey noreply at git.blender.org
Wed Sep 28 05:04:27 CEST 2022


Commit: 1ce7fbca5e169b3073c2138216ba75cf6f1dff74
Author: Hans Goudey
Date:   Tue Sep 27 21:51:40 2022 -0500
Branches: temp-pbvh-seam-texturing-tweaks
https://developer.blender.org/rB1ce7fbca5e169b3073c2138216ba75cf6f1dff74

Remove MeshUVVert, use loop indices instead of "UV verts"

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

M	source/blender/blenkernel/intern/pbvh_pixels.cc
M	source/blender/blenkernel/intern/pbvh_uv_islands.cc
M	source/blender/blenkernel/intern/pbvh_uv_islands.hh

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

diff --git a/source/blender/blenkernel/intern/pbvh_pixels.cc b/source/blender/blenkernel/intern/pbvh_pixels.cc
index 538a3b5618e..59a2c6c9234 100644
--- a/source/blender/blenkernel/intern/pbvh_pixels.cc
+++ b/source/blender/blenkernel/intern/pbvh_pixels.cc
@@ -107,9 +107,9 @@ static void update_geom_primitives(PBVH &pbvh, const uv_islands::MeshData &mesh_
   PBVHData &pbvh_data = BKE_pbvh_pixels_data_get(pbvh);
   pbvh_data.clear_data();
   for (const uv_islands::MeshPrimitive &mesh_primitive : mesh_data.primitives) {
-    pbvh_data.geom_primitives.append(int3(mesh_primitive.vertices[0].vertex,
-                                          mesh_primitive.vertices[1].vertex,
-                                          mesh_primitive.vertices[2].vertex));
+    pbvh_data.geom_primitives.append(int3(mesh_data.loops[mesh_primitive.loops[0]].v,
+                                          mesh_data.loops[mesh_primitive.loops[1]].v,
+                                          mesh_data.loops[mesh_primitive.loops[2]].v));
   }
 }
 
@@ -149,7 +149,6 @@ struct EncodePixelsUserData {
   ImageUser *image_user;
   PBVH *pbvh;
   Vector<PBVHNode *> *nodes;
-  const MLoopUV *ldata_uv;
   const uv_islands::UVIslandsMask *uv_masks;
   /** Lookup to retrieve the UV primitives based on the primitive index. */
   const UVPrimitiveLookup *uv_primitive_lookup;
@@ -358,16 +357,16 @@ static void update_pixels(PBVH *pbvh, Mesh *mesh, Image *image, ImageUser *image
     return;
   }
 
-  const MLoopUV *ldata_uv = static_cast<const MLoopUV *>(
-      CustomData_get_layer(&mesh->ldata, CD_MLOOPUV));
-  if (ldata_uv == nullptr) {
+  const StringRef active_uv_name = CustomData_get_active_layer_name(&mesh->ldata, CD_MLOOPUV);
+  if (active_uv_name.is_empty()) {
     return;
   }
 
-  uv_islands::MeshData mesh_data({pbvh->looptri, pbvh->totprim},
-                                 {pbvh->mloop, mesh->totloop},
-                                 pbvh->totvert,
-                                 {ldata_uv, mesh->totloop});
+  const AttributeAccessor attributes = mesh->attributes();
+  const VArraySpan<float2> uv_map = attributes.lookup<float2>(active_uv_name, ATTR_DOMAIN_CORNER);
+
+  uv_islands::MeshData mesh_data(
+      {pbvh->looptri, pbvh->totprim}, {pbvh->mloop, mesh->totloop}, pbvh->totvert, uv_map);
   uv_islands::UVIslands islands(mesh_data);
 
   uv_islands::UVIslandsMask uv_masks;
@@ -397,7 +396,6 @@ static void update_pixels(PBVH *pbvh, Mesh *mesh, Image *image, ImageUser *image
   user_data.pbvh = pbvh;
   user_data.image = image;
   user_data.image_user = image_user;
-  user_data.ldata_uv = ldata_uv;
   user_data.nodes = &nodes_to_update;
   user_data.uv_primitive_lookup = &uv_primitive_lookup;
   user_data.uv_masks = &uv_masks;
diff --git a/source/blender/blenkernel/intern/pbvh_uv_islands.cc b/source/blender/blenkernel/intern/pbvh_uv_islands.cc
index cb7ce9e9ad0..41bc2510b62 100644
--- a/source/blender/blenkernel/intern/pbvh_uv_islands.cc
+++ b/source/blender/blenkernel/intern/pbvh_uv_islands.cc
@@ -31,24 +31,26 @@ static void uv_primitive_append_to_uv_vertices(UVPrimitive &uv_primitive)
 /** \name MeshPrimitive
  * \{ */
 
-int MeshPrimitive::get_other_uv_vertex(const int v1, const int v2) const
-{
-  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 (const MeshUVVert &uv_vertex : vertices) {
-    if (uv_vertex.vertex != v1 && uv_vertex.vertex != v2) {
-      return uv_vertex.vertex;
+int MeshPrimitive::get_other_uv_vertex(const MeshData &mesh_data, const int v1, const int v2) const
+{
+  const Span<MLoop> mesh_loops = mesh_data.loops;
+  BLI_assert(ELEM(v1, mesh_loops[loops[0]].v, mesh_loops[loops[1]].v, mesh_loops[loops[2]].v));
+  BLI_assert(ELEM(v2, mesh_loops[loops[0]].v, mesh_loops[loops[1]].v, mesh_loops[loops[2]].v));
+  for (const int loop : loops) {
+    const int vert = mesh_loops[loop].v;
+    if (vert != v1 && vert != v2) {
+      return vert;
     }
   }
   return -1;
 }
 
-bool MeshPrimitive::has_shared_uv_edge(const MeshPrimitive &other) const
+bool MeshPrimitive::has_shared_uv_edge(const Span<float2> uv_map, const MeshPrimitive &other) const
 {
   int shared_uv_verts = 0;
-  for (const MeshUVVert &vert : vertices) {
-    for (const MeshUVVert &other_vert : other.vertices) {
-      if (vert.uv == other_vert.uv) {
+  for (const int loop : loops) {
+    for (const int other_loop : other.loops) {
+      if (uv_map[loop] == uv_map[other_loop]) {
         shared_uv_verts += 1;
       }
     }
@@ -56,33 +58,38 @@ bool MeshPrimitive::has_shared_uv_edge(const MeshPrimitive &other) const
   return shared_uv_verts >= 2;
 }
 
-static const MeshUVVert &get_uv_vert(const MeshPrimitive &mesh_primitive, const int vert)
+static int get_uv_loop(const MeshData &mesh_data,
+                       const MeshPrimitive &mesh_primitive,
+                       const int vert)
 {
-  for (const MeshUVVert &uv_vert : mesh_primitive.vertices) {
-    if (uv_vert.vertex == vert) {
-      return uv_vert;
+  for (const int loop : mesh_primitive.loops) {
+    if (mesh_data.loops[loop].v == vert) {
+      return loop;
     }
   }
   BLI_assert_unreachable();
-  return mesh_primitive.vertices[0];
+  return mesh_primitive.loops[0];
 }
 
-static bool has_vertex(const MeshPrimitive &mesh_primitive, const int vert)
+static bool has_vertex(const MeshData &mesh_data,
+                       const MeshPrimitive &mesh_primitive,
+                       const int vert)
 {
   for (int i = 0; i < 3; i++) {
-    if (mesh_primitive.vertices[i].vertex == vert) {
+    const int vert_i = mesh_data.loops[mesh_primitive.loops[i]].v;
+    if (vert_i == vert) {
       return true;
     }
   }
   return false;
 }
 
-rctf MeshPrimitive::uv_bounds() const
+rctf MeshPrimitive::uv_bounds(const Span<float2> uv_map) const
 {
   rctf result;
   BLI_rctf_init_minmax(&result);
-  for (const MeshUVVert &uv_vertex : vertices) {
-    BLI_rctf_do_minmax_v(&result, uv_vertex.uv);
+  for (const int loop : loops) {
+    BLI_rctf_do_minmax_v(&result, uv_map[loop]);
   }
   return result;
 }
@@ -103,11 +110,7 @@ static void mesh_data_init_primitives(MeshData &mesh_data)
     primitive.poly = tri.poly;
 
     for (int j = 0; j < 3; j++) {
-      MeshUVVert uv_vert;
-      uv_vert.loop = tri.tri[j];
-      uv_vert.vertex = mesh_data.loops[uv_vert.loop].v;
-      uv_vert.uv = mesh_data.mloopuv[uv_vert.loop].uv;
-      primitive.vertices.append(uv_vert);
+      primitive.loops.append(tri.tri[j]);
     }
     mesh_data.primitives.append(primitive);
   }
@@ -175,7 +178,7 @@ static void extract_uv_neighbors(const MeshData &mesh_data,
       }
 
       const MeshPrimitive &other_primitive = mesh_data.primitives[other_primitive_i];
-      if (primitive.has_shared_uv_edge(other_primitive)) {
+      if (primitive.has_shared_uv_edge(mesh_data.uv_map, other_primitive)) {
         prims_to_add.append(other_primitive_i);
       }
     }
@@ -217,11 +220,11 @@ static void mesh_data_init(MeshData &mesh_data)
 MeshData::MeshData(const Span<MLoopTri> looptris,
                    const Span<MLoop> loops,
                    const int verts_num,
-                   const Span<MLoopUV> mloopuv)
+                   const Span<float2> uv_map)
     : looptris(looptris),
       verts_num(verts_num),
       loops(loops),
-      mloopuv(mloopuv),
+      uv_map(uv_map),
       vert_to_edge_map(verts_num),
       edge_to_primitive_map(0)
 {
@@ -245,7 +248,8 @@ UVVertex::UVVertex()
   uv_vertex_init_flags(*this);
 }
 
-UVVertex::UVVertex(const MeshUVVert &vert) : vertex(vert.vertex), uv(vert.uv)
+UVVertex::UVVertex(const MeshData &mesh_data, const int loop)
+    : vertex(mesh_data.loops[loop].v), uv(mesh_data.uv_map[loop])
 {
   uv_vertex_init_flags(*this);
 }
@@ -256,10 +260,10 @@ UVVertex::UVVertex(const MeshUVVert &vert) : vertex(vert.vertex), uv(vert.uv)
 /** \name UVEdge
  * \{ */
 
-bool UVEdge::has_shared_edge(const MeshUVVert &v1, const MeshUVVert &v2) const
+bool UVEdge::has_shared_edge(const Span<float2> uv_map, const int loop_1, const int loop_2) const
 {
-  return (vertices[0]->uv == v1.uv && vertices[1]->uv == v2.uv) ||
-         (vertices[0]->uv == v2.uv && vertices[1]->uv == v1.uv);
+  return (vertices[0]->uv == uv_map[loop_1] && vertices[1]->uv == uv_map[loop_2]) ||
+         (vertices[0]->uv == uv_map[loop_2] && vertices[1]->uv == uv_map[loop_1]);
 }
 
 bool UVEdge::has_shared_edge(const UVVertex &v1, const UVVertex &v2) const
@@ -391,11 +395,11 @@ bool UVIsland::has_shared_edge(const UVPrimitive &primitive) const
   return false;
 }
 
-bool UVIsland::has_shared_edge(const MeshPrimitive &primitive) const
+bool UVIsland::has_shared_edge(const Span<float2> uv_map, const MeshPrimitive &primitive) const
 {
   for (const VectorList<UVPrimitive>::UsedVector &primitives : uv_primitives) {
     for (const UVPrimitive &prim : primitives) {
-      if (prim.has_shared_edge(primitive)) {
+      if (prim.has_shared_edge(uv_map, primitive)) {
         return true;
       }
     }
@@ -424,11 +428,11 @@ static UVPrimitive *add_primitive(const MeshData &mesh_data,
   UVPrimitive *uv_primitive_ptr = &uv_island.uv_primitives.last();
   for (const int edge_i : primitive.edges) {
     const MeshEdge &edge = mesh_data.edges[edge_i];
-    const MeshUVVert &v1 = get_uv_vert(primitive, edge.vert1);
-    const MeshUVVert &v2 = get_uv_vert(primitive, edge.vert2);
+    const int loop_1 = get_uv_loop(mesh_data, primitive, edge.vert1);
+    const int loop_2 = get_uv_loop(mesh_data, primitive, edge.vert2);
     UVEdge uv_edge_template;
-    uv_edge_template.vertices[0] = uv_island.lookup_or_create(UVVertex(v1));
-    uv_edge_template.vertices[1] = uv_island.lookup_or_create(UVVertex(v2));
+    uv_edge_template.vertices[0] = uv_island.lookup_or_create(UVVertex(mesh_data, loop_1));
+    uv_edge_template.vertices[1] = uv_island.lookup_or_create(UVVertex(mesh_data, loop_2));
     UVEdge *uv_edge = uv_island.lookup_or_create(uv_edge_template);
     uv_primitive_ptr->edges.append(uv_edge);
     uv_edge_append_to_uv_vertices(*uv_edge);
@@ -509,23 +513,24 @@ struct InnerEdge {
     bool found : 1;
   } flags;
 
-  InnerEdge(const Mesh

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list