[Bf-blender-cvs] [54dae0fb3cd] temp-pbvh-seam-texturing-tweaks: Remove MeshVertex, use indices for edges and primitives

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


Commit: 54dae0fb3cdf907162dd0b6cb4b3e0c156889f98
Author: Hans Goudey
Date:   Tue Sep 27 21:07:36 2022 -0500
Branches: temp-pbvh-seam-texturing-tweaks
https://developer.blender.org/rB54dae0fb3cdf907162dd0b6cb4b3e0c156889f98

Remove MeshVertex, use indices for edges and primitives

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

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 5cb1b9374c0..538a3b5618e 100644
--- a/source/blender/blenkernel/intern/pbvh_pixels.cc
+++ b/source/blender/blenkernel/intern/pbvh_pixels.cc
@@ -1,6 +1,7 @@
 /* SPDX-License-Identifier: GPL-2.0-or-later
  * Copyright 2022 Blender Foundation. All rights reserved. */
 
+#include "BKE_attribute.hh"
 #include "BKE_customdata.h"
 #include "BKE_mesh.h"
 #include "BKE_mesh_mapping.h"
@@ -106,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->v,
-                                          mesh_primitive.vertices[1].vertex->v,
-                                          mesh_primitive.vertices[2].vertex->v));
+    pbvh_data.geom_primitives.append(int3(mesh_primitive.vertices[0].vertex,
+                                          mesh_primitive.vertices[1].vertex,
+                                          mesh_primitive.vertices[2].vertex));
   }
 }
 
