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/modifiers/intern/MOD_weld.cc314
1 files changed, 138 insertions, 176 deletions
diff --git a/source/blender/modifiers/intern/MOD_weld.cc b/source/blender/modifiers/intern/MOD_weld.cc
index ac93f50edf4..d117d86014e 100644
--- a/source/blender/modifiers/intern/MOD_weld.cc
+++ b/source/blender/modifiers/intern/MOD_weld.cc
@@ -37,6 +37,7 @@
#include "BLI_array.hh"
#include "BLI_bitmap.h"
+#include "BLI_index_range.hh"
#include "BLI_kdtree.h"
#include "BLI_math.h"
#include "BLI_span.hh"
@@ -72,6 +73,7 @@
#include "MOD_ui_common.h"
using blender::Array;
+using blender::IndexRange;
using blender::MutableSpan;
using blender::Span;
using blender::Vector;
@@ -374,23 +376,20 @@ static void weld_assert_poly_len(const WeldPoly *wp, const Span<WeldLoop> wloop)
/** \name Weld Vert API
* \{ */
-static Vector<WeldVert> weld_vert_ctx_alloc_and_setup(const int mvert_len,
- Span<int> vert_dest_map)
+static Vector<WeldVert> weld_vert_ctx_alloc_and_setup(Span<int> vert_dest_map)
{
Vector<WeldVert> wvert;
- wvert.reserve(mvert_len);
+ wvert.reserve(vert_dest_map.size());
- const int *v_dest_iter = &vert_dest_map[0];
- for (int i = 0; i < mvert_len; i++, v_dest_iter++) {
- if (*v_dest_iter != OUT_OF_CONTEXT) {
- wvert.append({*v_dest_iter, i});
+ for (const int i : vert_dest_map.index_range()) {
+ if (vert_dest_map[i] != OUT_OF_CONTEXT) {
+ wvert.append({vert_dest_map[i], i});
}
}
return wvert;
}
-static void weld_vert_groups_setup(const int mvert_len,
- Span<WeldVert> wvert,
+static void weld_vert_groups_setup(Span<WeldVert> wvert,
Span<int> vert_dest_map,
MutableSpan<int> r_vert_groups_map,
Array<int> &r_vert_groups_buffer,
@@ -399,21 +398,19 @@ static void weld_vert_groups_setup(const int mvert_len,
/* Get weld vert groups. */
int wgroups_len = 0;
- const int *vert_dest_iter = &vert_dest_map[0];
- int *group_map_iter = &r_vert_groups_map[0];
- for (int i = 0; i < mvert_len; i++, group_map_iter++, vert_dest_iter++) {
- int vert_dest = *vert_dest_iter;
+ for (const int i : vert_dest_map.index_range()) {
+ const int vert_dest = vert_dest_map[i];
if (vert_dest != OUT_OF_CONTEXT) {
if (vert_dest != i) {
- *group_map_iter = ELEM_MERGED;
+ r_vert_groups_map[i] = ELEM_MERGED;
}
else {
- *group_map_iter = wgroups_len;
+ r_vert_groups_map[i] = wgroups_len;
wgroups_len++;
}
}
else {
- *group_map_iter = OUT_OF_CONTEXT;
+ r_vert_groups_map[i] = OUT_OF_CONTEXT;
}
}
@@ -421,31 +418,27 @@ static void weld_vert_groups_setup(const int mvert_len,
r_vert_groups.fill({0, 0});
MutableSpan<WeldGroup> wgroups = r_vert_groups;
- const WeldVert *wv = &wvert[0];
- for (int i = wvert.size(); i--; wv++) {
- int group_index = r_vert_groups_map[wv->vert_dest];
+ for (const WeldVert &wv : wvert) {
+ int group_index = r_vert_groups_map[wv.vert_dest];
wgroups[group_index].len++;
}
int ofs = 0;
- WeldGroup *wg_iter = &wgroups[0];
- for (int i = wgroups_len; i--; wg_iter++) {
- wg_iter->ofs = ofs;
- ofs += wg_iter->len;
+ for (WeldGroup &wg : wgroups) {
+ wg.ofs = ofs;
+ ofs += wg.len;
}
BLI_assert(ofs == wvert.size());
r_vert_groups_buffer.reinitialize(ofs);
- wv = &wvert[0];
- for (int i = wvert.size(); i--; wv++) {
- int group_index = r_vert_groups_map[wv->vert_dest];
- r_vert_groups_buffer[wgroups[group_index].ofs++] = wv->vert_orig;
+ for (const WeldVert &wv : wvert) {
+ int group_index = r_vert_groups_map[wv.vert_dest];
+ r_vert_groups_buffer[wgroups[group_index].ofs++] = wv.vert_orig;
}
- wg_iter = &wgroups[0];
- for (int i = wgroups_len; i--; wg_iter++) {
- wg_iter->ofs -= wg_iter->len;
+ for (WeldGroup &wg : wgroups) {
+ wg.ofs -= wg.len;
}
}
@@ -455,29 +448,24 @@ static void weld_vert_groups_setup(const int mvert_len,
/** \name Weld Edge API
* \{ */
-static void weld_edge_ctx_setup(const int mvert_len,
- MutableSpan<WeldGroup> r_vlinks,
+static void weld_edge_ctx_setup(MutableSpan<WeldGroup> r_vlinks,
MutableSpan<int> r_edge_dest_map,
MutableSpan<WeldEdge> r_wedge,
int *r_edge_kiil_len)
{
- WeldEdge *we;
-
/* Setup Edge Overlap. */
int edge_kill_len = 0;
MutableSpan<WeldGroup> v_links = r_vlinks;
- WeldGroup *vl_iter = &r_vlinks[0];
- we = &r_wedge[0];
- for (int i = r_wedge.size(); i--; we++) {
- int dst_vert_a = we->vert_a;
- int dst_vert_b = we->vert_b;
+ for (WeldEdge &we : r_wedge) {
+ int dst_vert_a = we.vert_a;
+ int dst_vert_b = we.vert_b;
if (dst_vert_a == dst_vert_b) {
- BLI_assert(we->edge_dest == OUT_OF_CONTEXT);
- r_edge_dest_map[we->edge_orig] = ELEM_COLLAPSED;
- we->flag = ELEM_COLLAPSED;
+ BLI_assert(we.edge_dest == OUT_OF_CONTEXT);
+ r_edge_dest_map[we.edge_orig] = ELEM_COLLAPSED;
+ we.flag = ELEM_COLLAPSED;
edge_kill_len++;
continue;
}
@@ -487,44 +475,42 @@ static void weld_edge_ctx_setup(const int mvert_len,
}
int link_len = 0;
- vl_iter = &v_links[0];
- for (int i = mvert_len; i--; vl_iter++) {
- vl_iter->ofs = link_len;
- link_len += vl_iter->len;
+ for (WeldGroup &vl : r_vlinks) {
+ vl.ofs = link_len;
+ link_len += vl.len;
}
if (link_len > 0) {
Array<int> link_edge_buffer(link_len);
- we = &r_wedge[0];
- for (int i = 0; i < r_wedge.size(); i++, we++) {
- if (we->flag == ELEM_COLLAPSED) {
+ for (const int i : r_wedge.index_range()) {
+ const WeldEdge &we = r_wedge[i];
+ if (we.flag == ELEM_COLLAPSED) {
continue;
}
- int dst_vert_a = we->vert_a;
- int dst_vert_b = we->vert_b;
+ int dst_vert_a = we.vert_a;
+ int dst_vert_b = we.vert_b;
link_edge_buffer[v_links[dst_vert_a].ofs++] = i;
link_edge_buffer[v_links[dst_vert_b].ofs++] = i;
}
- vl_iter = &v_links[0];
- for (int i = mvert_len; i--; vl_iter++) {
+ for (WeldGroup &vl : r_vlinks) {
/* Fix offset */
- vl_iter->ofs -= vl_iter->len;
+ vl.ofs -= vl.len;
}
- we = &r_wedge[0];
- for (int i = 0; i < r_wedge.size(); i++, we++) {
- if (we->edge_dest != OUT_OF_CONTEXT) {
+ for (const int i : r_wedge.index_range()) {
+ const WeldEdge &we = r_wedge[i];
+ if (we.edge_dest != OUT_OF_CONTEXT) {
/* No need to retest edges.
* (Already includes collapsed edges). */
continue;
}
- int dst_vert_a = we->vert_a;
- int dst_vert_b = we->vert_b;
+ int dst_vert_a = we.vert_a;
+ int dst_vert_b = we.vert_b;
struct WeldGroup *link_a = &v_links[dst_vert_a];
struct WeldGroup *link_b = &v_links[dst_vert_b];
@@ -538,7 +524,7 @@ static void weld_edge_ctx_setup(const int mvert_len,
int *edges_ctx_a = &link_edge_buffer[link_a->ofs];
int *edges_ctx_b = &link_edge_buffer[link_b->ofs];
- int edge_orig = we->edge_orig;
+ int edge_orig = we.edge_orig;
for (; edges_len_a--; edges_ctx_a++) {
int e_ctx_a = *edges_ctx_a;
@@ -586,12 +572,9 @@ static Vector<WeldEdge> weld_edge_ctx_alloc(const MEdge *medge,
Vector<WeldEdge> wedge;
wedge.reserve(medge_len);
- const MEdge *me = &medge[0];
- int *e_dest_iter = &r_edge_dest_map[0];
- int *iter = &r_edge_ctx_map[0];
- for (int i = 0; i < medge_len; i++, me++, iter++, e_dest_iter++) {
- int v1 = me->v1;
- int v2 = me->v2;
+ for (const int i : IndexRange(medge_len)) {
+ int v1 = medge[i].v1;
+ int v2 = medge[i].v2;
int v_dest_1 = vert_dest_map[v1];
int v_dest_2 = vert_dest_map[v2];
if ((v_dest_1 != OUT_OF_CONTEXT) || (v_dest_2 != OUT_OF_CONTEXT)) {
@@ -601,12 +584,12 @@ static Vector<WeldEdge> weld_edge_ctx_alloc(const MEdge *medge,
we.edge_dest = OUT_OF_CONTEXT;
we.edge_orig = i;
wedge.append(we);
- *e_dest_iter = i;
- *iter = wedge_len++;
+ r_edge_dest_map[i] = i;
+ r_edge_ctx_map[i] = wedge_len++;
}
else {
- *e_dest_iter = OUT_OF_CONTEXT;
- *iter = OUT_OF_CONTEXT;
+ r_edge_dest_map[i] = OUT_OF_CONTEXT;
+ r_edge_ctx_map[i] = OUT_OF_CONTEXT;
}
}
@@ -633,62 +616,56 @@ static void weld_edge_groups_setup(const int medge_len,
wegrp_iter = &r_edge_groups[0];
wgroups_len = 0;
- const int *edge_ctx_iter = &wedge_map[0];
- int *group_map_iter = &r_edge_groups_map[0];
- for (int i = medge_len; i--; edge_ctx_iter++, group_map_iter++) {
- int edge_ctx = *edge_ctx_iter;
+ for (const int i : IndexRange(medge_len)) {
+ int edge_ctx = wedge_map[i];
if (edge_ctx != OUT_OF_CONTEXT) {
WeldEdge *we = &wedge[edge_ctx];
int edge_dest = we->edge_dest;
if (edge_dest != OUT_OF_CONTEXT) {
BLI_assert(edge_dest != we->edge_orig);
- *group_map_iter = ELEM_MERGED;
+ r_edge_groups_map[i] = ELEM_MERGED;
}
else {
we->edge_dest = we->edge_orig;
wegrp_iter->v1 = we->vert_a;
wegrp_iter->v2 = we->vert_b;
- *group_map_iter = wgroups_len;
+ r_edge_groups_map[i] = wgroups_len;
wgroups_len++;
wegrp_iter++;
}
}
else {
- *group_map_iter = OUT_OF_CONTEXT;
+ r_edge_groups_map[i] = OUT_OF_CONTEXT;
}
}
BLI_assert(wgroups_len == wedge.size() - edge_kill_len);
- WeldEdge *we = &wedge[0];
- for (int i = wedge.size(); i--; we++) {
- if (we->flag == ELEM_COLLAPSED) {
+ for (const WeldEdge &we : wedge) {
+ if (we.flag == ELEM_COLLAPSED) {
continue;
}
- int group_index = r_edge_groups_map[we->edge_dest];
+ int group_index = r_edge_groups_map[we.edge_dest];
wegroups[group_index].group.len++;
}
int ofs = 0;
- wegrp_iter = &wegroups[0];
- for (int i = wgroups_len; i--; wegrp_iter++) {
- wegrp_iter->group.ofs = ofs;
- ofs += wegrp_iter->group.len;
+ for (WeldGroupEdge &wegrp : wegroups) {
+ wegrp.group.ofs = ofs;
+ ofs += wegrp.group.len;
}
r_edge_groups_buffer.reinitialize(ofs);
- we = &wedge[0];
- for (int i = wedge.size(); i--; we++) {
- if (we->flag == ELEM_COLLAPSED) {
+ for (const WeldEdge &we : wedge) {
+ if (we.flag == ELEM_COLLAPSED) {
continue;
}
- int group_index = r_edge_groups_map[we->edge_dest];
- r_edge_groups_buffer[wegroups[group_index].group.ofs++] = we->edge_orig;
+ int group_index = r_edge_groups_map[we.edge_dest];
+ r_edge_groups_buffer[wegroups[group_index].group.ofs++] = we.edge_orig;
}
- wegrp_iter = &wegroups[0];
- for (int i = wgroups_len; i--; wegrp_iter++) {
- wegrp_iter->group.ofs -= wegrp_iter->group.len;
+ for (WeldGroupEdge &wegrp : wegroups) {
+ wegrp.group.ofs -= wegrp.group.len;
}
}
@@ -824,21 +801,17 @@ static void weld_poly_loop_ctx_alloc(Span<MPoly> mpoly,
int maybe_new_poly = 0;
- const MPoly *mp = &mpoly[0];
- int *iter = &poly_map[0];
- int *loop_map_iter = &loop_map[0];
- for (int i = 0; i < mpoly.size(); i++, mp++, iter++) {
- const int loopstart = mp->loopstart;
- const int totloop = mp->totloop;
+ for (const int i : mpoly.index_range()) {
+ const MPoly &mp = mpoly[i];
+ const int loopstart = mp.loopstart;
+ const int totloop = mp.totloop;
int vert_ctx_len = 0;
- int l = loopstart;
int prev_wloop_len = wloop_len;
- const MLoop *ml = &mloop[l];
- for (int j = totloop; j--; l++, ml++, loop_map_iter++) {
- int v = ml->v;
- int e = ml->e;
+ for (const int i_loop : mloop.index_range().slice(loopstart, totloop)) {
+ int v = mloop[i_loop].v;
+ int e = mloop[i_loop].e;
int v_dest = vert_dest_map[v];
int e_dest = edge_dest_map[e];
bool is_vert_ctx = v_dest != OUT_OF_CONTEXT;
@@ -850,14 +823,14 @@ static void weld_poly_loop_ctx_alloc(Span<MPoly> mpoly,
WeldLoop wl{};
wl.vert = is_vert_ctx ? v_dest : v;
wl.edge = is_edge_ctx ? e_dest : e;
- wl.loop_orig = l;
+ wl.loop_orig = i_loop;
wl.loop_skip_to = OUT_OF_CONTEXT;
wloop.append(wl);
- *loop_map_iter = wloop_len++;
+ loop_map[i_loop] = wloop_len++;
}
else {
- *loop_map_iter = OUT_OF_CONTEXT;
+ loop_map[i_loop] = OUT_OF_CONTEXT;
}
}
if (wloop_len != prev_wloop_len) {
@@ -872,7 +845,7 @@ static void weld_poly_loop_ctx_alloc(Span<MPoly> mpoly,
wp.len = totloop;
wpoly.append(wp);
- *iter = wpoly_len++;
+ poly_map[i] = wpoly_len++;
if (totloop > 5 && vert_ctx_len > 1) {
int max_new = (totloop / 3) - 1;
vert_ctx_len /= 2;
@@ -881,7 +854,7 @@ static void weld_poly_loop_ctx_alloc(Span<MPoly> mpoly,
}
}
else {
- *iter = OUT_OF_CONTEXT;
+ poly_map[i] = OUT_OF_CONTEXT;
}
}
@@ -1054,7 +1027,7 @@ static void weld_poly_loop_ctx_setup(Span<MLoop> mloop,
{
int poly_kill_len, loop_kill_len, wpoly_len, wpoly_new_len;
- WeldPoly *wpoly_new, *wp;
+ WeldPoly *wpoly_new;
WeldLoop *wl;
MutableSpan<WeldPoly> wpoly = r_weld_mesh->wpoly;
@@ -1071,12 +1044,11 @@ static void weld_poly_loop_ctx_setup(Span<MLoop> mloop,
/* Setup Poly/Loop. */
- wp = &wpoly[0];
- for (int i = wpoly_len; i--; wp++) {
- const int ctx_loops_len = wp->loops.len;
- const int ctx_loops_ofs = wp->loops.ofs;
+ for (WeldPoly &wp : wpoly) {
+ const int ctx_loops_len = wp.loops.len;
+ const int ctx_loops_ofs = wp.loops.ofs;
- int poly_len = wp->len;
+ int poly_len = wp.len;
int ctx_verts_len = 0;
wl = &wloop[ctx_loops_ofs];
for (int l = ctx_loops_len; l--; wl++) {
@@ -1084,7 +1056,7 @@ static void weld_poly_loop_ctx_setup(Span<MLoop> mloop,
if (edge_dest == ELEM_COLLAPSED) {
wl->flag = ELEM_COLLAPSED;
if (poly_len == 3) {
- wp->flag = ELEM_COLLAPSED;
+ wp.flag = ELEM_COLLAPSED;
poly_kill_len++;
loop_kill_len += 3;
poly_len = 0;
@@ -1102,7 +1074,7 @@ static void weld_poly_loop_ctx_setup(Span<MLoop> mloop,
}
if (poly_len) {
- wp->len = poly_len;
+ wp.len = poly_len;
#ifdef USE_WELD_DEBUG
weld_assert_poly_len(wp, wloop);
#endif
@@ -1112,7 +1084,7 @@ static void weld_poly_loop_ctx_setup(Span<MLoop> mloop,
mloop,
#endif
ctx_verts_len,
- wp,
+ &wp,
r_weld_mesh,
&poly_kill_len,
&loop_kill_len);
@@ -1137,13 +1109,13 @@ static void weld_poly_loop_ctx_setup(Span<MLoop> mloop,
int wpoly_and_new_len = wpoly_len + wpoly_new_len;
- struct WeldGroup *vl_iter, *v_links = r_vlinks.data();
- memset(v_links, 0, sizeof(*v_links) * mvert_len);
+ r_vlinks.fill({0, 0});
+ MutableSpan<WeldGroup> v_links = r_vlinks;
- wp = &wpoly[0];
- for (int i = wpoly_and_new_len; i--; wp++) {
+ for (const int i : IndexRange(wpoly_and_new_len)) {
+ const WeldPoly &wp = wpoly[i];
WeldLoopOfPolyIter iter;
- if (weld_iter_loop_of_poly_begin(&iter, *wp, wloop, mloop, loop_map, nullptr)) {
+ if (weld_iter_loop_of_poly_begin(&iter, wp, wloop, mloop, loop_map, nullptr)) {
while (weld_iter_loop_of_poly_next(&iter)) {
v_links[iter.v].len++;
}
@@ -1151,44 +1123,42 @@ static void weld_poly_loop_ctx_setup(Span<MLoop> mloop,
}
int link_len = 0;
- vl_iter = &v_links[0];
- for (int i = mvert_len; i--; vl_iter++) {
- vl_iter->ofs = link_len;
- link_len += vl_iter->len;
+ for (const int i : IndexRange(mvert_len)) {
+ v_links[i].ofs = link_len;
+ link_len += v_links[i].len;
}
if (link_len) {
Array<int> link_poly_buffer(link_len);
- wp = &wpoly[0];
- for (int i = 0; i < wpoly_and_new_len; i++, wp++) {
+ for (const int i : IndexRange(wpoly_and_new_len)) {
+ const WeldPoly &wp = wpoly[i];
WeldLoopOfPolyIter iter;
- if (weld_iter_loop_of_poly_begin(&iter, *wp, wloop, mloop, loop_map, nullptr)) {
+ if (weld_iter_loop_of_poly_begin(&iter, wp, wloop, mloop, loop_map, nullptr)) {
while (weld_iter_loop_of_poly_next(&iter)) {
link_poly_buffer[v_links[iter.v].ofs++] = i;
}
}
}
- vl_iter = &v_links[0];
- for (int i = mvert_len; i--; vl_iter++) {
+ for (WeldGroup &vl : r_vlinks) {
/* Fix offset */
- vl_iter->ofs -= vl_iter->len;
+ vl.ofs -= vl.len;
}
int polys_len_a, polys_len_b, *polys_ctx_a, *polys_ctx_b, p_ctx_a, p_ctx_b;
polys_len_b = p_ctx_b = 0; /* silence warnings */
- wp = &wpoly[0];
- for (int i = 0; i < wpoly_and_new_len; i++, wp++) {
- if (wp->poly_dst != OUT_OF_CONTEXT) {
+ for (const int i : IndexRange(wpoly_and_new_len)) {
+ const WeldPoly &wp = wpoly[i];
+ if (wp.poly_dst != OUT_OF_CONTEXT) {
/* No need to retest poly.
* (Already includes collapsed polygons). */
continue;
}
WeldLoopOfPolyIter iter;
- weld_iter_loop_of_poly_begin(&iter, *wp, wloop, mloop, loop_map, nullptr);
+ weld_iter_loop_of_poly_begin(&iter, wp, wloop, mloop, loop_map, nullptr);
weld_iter_loop_of_poly_next(&iter);
struct WeldGroup *link_a = &v_links[iter.v];
polys_len_a = link_a->len;
@@ -1196,7 +1166,7 @@ static void weld_poly_loop_ctx_setup(Span<MLoop> mloop,
BLI_assert(link_poly_buffer[link_a->ofs] == i);
continue;
}
- int wp_len = wp->len;
+ int wp_len = wp.len;
polys_ctx_a = &link_poly_buffer[link_a->ofs];
for (; polys_len_a--; polys_ctx_a++) {
p_ctx_a = *polys_ctx_a;
@@ -1243,7 +1213,7 @@ static void weld_poly_loop_ctx_setup(Span<MLoop> mloop,
BLI_assert(p_ctx_a == p_ctx_b);
BLI_assert(wp_tmp->poly_dst == OUT_OF_CONTEXT);
BLI_assert(wp_tmp != wp);
- wp_tmp->poly_dst = wp->poly_orig;
+ wp_tmp->poly_dst = wp.poly_orig;
loop_kill_len += wp_tmp->len;
poly_kill_len++;
}
@@ -1254,9 +1224,8 @@ static void weld_poly_loop_ctx_setup(Span<MLoop> mloop,
poly_kill_len = r_weld_mesh->wpoly_len;
loop_kill_len = r_weld_mesh->wloop_len;
- wp = &wpoly[0];
- for (int i = wpoly_len; i--; wp++) {
- wp->flag = ELEM_COLLAPSED;
+ for (WeldPoly &wp : wpoly) {
+ wp.flag = ELEM_COLLAPSED;
}
}
@@ -1294,7 +1263,7 @@ static void weld_mesh_context_create(const Mesh *mesh,
const int mvert_len = mesh->totvert;
const int medge_len = mesh->totedge;
- Vector<WeldVert> wvert = weld_vert_ctx_alloc_and_setup(mvert_len, vert_dest_map);
+ Vector<WeldVert> wvert = weld_vert_ctx_alloc_and_setup(vert_dest_map);
r_weld_mesh->vert_kill_len = vert_kill_len;
Array<int> edge_dest_map(medge_len);
@@ -1303,7 +1272,7 @@ static void weld_mesh_context_create(const Mesh *mesh,
medge, medge_len, vert_dest_map, edge_dest_map, edge_ctx_map);
Array<WeldGroup> v_links(mvert_len, {0, 0});
- weld_edge_ctx_setup(mvert_len, v_links, edge_dest_map, wedge, &r_weld_mesh->edge_kill_len);
+ weld_edge_ctx_setup(v_links, edge_dest_map, wedge, &r_weld_mesh->edge_kill_len);
weld_poly_loop_ctx_alloc(mpoly, mloop, vert_dest_map, edge_dest_map, r_weld_mesh);
@@ -1318,8 +1287,7 @@ static void weld_mesh_context_create(const Mesh *mesh,
v_links,
r_weld_mesh);
- weld_vert_groups_setup(mvert_len,
- wvert,
+ weld_vert_groups_setup(wvert,
vert_dest_map,
vert_dest_map,
r_weld_mesh->vert_groups_buffer,
@@ -1516,24 +1484,21 @@ static Mesh *weldModifier_doWeld(WeldModifierData *wmd,
BLI_bitmap *v_mask = nullptr;
int v_mask_act = 0;
- const MVert *mvert;
- const MPoly *mp;
+ Span<MVert> mvert{mesh->mvert, mesh->totvert};
int totvert, totedge, totloop, totpoly;
- mvert = mesh->mvert;
totvert = mesh->totvert;
/* Vertex Group. */
const int defgrp_index = BKE_id_defgroup_name_index(&mesh->id, wmd->defgrp_name);
if (defgrp_index != -1) {
- MDeformVert *dvert, *dv;
+ MDeformVert *dvert;
dvert = static_cast<MDeformVert *>(CustomData_get_layer(&mesh->vdata, CD_MDEFORMVERT));
if (dvert) {
const bool invert_vgroup = (wmd->flag & MOD_WELD_INVERT_VGROUP) != 0;
- dv = &dvert[0];
v_mask = BLI_BITMAP_NEW(totvert, __func__);
- for (int i = 0; i < totvert; i++, dv++) {
- const bool found = BKE_defvert_find_weight(dv, defgrp_index) > 0.0f;
+ for (const int i : IndexRange(totvert)) {
+ const bool found = BKE_defvert_find_weight(&dvert[i], defgrp_index) > 0.0f;
if (found != invert_vgroup) {
BLI_BITMAP_ENABLE(v_mask, i);
v_mask_act++;
@@ -1552,7 +1517,7 @@ static Mesh *weldModifier_doWeld(WeldModifierData *wmd,
/* Get overlap map. */
struct BVHTreeFromMesh treedata;
BVHTree *bvhtree = bvhtree_from_mesh_verts_ex(&treedata,
- mvert,
+ mvert.data(),
totvert,
false,
v_mask,
@@ -1629,7 +1594,7 @@ static Mesh *weldModifier_doWeld(WeldModifierData *wmd,
#else
{
KDTree_3d *tree = BLI_kdtree_3d_new(v_mask ? v_mask_act : totvert);
- for (int i = 0; i < totvert; i++) {
+ for (const int i : IndexRange(totvert)) {
if (!v_mask || BLI_BITMAP_TEST(v_mask, i)) {
BLI_kdtree_3d_insert(tree, i, mvert[i].co);
}
@@ -1645,30 +1610,27 @@ static Mesh *weldModifier_doWeld(WeldModifierData *wmd,
else {
BLI_assert(wmd->mode == MOD_WELD_MODE_CONNECTED);
- MEdge *medge, *me;
+ Span<MEdge> medge{mesh->medge, mesh->totedge};
- medge = mesh->medge;
totvert = mesh->totvert;
- totedge = mesh->totedge;
Array<WeldVertexCluster> vert_clusters(totvert);
- struct WeldVertexCluster *vc = &vert_clusters[0];
- for (int i = 0; i < totvert; i++, vc++) {
- copy_v3_v3(vc->co, mvert[i].co);
- vc->merged_verts = 0;
+ for (const int i : mvert.index_range()) {
+ WeldVertexCluster &vc = vert_clusters[i];
+ copy_v3_v3(vc.co, mvert[i].co);
+ vc.merged_verts = 0;
}
const float merge_dist_sq = square_f(wmd->merge_dist);
range_vn_i(vert_dest_map.data(), totvert, 0);
/* Collapse Edges that are shorter than the threshold. */
- me = &medge[0];
- for (int i = 0; i < totedge; i++, me++) {
- int v1 = me->v1;
- int v2 = me->v2;
+ for (const int i : medge.index_range()) {
+ int v1 = medge[i].v1;
+ int v2 = medge[i].v2;
- if (wmd->flag & MOD_WELD_LOOSE_EDGES && (me->flag & ME_LOOSEEDGE) == 0) {
+ if (wmd->flag & MOD_WELD_LOOSE_EDGES && (medge[i].flag & ME_LOOSEEDGE) == 0) {
continue;
}
while (v1 != vert_dest_map[v1]) {
@@ -1703,7 +1665,7 @@ static Mesh *weldModifier_doWeld(WeldModifierData *wmd,
}
}
- for (int i = 0; i < totvert; i++) {
+ for (const int i : IndexRange(totvert)) {
if (i == vert_dest_map[i]) {
vert_dest_map[i] = OUT_OF_CONTEXT;
}
@@ -1823,18 +1785,18 @@ static Mesh *weldModifier_doWeld(WeldModifierData *wmd,
/* Polys/Loops */
- mp = &mpoly[0];
MPoly *r_mp = &result->mpoly[0];
MLoop *r_ml = &result->mloop[0];
int r_i = 0;
int loop_cur = 0;
Array<int, 64> group_buffer(weld_mesh.max_poly_len);
- for (int i = 0; i < totpoly; i++, mp++) {
+ for (const int i : mpoly.index_range()) {
+ const MPoly &mp = mpoly[i];
int loop_start = loop_cur;
int poly_ctx = weld_mesh.poly_map[i];
if (poly_ctx == OUT_OF_CONTEXT) {
- int mp_loop_len = mp->totloop;
- CustomData_copy_data(&mesh->ldata, &result->ldata, mp->loopstart, loop_cur, mp_loop_len);
+ int mp_loop_len = mp.totloop;
+ CustomData_copy_data(&mesh->ldata, &result->ldata, mp.loopstart, loop_cur, mp_loop_len);
loop_cur += mp_loop_len;
for (; mp_loop_len--; r_ml++) {
r_ml->v = vert_final[r_ml->v];
@@ -1875,16 +1837,16 @@ static Mesh *weldModifier_doWeld(WeldModifierData *wmd,
r_i++;
}
- const WeldPoly *wp = &weld_mesh.wpoly_new[0];
- for (int i = 0; i < weld_mesh.wpoly_new_len; i++, wp++) {
+ for (const int i : IndexRange(weld_mesh.wpoly_new_len)) {
+ const WeldPoly &wp = weld_mesh.wpoly_new[i];
int loop_start = loop_cur;
WeldLoopOfPolyIter iter;
if (!weld_iter_loop_of_poly_begin(
- &iter, *wp, weld_mesh.wloop, mloop, weld_mesh.loop_map, group_buffer.data())) {
+ &iter, wp, weld_mesh.wloop, mloop, weld_mesh.loop_map, group_buffer.data())) {
continue;
}
- if (wp->poly_dst != OUT_OF_CONTEXT) {
+ if (wp.poly_dst != OUT_OF_CONTEXT) {
continue;
}
while (weld_iter_loop_of_poly_next(&iter)) {