[Bf-blender-cvs] [a9b193f6635] refactor-mesh-corners-generic: Merge branch 'refactor-mesh-position-generic' into refactor-mesh-corners-generic
Hans Goudey
noreply at git.blender.org
Thu Dec 8 20:17:49 CET 2022
Commit: a9b193f66350fd11f07f4adf589d393f9e816887
Author: Hans Goudey
Date: Thu Dec 8 12:39:18 2022 -0600
Branches: refactor-mesh-corners-generic
https://developer.blender.org/rBa9b193f66350fd11f07f4adf589d393f9e816887
Merge branch 'refactor-mesh-position-generic' into refactor-mesh-corners-generic
===================================================================
===================================================================
diff --cc source/blender/blenkernel/intern/data_transfer.cc
index da645e82fad,267e9a386a5..be9eeb699ad
--- a/source/blender/blenkernel/intern/data_transfer.cc
+++ b/source/blender/blenkernel/intern/data_transfer.cc
@@@ -1572,14 -1570,9 +1572,14 @@@ bool BKE_object_data_transfer_ex(struc
if (mdef && vg_idx != -1 && !weights[LDATA]) {
weights[LDATA] = static_cast<float *>(
- MEM_mallocN(sizeof(*weights[LDATA]) * (size_t)num_loops_dst, __func__));
+ MEM_mallocN(sizeof(*weights[LDATA]) * size_t(num_loops_dst), __func__));
- BKE_defvert_extract_vgroup_to_loopweights(
- mdef, vg_idx, num_verts_dst, loops_dst, num_loops_dst, invert_vgroup, weights[LDATA]);
+ BKE_defvert_extract_vgroup_to_loopweights(mdef,
+ vg_idx,
+ num_verts_dst,
+ corner_verts_dst,
+ num_loops_dst,
+ invert_vgroup,
+ weights[LDATA]);
}
if (data_transfer_layersmapping_generate(&lay_map,
diff --cc source/blender/blenkernel/intern/mesh_remap.cc
index cd1709e3fcb,e6a6f16400a..24d31ca1e1b
--- a/source/blender/blenkernel/intern/mesh_remap.cc
+++ b/source/blender/blenkernel/intern/mesh_remap.cc
@@@ -1430,10 -1426,11 +1428,10 @@@ void BKE_mesh_remap_calc_loops_from_mes
num_loops_src);
if (use_from_vert) {
loop_to_poly_map_src = static_cast<int *>(
- MEM_mallocN(sizeof(*loop_to_poly_map_src) * (size_t)num_loops_src, __func__));
+ MEM_mallocN(sizeof(*loop_to_poly_map_src) * size_t(num_loops_src), __func__));
poly_cents_src = static_cast<float(*)[3]>(
- MEM_mallocN(sizeof(*poly_cents_src) * (size_t)num_polys_src, __func__));
+ MEM_mallocN(sizeof(*poly_cents_src) * size_t(num_polys_src), __func__));
for (pidx_src = 0, mp_src = polys_src; pidx_src < num_polys_src; pidx_src++, mp_src++) {
- ml_src = &loops_src[mp_src->loopstart];
for (plidx_src = 0, lidx_src = mp_src->loopstart; plidx_src < mp_src->totloop;
plidx_src++, lidx_src++) {
loop_to_poly_map_src[lidx_src] = pidx_src;
diff --cc source/blender/geometry/intern/mesh_merge_by_distance.cc
index 721b5ae8f27,d9713abd3b5..19398ff5b53
--- a/source/blender/geometry/intern/mesh_merge_by_distance.cc
+++ b/source/blender/geometry/intern/mesh_merge_by_distance.cc
@@@ -729,9 -750,13 +761,14 @@@ static bool weld_iter_loop_of_poly_next
return false;
}
+ /**
+ * Alloc Weld Polygons and Weld Loops.
+ *
+ * \return r_weld_mesh: Loop and poly members will be allocated here.
+ */
static void weld_poly_loop_ctx_alloc(Span<MPoly> mpoly,
- Span<MLoop> mloop,
+ const Span<int> corner_verts,
+ const Span<int> corner_edges,
Span<int> vert_dest_map,
Span<int> edge_dest_map,
WeldMesh *r_weld_mesh)
@@@ -964,9 -986,16 +1001,17 @@@ static void weld_poly_split_recursive(S
#endif
}
+ /**
+ * Alloc Weld Polygons and Weld Loops.
+ *
+ * \param remain_edge_ctx_len: Context weld edges that won't be destroyed by merging or collapsing.
+ * \param r_vlinks: An uninitialized buffer used to compute groups of WeldPolys attached to each
+ * weld target vertex. It doesn't need to be passed as a parameter but this is
+ * done to reduce allocations.
+ * \return r_weld_mesh: Loop and poly members will be configured here.
+ */
-static void weld_poly_loop_ctx_setup(Span<MLoop> mloop,
+static void weld_poly_loop_ctx_setup(const Span<int> corner_verts,
+ const Span<int> corner_edges,
-
#ifdef USE_WELD_DEBUG
Span<MPoly> mpoly,
#endif
@@@ -1050,10 -1076,9 +1094,10 @@@
for (const WeldPoly &wp : r_weld_mesh->wpoly) {
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, corner_verts, corner_edges, loop_map, nullptr)) {
while (weld_iter_loop_of_poly_next(iter)) {
- v_links[iter.v].len++;
+ r_vlinks[iter.v]++;
}
}
}
@@@ -1067,13 -1093,13 +1112,14 @@@
if (link_len) {
Array<int> link_poly_buffer(link_len);
- for (const int i : IndexRange(r_weld_mesh->wpoly.size())) {
+ /* Use a reverse for loop to ensure that indexes are assigned in ascending order. */
+ for (int i = r_weld_mesh->wpoly.size(); i--;) {
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, corner_verts, corner_edges, loop_map, nullptr)) {
while (weld_iter_loop_of_poly_next(iter)) {
- link_poly_buffer[v_links[iter.v].ofs++] = i;
+ link_poly_buffer[--r_vlinks[iter.v]] = i;
}
}
}
@@@ -1095,13 -1116,12 +1136,13 @@@
}
WeldLoopOfPolyIter iter;
- weld_iter_loop_of_poly_begin(iter, wp, wloop, mloop, loop_map, nullptr);
+ weld_iter_loop_of_poly_begin(
+ iter, wp, wloop, corner_verts, corner_edges, loop_map, nullptr);
weld_iter_loop_of_poly_next(iter);
- struct WeldGroup *link_a = &v_links[iter.v];
- polys_len_a = link_a->len;
+ const int link_a = r_vlinks[iter.v];
+ polys_len_a = r_vlinks[iter.v + 1] - link_a;
if (polys_len_a == 1) {
- BLI_assert(link_poly_buffer[link_a->ofs] == i);
+ BLI_assert(link_poly_buffer[link_a] == i);
continue;
}
int wp_loop_len = wp.loop_len;
@@@ -1200,14 -1219,13 +1242,15 @@@ static void weld_mesh_context_create(co
Array<int> edge_ctx_map(edges.size());
Vector<WeldEdge> wedge = weld_edge_ctx_alloc(edges, vert_dest_map, edge_dest_map, edge_ctx_map);
- Array<WeldGroup> v_links(mvert_len, {0, 0});
+ /* Add +1 to allow calculation of the length of the last group. */
+ Array<int> v_links(mvert_len + 1);
weld_edge_ctx_setup(v_links, edge_dest_map, wedge, &r_weld_mesh->edge_kill_len);
- weld_poly_loop_ctx_alloc(polys, loops, vert_dest_map, edge_dest_map, r_weld_mesh);
+ weld_poly_loop_ctx_alloc(
+ polys, corner_verts, corner_edges, vert_dest_map, edge_dest_map, r_weld_mesh);
- weld_poly_loop_ctx_setup(loops,
+ weld_poly_loop_ctx_setup(corner_verts,
+ corner_edges,
#ifdef USE_WELD_DEBUG
polys,
@@@ -1453,9 -1479,10 +1505,9 @@@ static Mesh *create_merged_mesh(const M
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);
- loop_cur += mp_loop_len;
- for (; mp_loop_len--; r_ml++) {
- r_ml->v = vert_final_map[r_ml->v];
- r_ml->e = edge_final_map[r_ml->e];
+ for (; mp_loop_len--; loop_cur++) {
- dst_corner_verts[loop_cur] = vert_final[dst_corner_verts[loop_cur]];
- dst_corner_edges[loop_cur] = edge_final[dst_corner_edges[loop_cur]];
++ dst_corner_verts[loop_cur] = vert_final_map[dst_corner_verts[loop_cur]];
++ dst_corner_edges[loop_cur] = edge_final_map[dst_corner_edges[loop_cur]];
}
}
else {
@@@ -1477,8 -1499,11 +1529,8 @@@
while (weld_iter_loop_of_poly_next(iter)) {
customdata_weld(
&mesh.ldata, &result->ldata, group_buffer.data(), iter.group_len, loop_cur);
- dst_corner_verts[loop_cur] = vert_final[iter.v];
- dst_corner_edges[loop_cur] = edge_final[iter.e];
- int v = vert_final_map[iter.v];
- int e = edge_final_map[iter.e];
- r_ml->v = v;
- r_ml->e = e;
- r_ml++;
++ dst_corner_verts[loop_cur] = vert_final_map[iter.v];
++ dst_corner_edges[loop_cur] = edge_final_map[iter.e];
loop_cur++;
}
}
@@@ -1510,8 -1530,11 +1562,8 @@@
}
while (weld_iter_loop_of_poly_next(iter)) {
customdata_weld(&mesh.ldata, &result->ldata, group_buffer.data(), iter.group_len, loop_cur);
- dst_corner_verts[loop_cur] = vert_final[iter.v];
- dst_corner_edges[loop_cur] = edge_final[iter.e];
- int v = vert_final_map[iter.v];
- int e = edge_final_map[iter.e];
- r_ml->v = v;
- r_ml->e = e;
- r_ml++;
++ dst_corner_verts[loop_cur] = vert_final_map[iter.v];
++ dst_corner_edges[loop_cur] = edge_final_map[iter.e];
loop_cur++;
}
diff --cc source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cone.cc
index 49b684bfcfc,b69d5d2f29b..fc5492e2e6f
--- a/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cone.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cone.cc
@@@ -369,12 -369,11 +369,12 @@@ static void calculate_cone_edges(const
}
static void calculate_cone_faces(const ConeConfig &config,
- MutableSpan<MLoop> loops,
+ MutableSpan<int> corner_verts,
+ MutableSpan<int> corner_edges,
MutableSpan<MPoly> polys)
{
- int rings_poly_start;
- int rings_loop_start;
+ int rings_poly_start = 0;
+ int rings_loop_start = 0;
if (config.top_has_center_vert) {
rings_poly_start = config.circle_segments;
rings_loop_start = config.circle_segments * 3;
More information about the Bf-blender-cvs
mailing list