[Bf-blender-cvs] [400284565fa] temp-pbvh-seam-texturing-tweaks: Remove MeshPrimitive completely

Hans Goudey noreply at git.blender.org
Mon Dec 12 14:38:19 CET 2022


Commit: 400284565fa75f63048b3a7aacb974b4c1eedcc6
Author: Hans Goudey
Date:   Tue Sep 27 22:56:01 2022 -0500
Branches: temp-pbvh-seam-texturing-tweaks
https://developer.blender.org/rB400284565fa75f63048b3a7aacb974b4c1eedcc6

Remove MeshPrimitive completely

Now the existing MLoopTri array is used instead, in addition to a
separate triangle -> edge connection array. This saves 16 bytes per
face corner of memory usage during this process. It also makes the
code more "standard", making it possible to share tooling with other
areas that deal with UVs and looptriangles

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

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 d74ffa71ffe..a53d8e63753 100644
--- a/source/blender/blenkernel/intern/pbvh_pixels.cc
+++ b/source/blender/blenkernel/intern/pbvh_pixels.cc
@@ -106,10 +106,10 @@ 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_data.loops[mesh_primitive.loops[0]].v,
-                                          mesh_data.loops[mesh_primitive.loops[1]].v,
-                                          mesh_data.loops[mesh_primitive.loops[2]].v));
+  for (const MLoopTri &looptri : mesh_data.looptris) {
+    pbvh_data.geom_primitives.append(int3(mesh_data.loops[looptri.tri[0]].v,
+                                          mesh_data.loops[looptri.tri[1]].v,
+                                          mesh_data.loops[looptri.tri[2]].v));
   }
 }
 
diff --git a/source/blender/blenkernel/intern/pbvh_uv_islands.cc b/source/blender/blenkernel/intern/pbvh_uv_islands.cc
index 6120eb0991e..97ac97dddda 100644
--- a/source/blender/blenkernel/intern/pbvh_uv_islands.cc
+++ b/source/blender/blenkernel/intern/pbvh_uv_islands.cc
@@ -28,15 +28,24 @@ static void uv_primitive_append_to_uv_vertices(UVPrimitive &uv_primitive)
 }
 
 /* -------------------------------------------------------------------- */
-/** \name MeshPrimitive
+/** \name Mesh Primitives
  * \{ */
 
