[Bf-blender-cvs] [6d5569bacfc] temp-pbvh-seam-texturing-tweaks: Remove MeshPrimitive completely

Hans Goudey noreply at git.blender.org
Wed Sep 28 05:56:08 CEST 2022


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

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 59a2c6c9234..0b0359c6df1 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 7eedf7a5843..94666bc2265 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 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_

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list