Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/blenkernel/BKE_mesh_mapping.h20
-rw-r--r--source/blender/blenkernel/intern/mesh_fair.cc10
-rw-r--r--source/blender/blenkernel/intern/mesh_mapping.cc36
-rw-r--r--source/blender/render/intern/texture_margin.cc12
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
@@ -7,6 +7,10 @@
*/
#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<int> build_corner_to_poly_map(Span<MPoly> polys, int loops_num);
+
+Array<Vector<int>> build_vert_to_edge_map(Span<MEdge> edges, int verts_num);
+Array<Vector<int>> build_vert_to_corner_map(Span<MLoop> 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> mloop_;
Span<MPoly> mpoly_;
Span<MEdge> medge_;
- Vector<int> loop_to_poly_map_;
+ Array<int> 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<int> build_corner_to_poly_map(const Span<MPoly> polys, const int loops_num)
+{
+ Array<int> 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<Vector<int>> build_vert_to_edge_map(const Span<MEdge> edges, const int verts_num)
+{
+ Array<Vector<int>> 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<Vector<int>> build_vert_to_corner_map(const Span<MLoop> loops, const int verts_num)
+{
+ Array<Vector<int>> 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<int> loop_adjacency_map_;
/** Maps UV-edges to their corresponding polygon. */
- Vector<int> loop_to_poly_map_;
+ Array<int> 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);