From 25533dbe219f8bbcb3f04ffe2ff1e57599addf3f Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Wed, 28 Sep 2022 14:31:32 -0500 Subject: [PATCH] Mesh: Add C++ implementaiton of topology mappings Because they are friendlier to use in C++ code than the existing mesh mapping API, these mappings from one domain to another were often reimplemented in separate files. This commit moves some basic implementations to a `mesh_topology` namespace in the existing mesh mapping header file. These is plenty of room for performance improvement here, particularly by not using an array of Vectors, but that can come later. Split from D16029 --- source/blender/blenkernel/BKE_mesh_mapping.h | 20 +++++++++++ source/blender/blenkernel/intern/mesh_fair.cc | 10 ++---- .../blender/blenkernel/intern/mesh_mapping.cc | 36 +++++++++++++++++++ .../blender/render/intern/texture_margin.cc | 12 +++---- 4 files changed, 63 insertions(+), 15 deletions(-) diff --git a/source/blender/blenkernel/BKE_mesh_mapping.h b/source/blender/blenkernel/BKE_mesh_mapping.h index 2ee50fbaaee..350c4c4bb36 100644 --- a/source/blender/blenkernel/BKE_mesh_mapping.h +++ b/source/blender/blenkernel/BKE_mesh_mapping.h @@ -6,6 +6,10 @@ * \ingroup bke */ +#ifdef __cplusplus +# include "BLI_array.hh" +#endif + #ifdef __cplusplus extern "C" { #endif @@ -330,3 +334,19 @@ int *BKE_mesh_calc_smoothgroups(const struct MEdge *medge, #ifdef __cplusplus } #endif + +#ifdef __cplusplus +namespace blender::mesh_topology { + +Array build_corner_to_poly_map(Span polys, int loops_num); + +Array> build_vert_to_edge_map(Span edges, int verts_num); +Array> build_vert_to_corner_map(Span loops, int verts_num); + +inline int previous_poly_corner(const MPoly &poly, int corner_i) +{ + return corner_i - 1 + (corner_i == poly.loopstart) * poly.totloop; +} + +} // namespace blender::mesh_topology +#endif diff --git a/source/blender/blenkernel/intern/mesh_fair.cc b/source/blender/blenkernel/intern/mesh_fair.cc index bb0a5610cf4..df61169fa5c 100644 --- a/source/blender/blenkernel/intern/mesh_fair.cc +++ b/source/blender/blenkernel/intern/mesh_fair.cc @@ -26,6 +26,7 @@ #include "MEM_guardedalloc.h" #include "eigen_capi.h" +using blender::Array; using blender::Map; using blender::MutableSpan; using blender::Span; @@ -220,12 +221,7 @@ class MeshFairingContext : public FairingContext { } } - loop_to_poly_map_.reserve(mesh->totloop); - for (int i = 0; i < mesh->totpoly; i++) { - for (int l = 0; l < mpoly_[i].totloop; l++) { - loop_to_poly_map_[l + mpoly_[i].loopstart] = i; - } - } + loop_to_poly_map_ = blender::mesh_topology::build_corner_to_poly_map(mpoly_, mloop_.size()); } ~MeshFairingContext() override @@ -259,7 +255,7 @@ class MeshFairingContext : public FairingContext { Span mloop_; Span mpoly_; Span medge_; - Vector loop_to_poly_map_; + Array loop_to_poly_map_; }; class BMeshFairingContext : public FairingContext { diff --git a/source/blender/blenkernel/intern/mesh_mapping.cc b/source/blender/blenkernel/intern/mesh_mapping.cc index 2db0adce033..c1523f0a525 100644 --- a/source/blender/blenkernel/intern/mesh_mapping.cc +++ b/source/blender/blenkernel/intern/mesh_mapping.cc @@ -16,6 +16,7 @@ #include "BLI_bitmap.h" #include "BLI_buffer.h" #include "BLI_math.h" +#include "BLI_task.hh" #include "BLI_utildefines.h" #include "BKE_customdata.h" @@ -552,6 +553,41 @@ void BKE_mesh_origindex_map_create_looptri(MeshElemMap **r_map, *r_mem = indices; } +namespace blender::mesh_topology { + +Array build_corner_to_poly_map(const Span polys, const int loops_num) +{ + Array map(loops_num); + threading::parallel_for(polys.index_range(), 1024, [&](IndexRange range) { + for (const int64_t poly_i : range) { + const MPoly &poly = polys[poly_i]; + map.as_mutable_span().slice(poly.loopstart, poly.totloop).fill(int(poly_i)); + } + }); + return map; +} + +Array> build_vert_to_edge_map(const Span edges, const int verts_num) +{ + Array> map(verts_num); + for (const int64_t i : edges.index_range()) { + map[edges[i].v1].append(int(i)); + map[edges[i].v2].append(int(i)); + } + return map; +} + +Array> build_vert_to_corner_map(const Span loops, const int verts_num) +{ + Array> map(verts_num); + for (const int64_t i : loops.index_range()) { + map[loops[i].v].append(int(i)); + } + return map; +} + +} // namespace blender::mesh_topology + /** \} */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/render/intern/texture_margin.cc b/source/blender/render/intern/texture_margin.cc index 201908234fe..a69449d9386 100644 --- a/source/blender/render/intern/texture_margin.cc +++ b/source/blender/render/intern/texture_margin.cc @@ -14,6 +14,7 @@ #include "BKE_DerivedMesh.h" #include "BKE_customdata.h" #include "BKE_mesh.h" +#include "BKE_mesh_mapping.h" #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" @@ -44,7 +45,7 @@ class TextureMarginMap { /** Maps UV-edges to their corresponding UV-edge. */ Vector loop_adjacency_map_; /** Maps UV-edges to their corresponding polygon. */ - Vector loop_to_poly_map_; + Array loop_to_poly_map_; int w_, h_; float uv_offset_[2]; @@ -289,13 +290,8 @@ class TextureMarginMap { void build_tables() { - loop_to_poly_map_.resize(totloop_); - for (int i = 0; i < totpoly_; i++) { - for (int j = 0; j < mpoly_[i].totloop; j++) { - int l = j + mpoly_[i].loopstart; - loop_to_poly_map_[l] = i; - } - } + loop_to_poly_map_ = blender::mesh_topology::build_corner_to_poly_map({mpoly_, totpoly_}, + totloop_); loop_adjacency_map_.resize(totloop_, -1);