@@ -134,7 +135,7 @@ struct UVPrimitiveLookup {
       for (VectorList<uv_islands::UVPrimitive>::UsedVector &uv_primitives :
            uv_island.uv_primitives) {
         for (uv_islands::UVPrimitive &uv_primitive : uv_primitives) {
-          lookup[uv_primitive.primitive->index].append_as(Entry(&uv_primitive, uv_island_index));
+          lookup[uv_primitive.primitive_i].append_as(Entry(&uv_primitive, uv_island_index));
         }
       }
       uv_island_index++;
@@ -143,6 +144,7 @@ struct UVPrimitiveLookup {
 };
 
 struct EncodePixelsUserData {
+  const uv_islands::MeshData *mesh_data;
   Image *image;
   ImageUser *image_user;
   PBVH *pbvh;
@@ -158,6 +160,7 @@ static void do_encode_pixels(void *__restrict userdata,
                              const TaskParallelTLS *__restrict UNUSED(tls))
 {
   EncodePixelsUserData *data = static_cast<EncodePixelsUserData *>(userdata);
+  const uv_islands::MeshData &mesh_data = *data->mesh_data;
   Image *image = data->image;
   ImageUser image_user = *data->image_user;
   PBVHNode *node = (*data->nodes)[n];
@@ -183,9 +186,9 @@ static void do_encode_pixels(void *__restrict userdata,
            data->uv_primitive_lookup->lookup[geom_prim_index]) {
         uv_islands::UVBorder uv_border = entry.uv_primitive->extract_border();
         float2 uvs[3] = {
-            entry.uv_primitive->get_uv_vertex(0)->uv - tile_offset,
-            entry.uv_primitive->get_uv_vertex(1)->uv - tile_offset,
-            entry.uv_primitive->get_uv_vertex(2)->uv - tile_offset,
+            entry.uv_primitive->get_uv_vertex(mesh_data, 0)->uv - tile_offset,
+            entry.uv_primitive->get_uv_vertex(mesh_data, 1)->uv - tile_offset,
+            entry.uv_primitive->get_uv_vertex(mesh_data, 2)->uv - tile_offset,
         };
         const float minv = clamp_f(min_fff(uvs[0].y, uvs[1].y, uvs[2].y), 0.0f, 1.0f);
         const int miny = floor(minv * image_buffer->y);
@@ -362,9 +365,9 @@ static void update_pixels(PBVH *pbvh, Mesh *mesh, Image *image, ImageUser *image
   }
 
   uv_islands::MeshData mesh_data({pbvh->looptri, pbvh->totprim},
-                                 {pbvh->mloop, pbvh->totprim},
+                                 {pbvh->mloop, mesh->totloop},
                                  pbvh->totvert,
-                                 {ldata_uv, pbvh->totprim});
+                                 {ldata_uv, mesh->totloop});
   uv_islands::UVIslands islands(mesh_data);
 
   uv_islands::UVIslandsMask uv_masks;
@@ -380,16 +383,17 @@ static void update_pixels(PBVH *pbvh, Mesh *mesh, Image *image, ImageUser *image
                       ushort2(tile_buffer->x, tile_buffer->y));
     BKE_image_release_ibuf(image, tile_buffer, nullptr);
   }
-  uv_masks.add(islands);
+  uv_masks.add(mesh_data, islands);
   uv_masks.dilate(image->seamfix_iter);
 
   islands.extract_borders();
-  islands.extend_borders(uv_masks);
+  islands.extend_borders(mesh_data, uv_masks);
   update_geom_primitives(*pbvh, mesh_data);
 
   UVPrimitiveLookup uv_primitive_lookup(mesh_data.looptris.size(), islands);
 
   EncodePixelsUserData user_data;
+  user_data.mesh_data = &mesh_data;
   user_data.pbvh = pbvh;
   user_data.image = image;
   user_data.image_user = image_user;
diff --git a/source/blender/blenkernel/intern/pbvh_uv_islands.cc b/source/blender/blenkernel/intern/pbvh_uv_islands.cc
index 3303a3623fb..cb7ce9e9ad0 100644
--- a/source/blender/blenkernel/intern/pbvh_uv_islands.cc
+++ b/source/blender/blenkernel/intern/pbvh_uv_islands.cc
@@ -31,23 +31,23 @@ static void uv_primitive_append_to_uv_vertices(UVPrimitive &uv_primitive)
 /** \name MeshPrimitive
  * \{ */
 
-MeshUVVert *MeshPrimitive::get_other_uv_vertex(const MeshVertex *v1, const MeshVertex *v2)
+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 (MeshUVVert &uv_vertex : vertices) {
+  for (const MeshUVVert &uv_vertex : vertices) {
     if (uv_vertex.vertex != v1 && uv_vertex.vertex != v2) {
-      return &uv_vertex;
+      return uv_vertex.vertex;
     }
   }
-  return nullptr;
+  return -1;
 }
 
-bool MeshPrimitive::has_shared_uv_edge(const MeshPrimitive *other) const
+bool MeshPrimitive::has_shared_uv_edge(const MeshPrimitive &other) const
 {
   int shared_uv_verts = 0;
   for (const MeshUVVert &vert : vertices) {
-    for (const MeshUVVert &other_vert : other->vertices) {
+    for (const MeshUVVert &other_vert : other.vertices) {
       if (vert.uv == other_vert.uv) {
         shared_uv_verts += 1;
       }
@@ -56,7 +56,7 @@ 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 MeshVertex *vert)
+static const MeshUVVert &get_uv_vert(const MeshPrimitive &mesh_primitive, const int vert)
 {
   for (const MeshUVVert &uv_vert : mesh_primitive.vertices) {
     if (uv_vert.vertex == vert) {
@@ -67,10 +67,10 @@ static const MeshUVVert &get_uv_vert(const MeshPrimitive &mesh_primitive, const
   return mesh_primitive.vertices[0];
 }
 
-const bool has_vertex(const MeshPrimitive &mesh_primitive, const MeshVertex &mesh_vertex)
+static bool has_vertex(const MeshPrimitive &mesh_primitive, const int vert)
 {
   for (int i = 0; i < 3; i++) {
-    if (mesh_primitive.vertices[i].vertex == &mesh_vertex) {
+    if (mesh_primitive.vertices[i].vertex == vert) {
       return true;
     }
   }
@@ -93,16 +93,6 @@ rctf MeshPrimitive::uv_bounds() const
 /** \name MeshData
  * \{ */
 
-static void mesh_data_init_vertices(MeshData &mesh_data)
-{
-  mesh_data.vertices.reserve(mesh_data.verts_num);
-  for (int64_t i = 0; i < mesh_data.verts_num; i++) {
-    MeshVertex vert;
-    vert.v = i;
-    mesh_data.vertices.append(vert);
-  }
-}
-
 static void mesh_data_init_primitives(MeshData &mesh_data)
 {
   mesh_data.primitives.reserve(mesh_data.looptris.size());
@@ -115,7 +105,7 @@ static void mesh_data_init_primitives(MeshData &mesh_data)
     for (int j = 0; j < 3; j++) {
       MeshUVVert uv_vert;
       uv_vert.loop = tri.tri[j];
-      uv_vert.vertex = &mesh_data.vertices[mesh_data.loops[uv_vert.loop].v];
+      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);
     }
@@ -123,7 +113,7 @@ static void mesh_data_init_primitives(MeshData &mesh_data)
   }
 }
 
-void mesh_data_init_edges(MeshData &mesh_data)
+static void mesh_data_init_edges(MeshData &mesh_data)
 {
   mesh_data.edges.reserve(mesh_data.looptris.size() * 2);
   EdgeHash *eh = BLI_edgehash_new_ex(__func__, mesh_data.looptris.size() * 3);
@@ -144,82 +134,96 @@ void mesh_data_init_edges(MeshData &mesh_data)
         edge_index = mesh_data.edges.size();
         *edge_index_ptr = POINTER_FROM_INT(edge_index + 1);
         MeshEdge edge;
-        edge.vert1 = &mesh_data.vertices[v1];
-        edge.vert2 = &mesh_data.vertices[v2];
+        edge.vert1 = v1;
+        edge.vert2 = v2;
         mesh_data.edges.append(edge);
-        MeshEdge *edge_ptr = &mesh_data.edges.last();
-        mesh_data.vertices[v1].edges.append(edge_ptr);
-        mesh_data.vertices[v2].edges.append(edge_ptr);
+        mesh_data.vert_to_edge_map.add(edge_index, v1, v2);
       }
 
-      MeshEdge *edge = &mesh_data.edges[edge_index];
-      edge->primitives.append(&primitive);
-      primitive.edges.append(edge);
+      primitive.edges.append(edge_index);
+    }
+  }
+  /* Build edge to neighboring triangle map. */
+  mesh_data.edge_to_primitive_map = EdgeToPrimitiveMap(mesh_data.edges.size());
+  for (const int prim_i : mesh_data.primitives.index_range()) {
+    const MeshPrimitive &primitive = mesh_data.primitives[prim_i];
+    for (const int edge_i : primitive.edges) {
+      mesh_data.edge_to_primitive_map.add(prim_i, edge_i);
     }
   }
+
   BLI_edgehash_free(eh, nullptr);
 }
-static const int64_t INVALID_UV_ISLAND_ID = -1;
+static constexpr int INVALID_UV_ISLAND_ID = -1;
 /**
  * NOTE: doesn't support weird topology where unconnected mesh primitives share the same uv
  * island. For a accurate implementation we should use implement an uv_prim_lookup.
  */
-static void extract_uv_neighbors(Vector<MeshPrimitive *> &prims_to_add, MeshPrimitive *primitive)
-{
-  for (MeshEdge *edge : primitive->edges) {
-    for (MeshPrimitive *other_primitive : edge->primitives) {
-      if (primitive == other_primitive) {
+static void extract_uv_neighbors(const MeshData &mesh_data,
+                                 const Span<int> uv_island_ids,
+                                 const int primitive_i,
+                                 Vector<int> &prims_to_add)
+{
+  const MeshPrimitive &primitive = mesh_data.primitives[primitive_i];
+  for (const int edge : primitive.edges) {
+    for (const int other_primitive_i : 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list