-int MeshPrimitive::get_other_uv_vertex(const MeshData &mesh_data, const int v1, const int v2) const
+int primitive_get_other_uv_vertex(const MeshData &mesh_data,
+                                  const MLoopTri &looptri,
+                                  const int v1,
+                                  const int v2)
 {
   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) {
+  BLI_assert(ELEM(v1,
+                  mesh_loops[looptri.tri[0]].v,
+                  mesh_loops[looptri.tri[1]].v,
+                  mesh_loops[looptri.tri[2]].v));
+  BLI_assert(ELEM(v2,
+                  mesh_loops[looptri.tri[0]].v,
+                  mesh_loops[looptri.tri[1]].v,
+                  mesh_loops[looptri.tri[2]].v));
+  for (const int loop : looptri.tri) {
     const int vert = mesh_loops[loop].v;
     if (vert != v1 && vert != v2) {
       return vert;
@@ -45,11 +54,13 @@ int MeshPrimitive::get_other_uv_vertex(const MeshData &mesh_data, const int v1,
   return -1;
 }
 
-bool MeshPrimitive::has_shared_uv_edge(const Span<float2> uv_map, const MeshPrimitive &other) const
+bool primitive_has_shared_uv_edge(const Span<float2> uv_map,
+                                  const MLoopTri &looptri,
+                                  const MLoopTri &other)
 {
   int shared_uv_verts = 0;
-  for (const int loop : loops) {
-    for (const int other_loop : other.loops) {
+  for (const int loop : looptri.tri) {
+    for (const int other_loop : other.tri) {
       if (uv_map[loop] == uv_map[other_loop]) {
         shared_uv_verts += 1;
       }
@@ -58,25 +69,21 @@ bool MeshPrimitive::has_shared_uv_edge(const Span<float2> uv_map, const MeshPrim
   return shared_uv_verts >= 2;
 }
 
-static int get_uv_loop(const MeshData &mesh_data,
-                       const MeshPrimitive &mesh_primitive,
-                       const int vert)
+static int get_uv_loop(const MeshData &mesh_data, const MLoopTri &looptri, const int vert)
 {
-  for (const int loop : mesh_primitive.loops) {
+  for (const int loop : looptri.tri) {
     if (mesh_data.loops[loop].v == vert) {
       return loop;
     }
   }
   BLI_assert_unreachable();
-  return mesh_primitive.loops[0];
+  return looptri.tri[0];
 }
 
-static bool has_vertex(const MeshData &mesh_data,
-                       const MeshPrimitive &mesh_primitive,
-                       const int vert)
+static bool has_vertex(const MeshData &mesh_data, const MLoopTri &looptri, const int vert)
 {
   for (int i = 0; i < 3; i++) {
-    const int vert_i = mesh_data.loops[mesh_primitive.loops[i]].v;
+    const int vert_i = mesh_data.loops[looptri.tri[i]].v;
     if (vert_i == vert) {
       return true;
     }
@@ -84,11 +91,11 @@ static bool has_vertex(const MeshData &mesh_data,
   return false;
 }
 
-rctf MeshPrimitive::uv_bounds(const Span<float2> uv_map) const
+rctf primitive_uv_bounds(const MLoopTri &looptri, const Span<float2> uv_map)
 {
   rctf result;
   BLI_rctf_init_minmax(&result);
-  for (const int loop : loops) {
+  for (const int loop : looptri.tri) {
     BLI_rctf_do_minmax_v(&result, uv_map[loop]);
   }
   return result;
@@ -100,25 +107,12 @@ rctf MeshPrimitive::uv_bounds(const Span<float2> uv_map) const
 /** \name MeshData
  * \{ */
 
-static void mesh_data_init_primitives(MeshData &mesh_data)
-{
-  mesh_data.primitives.reserve(mesh_data.looptris.size());
-  for (int64_t i = 0; i < mesh_data.looptris.size(); i++) {
-    const MLoopTri &tri = mesh_data.looptris[i];
-    MeshPrimitive primitive;
-    primitive.poly = tri.poly;
-    std::copy(std::begin(tri.tri), std::end(tri.tri), std::begin(primitive.loops));
-    mesh_data.primitives.append(primitive);
-  }
-}
-
 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);
   for (int64_t i = 0; i < mesh_data.looptris.size(); i++) {
     const MLoopTri &tri = mesh_data.looptris[i];
-    MeshPrimitive &primitive = mesh_data.primitives[i];
     Vector<int, 3> edges;
     for (int j = 0; j < 3; j++) {
       int v1 = mesh_data.loops[tri.tri[j]].v;
@@ -142,13 +136,12 @@ static void mesh_data_init_edges(MeshData &mesh_data)
 
       edges.append(edge_index);
     }
-    std::copy(std::begin(edges), std::end(edges), std::begin(primitive.edges));
+    mesh_data.primitive_to_edge_map.add(edges, i);
   }
   /* 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) {
+  for (const int prim_i : mesh_data.looptris.index_range()) {
+    for (const int edge_i : mesh_data.primitive_to_edge_map[prim_i]) {
       mesh_data.edge_to_primitive_map.add(prim_i, edge_i);
     }
   }
@@ -165,8 +158,7 @@ static void extract_uv_neighbors(const MeshData &mesh_data,
                                  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 edge : mesh_data.primitive_to_edge_map[primitive_i]) {
     for (const int other_primitive_i : mesh_data.edge_to_primitive_map[edge]) {
       if (primitive_i == other_primitive_i) {
         continue;
@@ -175,8 +167,9 @@ static void extract_uv_neighbors(const MeshData &mesh_data,
         continue;
       }
 
-      const MeshPrimitive &other_primitive = mesh_data.primitives[other_primitive_i];
-      if (primitive.has_shared_uv_edge(mesh_data.uv_map, other_primitive)) {
+      if (primitive_has_shared_uv_edge(mesh_data.uv_map,
+                                       mesh_data.looptris[primitive_i],
+                                       mesh_data.looptris[other_primitive_i])) {
         prims_to_add.append(other_primitive_i);
       }
     }
@@ -185,12 +178,12 @@ static void extract_uv_neighbors(const MeshData &mesh_data,
 
 static int mesh_data_init_primitive_uv_island_ids(MeshData &mesh_data)
 {
-  mesh_data.uv_island_ids.reinitialize(mesh_data.primitives.size());
+  mesh_data.uv_island_ids.reinitialize(mesh_data.looptris.size());
   mesh_data.uv_island_ids.fill(INVALID_UV_ISLAND_ID);
 
   int uv_island_id = 0;
   Vector<int> prims_to_add;
-  for (const int primitive_i : mesh_data.primitives.index_range()) {
+  for (const int primitive_i : mesh_data.looptris.index_range()) {
     /* Early exit when uv island id is already extracted during uv neighbor extractions. */
     if (mesh_data.uv_island_ids[primitive_i] != INVALID_UV_ISLAND_ID) {
       continue;
@@ -210,7 +203,6 @@ static int mesh_data_init_primitive_uv_island_ids(MeshData &mesh_data)
 
 static void mesh_data_init(MeshData &mesh_data)
 {
-  mesh_data_init_primitives(mesh_data);
   mesh_data_init_edges(mesh_data);
   mesh_data.uv_island_len = mesh_data_init_primitive_uv_island_ids(mesh_data);
 }
@@ -224,7 +216,8 @@ MeshData::MeshData(const Span<MLoopTri> looptris,
       loops(loops),
       uv_map(uv_map),
       vert_to_edge_map(verts_num),
-      edge_to_primitive_map(0)
+      edge_to_primitive_map(0),
+      primitive_to_edge_map(looptris.size())
 {
   mesh_data_init(*this);
 }
@@ -393,11 +386,11 @@ bool UVIsland::has_shared_edge(const UVPrimitive &primitive) const
   return false;
 }
 
-bool UVIsland::has_shared_edge(const Span<float2> uv_map, const MeshPrimitive &primitive) const
+bool UVIsland::has_shared_edge(const MeshData &mesh_data, const int primitive_i) const
 {
   for (const VectorList<UVPrimitive>::UsedVector &primitives : uv_primitives) {
     for (const UVPrimitive &prim : primitives) {
-      if (prim.has_shared_edge(uv_map, primitive)) {
+      if (prim.has_shared_edge(mesh_data, primitive_i)) {
         return true;
       }
     }
@@ -421,10 +414,10 @@ static UVPrimitive *add_primitive(const MeshData &mesh_data,
                                   const int primitive_i)
 {
   UVPrimitive uv_primitive(primitive_i);
-  const MeshPrimitive &primitive = mesh_data.primitives[primitive_i];
+  const MLoopTri &primitive = mesh_data.looptris[primitive_i];
   uv_island.uv_primitives.append(uv_primitive);
   UVPrimitive *uv_primitive_ptr = &uv_island.uv_primitives.last();
-  for (const int edge_i : primitive.edges) {
+  for (const int edge_i : mesh_data.p

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list