52 #ifdef USE_BVHTREEKDOP
73 #define OUT_OF_CONTEXT (uint)(-1)
75 #define ELEM_COLLAPSED (uint)(-2)
77 #define ELEM_MERGED (uint)(-2)
198 #ifdef USE_WELD_DEBUG
203 const uint *loop_map,
208 static void weld_assert_edge_kill_len(
const WeldEdge *wedge,
209 const uint wedge_len,
210 const uint supposed_kill_len)
214 for (
uint i = wedge_len; i--; we++) {
224 static void weld_assert_poly_and_loop_kill_len(
const WeldPoly *wpoly,
226 const uint wpoly_new_len,
229 const uint *loop_map,
230 const uint *poly_map,
232 const uint mpoly_len,
233 const uint mloop_len,
234 const uint supposed_poly_kill_len,
235 const uint supposed_loop_kill_len)
238 uint loop_kills = mloop_len;
239 const MPoly *mp = &mpoly[0];
240 for (
uint i = 0; i < mpoly_len; i++, mp++) {
241 uint poly_ctx = poly_map[i];
243 const WeldPoly *wp = &wpoly[poly_ctx];
258 uint loop_ctx = loop_map[
l];
260 const WeldLoop *wl = &wloop[loop_ctx];
283 for (
uint i = wpoly_new_len; i--; wp++) {
292 uint loop_ctx = loop_map[
l];
294 const WeldLoop *wl = &wloop[loop_ctx];
311 BLI_assert(poly_kills == supposed_poly_kill_len);
312 BLI_assert(loop_kills == supposed_loop_kill_len);
315 static void weld_assert_poly_no_vert_repetition(
const WeldPoly *wp,
318 const uint *loop_map)
332 for (
uint i = 0; i <
len; i++) {
334 for (
uint j = i + 1; j <
len; j++) {
352 const WeldLoop *wl_end = &wloop[end_wloop - 1];
355 for (; wl <= wl_end; wl++) {
374 uint *r_vert_dest_map,
382 wvert =
MEM_mallocN(
sizeof(*wvert) * mvert_len, __func__);
385 uint *v_dest_iter = &r_vert_dest_map[0];
386 for (
uint i = 0; i < mvert_len; i++, v_dest_iter++) {
395 *r_wvert =
MEM_reallocN(wvert,
sizeof(*wvert) * wvert_len);
396 *r_wvert_len = wvert_len;
400 const uint wvert_len,
402 const uint *vert_dest_map,
403 uint *r_vert_groups_map,
404 uint **r_vert_groups_buffer,
409 uint wgroups_len = 0;
410 const uint *vert_dest_iter = &vert_dest_map[0];
411 uint *group_map_iter = &r_vert_groups_map[0];
412 for (
uint i = 0; i < mvert_len; i++, group_map_iter++, vert_dest_iter++) {
413 uint vert_dest = *vert_dest_iter;
415 if (vert_dest != i) {
419 *group_map_iter = wgroups_len;
431 for (
uint i = wvert_len; i--; wv++) {
433 wgroups[group_index].
len++;
438 for (
uint i = wgroups_len; i--; wg_iter++) {
447 for (
uint i = wvert_len; i--; wv++) {
449 groups_buffer[wgroups[group_index].
ofs++] = wv->
vert_orig;
452 wg_iter = &wgroups[0];
453 for (
uint i = wgroups_len; i--; wg_iter++) {
454 wg_iter->
ofs -= wg_iter->
len;
457 *r_vert_groups = wgroups;
458 *r_vert_groups_buffer = groups_buffer;
468 const uint wedge_len,
470 uint *r_edge_dest_map,
472 uint *r_edge_kiil_len)
477 uint edge_kill_len = 0;
481 vl_iter = &v_links[0];
484 for (
uint i = wedge_len; i--; we++) {
488 if (dst_vert_a == dst_vert_b) {
496 v_links[dst_vert_a].
len++;
497 v_links[dst_vert_b].
len++;
501 vl_iter = &v_links[0];
502 for (
uint i = mvert_len; i--; vl_iter++) {
503 vl_iter->
ofs = link_len;
504 link_len += vl_iter->
len;
508 uint *link_edge_buffer =
MEM_mallocN(
sizeof(*link_edge_buffer) * link_len, __func__);
511 for (
uint i = 0; i < wedge_len; i++, we++) {
519 link_edge_buffer[v_links[dst_vert_a].
ofs++] = i;
520 link_edge_buffer[v_links[dst_vert_b].ofs++] = i;
523 vl_iter = &v_links[0];
524 for (
uint i = mvert_len; i--; vl_iter++) {
526 vl_iter->
ofs -= vl_iter->
len;
530 for (
uint i = 0; i < wedge_len; i++, we++) {
540 struct WeldGroup *link_a = &v_links[dst_vert_a];
541 struct WeldGroup *link_b = &v_links[dst_vert_b];
543 uint edges_len_a = link_a->
len;
544 uint edges_len_b = link_b->
len;
546 if (edges_len_a <= 1 || edges_len_b <= 1) {
550 uint *edges_ctx_a = &link_edge_buffer[link_a->
ofs];
551 uint *edges_ctx_b = &link_edge_buffer[link_b->
ofs];
554 for (; edges_len_a--; edges_ctx_a++) {
555 uint e_ctx_a = *edges_ctx_a;
559 while (edges_len_b && *edges_ctx_b < e_ctx_a) {
563 if (edges_len_b == 0) {
566 uint e_ctx_b = *edges_ctx_b;
567 if (e_ctx_a == e_ctx_b) {
573 r_edge_dest_map[we_b->
edge_orig] = edge_orig;
580 #ifdef USE_WELD_DEBUG
581 weld_assert_edge_kill_len(r_wedge, wedge_len, edge_kill_len);
587 *r_edge_kiil_len = edge_kill_len;
591 const uint medge_len,
592 const uint *vert_dest_map,
593 uint *r_edge_dest_map,
594 uint **r_edge_ctx_map,
603 wedge =
MEM_mallocN(
sizeof(*wedge) * medge_len, __func__);
606 const MEdge *me = &medge[0];
607 uint *e_dest_iter = &r_edge_dest_map[0];
608 uint *iter = &edge_map[0];
609 for (
uint i = 0; i < medge_len; i++, me++, iter++, e_dest_iter++) {
612 uint v_dest_1 = vert_dest_map[
v1];
613 uint v_dest_2 = vert_dest_map[
v2];
629 *r_wedge =
MEM_reallocN(wedge,
sizeof(*wedge) * wedge_len);
630 *r_wedge_len = wedge_len;
631 *r_edge_ctx_map = edge_map;
635 const uint edge_kill_len,
636 const uint wedge_len,
638 const uint *wedge_map,
639 uint *r_edge_groups_map,
640 uint **r_edge_groups_buffer,
648 uint wgroups_len = wedge_len - edge_kill_len;
649 wegroups =
MEM_callocN(
sizeof(*wegroups) * wgroups_len, __func__);
650 wegrp_iter = &wegroups[0];
653 const uint *edge_ctx_iter = &wedge_map[0];
654 uint *group_map_iter = &r_edge_groups_map[0];
655 for (
uint i = medge_len; i--; edge_ctx_iter++, group_map_iter++) {
656 uint edge_ctx = *edge_ctx_iter;
668 *group_map_iter = wgroups_len;
678 BLI_assert(wgroups_len == wedge_len - edge_kill_len);
681 for (
uint i = wedge_len; i--; we++) {
690 wegrp_iter = &wegroups[0];
691 for (
uint i = wgroups_len; i--; wegrp_iter++) {
696 uint *groups_buffer =
MEM_mallocN(
sizeof(*groups_buffer) * ofs, __func__);
698 for (
uint i = wedge_len; i--; we++) {
706 wegrp_iter = &wegroups[0];
707 for (
uint i = wgroups_len; i--; wegrp_iter++) {
711 *r_edge_groups_buffer = groups_buffer;
712 *r_edge_groups = wegroups;
725 const uint *loop_map,
737 iter->
group = group_buffer;
742 uint loop_start, loop_end,
l;
745 while (
l >= loop_start) {
746 const uint loop_ctx = loop_map[
l];
748 const WeldLoop *wl = &wloop[loop_ctx];
757 group_len = loop_end -
l;
759 while (
l < loop_end) {
767 #ifdef USE_WELD_DEBUG
785 while (
l <= loop_end) {
787 const uint loop_ctx = loop_map[
l];
789 const WeldLoop *wl = &wloop[loop_ctx];
800 #ifdef USE_WELD_DEBUG
809 #ifdef USE_WELD_DEBUG
827 const uint mpoly_len,
829 const uint mloop_len,
830 const uint *vert_dest_map,
831 const uint *edge_dest_map,
839 uint max_ctx_poly_len = 4;
842 wloop =
MEM_mallocN(
sizeof(*wloop) * mloop_len, __func__);
846 wpoly =
MEM_mallocN(
sizeof(*wpoly) * mpoly_len, __func__);
849 uint maybe_new_poly = 0;
851 const MPoly *mp = &mpoly[0];
852 uint *iter = &poly_map[0];
853 uint *loop_map_iter = &loop_map[0];
854 for (
uint i = 0; i < mpoly_len; i++, mp++, iter++) {
858 uint vert_ctx_len = 0;
861 uint prev_wloop_len = wloop_len;
862 const MLoop *ml = &mloop[
l];
863 for (
uint j = totloop; j--;
l++, ml++, loop_map_iter++) {
866 uint v_dest = vert_dest_map[
v];
867 uint e_dest = edge_dest_map[
e];
873 if (is_vert_ctx || is_edge_ctx) {
874 wl->
vert = is_vert_ctx ? v_dest :
v;
875 wl->
edge = is_edge_ctx ? e_dest :
e;
880 *loop_map_iter = wloop_len++;
886 if (wloop_len != prev_wloop_len) {
887 uint loops_len = wloop_len - prev_wloop_len;
894 wp->
loop_end = loopstart + totloop - 1;
899 if (totloop > 5 && vert_ctx_len > 1) {
900 uint max_new = (totloop / 3) - 1;
902 maybe_new_poly +=
MIN2(max_new, vert_ctx_len);
911 if (mpoly_len < (wpoly_len + maybe_new_poly)) {
913 wpoly =
MEM_mallocN(
sizeof(*wpoly) * ((
size_t)wpoly_len + maybe_new_poly), __func__);
914 memcpy(wpoly, wpoly_tmp,
sizeof(*wpoly) * wpoly_len);
918 WeldPoly *poly_new = &wpoly[wpoly_len];
921 r_weld_mesh->
wpoly = wpoly;
932 #ifdef USE_WELD_DEBUG
942 if (poly_len > 3 && ctx_verts_len > 1) {
950 WeldLoop *poly_loops = &wloop[ctx_loops_ofs];
952 WeldLoop *wla_prev = &poly_loops[ctx_loops_len - 1];
956 const uint la_len = ctx_loops_len - 1;
957 for (
uint la = 0; la < la_len; la++, wla++) {
970 for (; lb < ctx_loops_len; lb++, wlb++) {
980 if (vert_a == vert_b) {
982 const uint dist_b = poly_len - dist_a;
985 if (dist_a == 1 || dist_b == 1) {
1001 if (wl_tmp !=
NULL) {
1015 if (wl_tmp ==
NULL) {
1016 const uint new_loops_len = lb - la;
1017 const uint new_loops_ofs = ctx_loops_ofs + la;
1026 new_wp->
len = dist_a;
1028 #ifdef USE_WELD_DEBUG
1062 r_wp->
len = poly_len;
1063 *r_loop_kill += loop_kill;
1065 #ifdef USE_WELD_DEBUG
1066 weld_assert_poly_no_vert_repetition(r_wp, wloop, mloop, r_weld_mesh->
loop_map);
1072 #ifdef USE_WELD_DEBUG
1074 const uint mpoly_len,
1075 const uint mloop_len,
1077 const uint mvert_len,
1078 const uint *vert_dest_map,
1079 const uint remain_edge_ctx_len,
1083 uint poly_kill_len, loop_kill_len, wpoly_len, wpoly_new_len;
1088 wpoly = r_weld_mesh->
wpoly;
1089 wloop = r_weld_mesh->
wloop;
1098 if (remain_edge_ctx_len) {
1103 for (
uint i = wpoly_len; i--; wp++) {
1108 uint ctx_verts_len = 0;
1109 wl = &wloop[ctx_loops_ofs];
1110 for (
uint l = ctx_loops_len;
l--; wl++) {
1114 if (poly_len == 3) {
1134 #ifdef USE_WELD_DEBUG
1135 weld_assert_poly_len(wp, wloop);
1139 #ifdef USE_WELD_DEBUG
1152 #ifdef USE_WELD_DEBUG
1153 weld_assert_poly_and_loop_kill_len(wpoly,
1169 uint wpoly_and_new_len = wpoly_len + wpoly_new_len;
1171 struct WeldGroup *vl_iter, *v_links = r_vlinks;
1172 memset(v_links, 0,
sizeof(*v_links) * mvert_len);
1175 for (
uint i = wpoly_and_new_len; i--; wp++) {
1179 v_links[iter.
v].
len++;
1185 vl_iter = &v_links[0];
1186 for (
uint i = mvert_len; i--; vl_iter++) {
1187 vl_iter->
ofs = link_len;
1188 link_len += vl_iter->
len;
1192 uint *link_poly_buffer =
MEM_mallocN(
sizeof(*link_poly_buffer) * link_len, __func__);
1195 for (
uint i = 0; i < wpoly_and_new_len; i++, wp++) {
1199 link_poly_buffer[v_links[iter.
v].
ofs++] = i;
1204 vl_iter = &v_links[0];
1205 for (
uint i = mvert_len; i--; vl_iter++) {
1207 vl_iter->
ofs -= vl_iter->
len;
1210 uint polys_len_a, polys_len_b, *polys_ctx_a, *polys_ctx_b, p_ctx_a, p_ctx_b;
1211 polys_len_b = p_ctx_b = 0;
1214 for (
uint i = 0; i < wpoly_and_new_len; i++, wp++) {
1225 polys_len_a = link_a->
len;
1226 if (polys_len_a == 1) {
1231 polys_ctx_a = &link_poly_buffer[link_a->
ofs];
1232 for (; polys_len_a--; polys_ctx_a++) {
1233 p_ctx_a = *polys_ctx_a;
1238 WeldPoly *wp_tmp = &wpoly[p_ctx_a];
1239 if (wp_tmp->
len != wp_len) {
1245 struct WeldGroup *link_b = &v_links[iter_b.
v];
1246 polys_len_b = link_b->
len;
1247 if (polys_len_b == 1) {
1253 polys_ctx_b = &link_poly_buffer[link_b->
ofs];
1254 for (; polys_len_b; polys_len_b--, polys_ctx_b++) {
1255 p_ctx_b = *polys_ctx_b;
1256 if (p_ctx_b < p_ctx_a) {
1259 if (p_ctx_b >= p_ctx_a) {
1260 if (p_ctx_b > p_ctx_a) {
1266 if (polys_len_b == 0) {
1270 if (polys_len_b == 0) {
1278 loop_kill_len += wp_tmp->
len;
1290 for (
uint i = wpoly_len; i--; wp++) {
1295 #ifdef USE_WELD_DEBUG
1296 weld_assert_poly_and_loop_kill_len(wpoly,
1322 uint *vert_dest_map,
1323 const uint vert_kill_len,
1334 uint *edge_dest_map =
MEM_mallocN(
sizeof(*edge_dest_map) * medge_len, __func__);
1346 medge, medge_len, vert_dest_map, edge_dest_map, &edge_ctx_map, &wedge, &wedge_len);
1349 mvert_len, wedge_len, v_links, edge_dest_map, wedge, &r_weld_mesh->
edge_kill_len);
1352 mpoly, mpoly_len, mloop, mloop_len, vert_dest_map, edge_dest_map, r_weld_mesh);
1355 #ifdef USE_WELD_DEBUG
1424 float co[3] = {0.0f, 0.0f, 0.0f};
1425 #ifdef USE_WELD_NORMALS
1426 float no[3] = {0.0f, 0.0f, 0.0f};
1434 for (src_i = 0; src_i < source->
totlayer; src_i++) {
1440 while (dest_i < dest->totlayer && dest->
layers[dest_i].
type <
type) {
1454 for (j = 0; j <
count; j++) {
1455 MVert *mv_src = &((
MVert *)src_data)[src_indices[j]];
1457 #ifdef USE_WELD_NORMALS
1458 short *mv_src_no = mv_src->
no;
1459 no[0] += mv_src_no[0];
1460 no[1] += mv_src_no[1];
1461 no[2] += mv_src_no[2];
1464 flag |= mv_src->
flag;
1468 for (j = 0; j <
count; j++) {
1469 MEdge *me_src = &((
MEdge *)src_data)[src_indices[j]];
1470 crease += me_src->
crease;
1472 flag |= me_src->
flag;
1483 for (j = 0; j <
count; j++) {
1500 float fac = 1.0f /
count;
1502 for (dest_i = 0; dest_i < dest->
totlayer; dest_i++) {
1512 #ifdef USE_WELD_NORMALS
1514 short *mv_no =
mv->no;
1515 mv_no[0] = (short)no[0];
1516 mv_no[1] = (short)no[1];
1517 mv_no[2] = (short)no[2];
1520 mv->flag = (char)flag;
1521 mv->bweight = (char)bweight;
1530 me->
crease = (char)crease;
1539 void *dst_data = layer_dst->
data;
1552 #ifdef USE_BVHTREEKDOP
1553 struct WeldOverlapData {
1555 float merge_dist_sq;
1557 static bool bvhtree_weld_overlap_cb(
void *userdata,
int index_a,
int index_b,
int UNUSED(
thread))
1559 if (index_a < index_b) {
1560 struct WeldOverlapData *
data = userdata;
1562 const float dist_sq =
len_squared_v3v3(mvert[index_a].co, mvert[index_b].co);
1563 BLI_assert(dist_sq <= ((
data->merge_dist_sq + FLT_EPSILON) * 3));
1564 return dist_sq <=
data->merge_dist_sq;
1586 const MPoly *mpoly, *mp;
1587 uint totvert, totedge, totloop, totpoly;
1594 if (defgrp_index != -1) {
1601 for (
uint i = 0; i < totvert; i++, dv++) {
1603 if (found != invert_vgroup) {
1614 uint vert_kill_len = 0;
1616 #ifdef USE_BVHTREEKDOP
1634 struct WeldOverlapData
data;
1642 bvhtree_weld_overlap_cb,
1652 for (
uint i = 0; i < overlap_len; i++, overlap_iter++) {
1658 uint va_dst = vert_dest_map[indexA];
1659 while (va_dst != vert_dest_map[va_dst]) {
1660 va_dst = vert_dest_map[va_dst];
1662 uint vb_dst = vert_dest_map[indexB];
1663 while (vb_dst != vert_dest_map[vb_dst]) {
1664 vb_dst = vert_dest_map[vb_dst];
1666 if (va_dst == vb_dst) {
1669 if (va_dst > vb_dst) {
1673 vert_dest_map[vb_dst] = va_dst;
1677 for (
uint i = 0; i < totvert; i++) {
1678 if (i == vert_dest_map[i]) {
1684 v = vert_dest_map[
v];
1686 vert_dest_map[
v] =
v;
1687 vert_dest_map[i] =
v;
1697 KDTree_3d *
tree = BLI_kdtree_3d_new(v_mask ? v_mask_act : totvert);
1698 for (
uint i = 0; i < totvert; i++) {
1700 BLI_kdtree_3d_insert(
tree, i, mvert[i].co);
1705 BLI_kdtree_3d_balance(
tree);
1706 vert_kill_len = BLI_kdtree_3d_calc_duplicates_fast(
1708 BLI_kdtree_3d_free(
tree);
1721 totvert,
sizeof(*vert_clusters), __func__);
1723 for (
uint i = 0; i < totvert; i++, vc++) {
1733 for (
uint i = 0; i < totedge; i++, me++) {
1737 while (
v1 != vert_dest_map[
v1]) {
1738 v1 = vert_dest_map[
v1];
1740 while (
v2 != vert_dest_map[
v2]) {
1741 v2 = vert_dest_map[
v2];
1758 if (dist_sq <= merge_dist_sq) {
1764 vert_dest_map[
v2] =
v1;
1771 for (
uint i = 0; i < totvert; i++) {
1772 if (i == vert_dest_map[i]) {
1778 v = vert_dest_map[
v];
1780 vert_dest_map[
v] =
v;
1781 vert_dest_map[i] =
v;
1790 if (vert_kill_len) {
1801 const int result_nverts = totvert - weld_mesh.
vert_kill_len;
1802 const int result_nedges = totedge - weld_mesh.
edge_kill_len;
1803 const int result_nloops = totloop - weld_mesh.
loop_kill_len;
1807 mesh, result_nverts, result_nedges, 0, result_nloops, result_npolys);
1811 uint *vert_final = vert_dest_map;
1812 uint *index_iter = &vert_final[0];
1814 for (
uint i = 0; i < totvert; i++, index_iter++) {
1815 int source_index = i;
1818 *index_iter = dest_index +
count;
1825 dest_index +=
count;
1837 *index_iter = dest_index;
1847 index_iter = &edge_final[0];
1849 for (
uint i = 0; i < totedge; i++, index_iter++) {
1850 int source_index = i;
1853 *index_iter = dest_index +
count;
1861 dest_index +=
count;
1862 for (;
count--; me++) {
1863 me->
v1 = vert_final[me->
v1];
1864 me->
v2 = vert_final[me->
v2];
1878 me->
v1 = vert_final[wegrp->
v1];
1879 me->
v2 = vert_final[wegrp->
v2];
1882 *index_iter = dest_index;
1897 for (
uint i = 0; i < totpoly; i++, mp++) {
1898 int loop_start = loop_cur;
1903 loop_cur += mp_loop_len;
1904 for (; mp_loop_len--; r_ml++) {
1905 r_ml->
v = vert_final[r_ml->
v];
1906 r_ml->
e = edge_final[r_ml->
e];
1913 &iter, wp, weld_mesh.
wloop, mloop, weld_mesh.
loop_map, group_buffer)) {
1922 uint v = vert_final[iter.
v];
1923 uint e = edge_final[iter.
e];
1937 r_mp->
totloop = loop_cur - loop_start;
1944 int loop_start = loop_cur;
1947 &iter, wp, weld_mesh.
wloop, mloop, weld_mesh.
loop_map, group_buffer)) {
1956 uint v = vert_final[iter.
v];
1957 uint e = edge_final[iter.
e];
1969 r_mp->
totloop = loop_cur - loop_start;
void free_bvhtree_from_mesh(struct BVHTreeFromMesh *data)
BVHTree * bvhtree_from_mesh_verts_ex(struct BVHTreeFromMesh *data, const struct MVert *vert, const int verts_num, const bool vert_allocated, const BLI_bitmap *mask, int verts_num_active, float epsilon, int tree_type, int axis, const BVHCacheType bvh_cache_type, struct BVHCache **bvh_cache_p, ThreadMutex *mesh_eval_mutex)
void CustomData_copy_layer_type_data(const struct CustomData *source, struct CustomData *destination, int type, int source_index, int destination_index, int count)
bool CustomData_layer_has_interp(const struct CustomData *data, int layer_n)
void CustomData_data_add(int type, void *data1, const void *data2)
void CustomData_interp(const struct CustomData *source, struct CustomData *dest, const int *src_indices, const float *weights, const float *sub_weights, int count, int dest_index)
void CustomData_data_multiply(int type, void *data, float fac)
void * CustomData_get_layer(const struct CustomData *data, int type)
int CustomData_sizeof(int type)
bool CustomData_layer_has_math(const struct CustomData *data, int layer_n)
void CustomData_copy_data(const struct CustomData *source, struct CustomData *dest, int source_index, int dest_index, int count)
struct Mesh * BKE_mesh_new_nomain_from_template(const struct Mesh *me_src, int verts_len, int edges_len, int tessface_len, int loops_len, int polys_len)
@ eModifierTypeFlag_AcceptsCVs
@ eModifierTypeFlag_SupportsMapping
@ eModifierTypeFlag_EnableInEditmode
@ eModifierTypeFlag_SupportsEditmode
@ eModifierTypeFlag_AcceptsMesh
void BKE_modifier_copydata_generic(const struct ModifierData *md, struct ModifierData *md_dst, const int flag)
@ eModifierTypeType_Constructive
#define BLI_array_alloca(arr, realsize)
#define BLI_BITMAP_TEST(_bitmap, _index)
#define BLI_BITMAP_ENABLE(_bitmap, _index)
#define BLI_BITMAP_NEW(_tot, _alloc_string)
@ BVH_OVERLAP_RETURN_PAIRS
BVHTreeOverlap * BLI_bvhtree_overlap_ex(const BVHTree *tree1, const BVHTree *tree2, uint *r_overlap_tot, BVHTree_OverlapCallback callback, void *userdata, const uint max_interactions, const int flag)
A kd-tree for nearest neighbor search.
MINLINE float square_f(float a)
MINLINE float len_squared_v3(const float v[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void madd_v3_v3fl(float r[3], const float a[3], float f)
MINLINE float len_squared_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void sub_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void mul_v3_fl(float r[3], float f)
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE void add_v3_v3(float r[3], const float a[3])
void range_vn_u(unsigned int *array_tar, const int size, const unsigned int start)
#define MEMCMP_STRUCT_AFTER_IS_ZERO(struct_var, member)
#define POINTER_OFFSET(v, ofs)
#define MEMCPY_STRUCT_AFTER(struct_dst, struct_src, member)
#define CD_MASK_MDEFORMVERT
#define DNA_struct_default_get(struct_name)
struct WeldModifierData WeldModifierData
@ MOD_WELD_MODE_CONNECTED
Object is a sort of wrapper for general info.
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble v1
Read Guarded memory(de)allocation.
#define MEM_reallocN(vmemh, len)
PointerRNA * modifier_panel_get_property_pointers(Panel *panel, PointerRNA *r_ob_ptr)
void modifier_panel_end(uiLayout *layout, PointerRNA *ptr)
PanelType * modifier_panel_register(ARegionType *region_type, ModifierType type, PanelDrawFn draw)
void modifier_vgroup_ui(uiLayout *layout, PointerRNA *ptr, PointerRNA *ob_ptr, const char *vgroup_prop, const char *invert_vgroup_prop, const char *text)
struct WeldLoopOfPolyIter WeldLoopOfPolyIter
static void weld_vert_ctx_alloc_and_setup(const uint mvert_len, uint *r_vert_dest_map, WeldVert **r_wvert, uint *r_wvert_len)
static Mesh * modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
static void weld_edge_ctx_setup(const uint mvert_len, const uint wedge_len, struct WeldGroup *r_vlinks, uint *r_edge_dest_map, WeldEdge *r_wedge, uint *r_edge_kiil_len)
static void weld_edge_ctx_alloc(const MEdge *medge, const uint medge_len, const uint *vert_dest_map, uint *r_edge_dest_map, uint **r_edge_ctx_map, WeldEdge **r_wedge, uint *r_wedge_len)
static void weld_poly_loop_ctx_setup(const MLoop *mloop, const uint mvert_len, const uint *vert_dest_map, const uint remain_edge_ctx_len, struct WeldGroup *r_vlinks, WeldMesh *r_weld_mesh)
ModifierTypeInfo modifierType_Weld
static void weld_mesh_context_create(const Mesh *mesh, uint *vert_dest_map, const uint vert_kill_len, WeldMesh *r_weld_mesh)
static void weld_edge_groups_setup(const uint medge_len, const uint edge_kill_len, const uint wedge_len, WeldEdge *wedge, const uint *wedge_map, uint *r_edge_groups_map, uint **r_edge_groups_buffer, struct WeldGroupEdge **r_edge_groups)
static void weld_mesh_context_free(WeldMesh *weld_mesh)
static void panel_draw(const bContext *UNUSED(C), Panel *panel)
static void initData(ModifierData *md)
static void panelRegister(ARegionType *region_type)
static void customdata_weld(const CustomData *source, CustomData *dest, const uint *src_indices, int count, int dest_index)
static bool weld_iter_loop_of_poly_next(WeldLoopOfPolyIter *iter)
static void weld_poly_split_recursive(const uint *vert_dest_map, uint ctx_verts_len, WeldPoly *r_wp, WeldMesh *r_weld_mesh, uint *r_poly_kill, uint *r_loop_kill)
static void weld_vert_groups_setup(const uint mvert_len, const uint wvert_len, const WeldVert *wvert, const uint *vert_dest_map, uint *r_vert_groups_map, uint **r_vert_groups_buffer, struct WeldGroup **r_vert_groups)
static bool weld_iter_loop_of_poly_begin(WeldLoopOfPolyIter *iter, const WeldPoly *wp, const WeldLoop *wloop, const MLoop *mloop, const uint *loop_map, uint *group_buffer)
static Mesh * weldModifier_doWeld(WeldModifierData *wmd, const ModifierEvalContext *ctx, Mesh *mesh)
static void weld_poly_loop_ctx_alloc(const MPoly *mpoly, const uint mpoly_len, const MLoop *mloop, const uint mloop_len, const uint *vert_dest_map, const uint *edge_dest_map, WeldMesh *r_weld_mesh)
static void requiredDataMask(Object *UNUSED(ob), ModifierData *md, CustomData_MeshMasks *r_cddata_masks)
StructRNA RNA_WeldModifier
void uiLayoutSetPropSep(uiLayout *layout, bool is_sep)
void uiItemR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int flag, const char *name, int icon)
ATTR_WARN_UNUSED_RESULT const BMVert * v2
ATTR_WARN_UNUSED_RESULT const BMLoop * l
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
ATTR_WARN_UNUSED_RESULT const BMVert * v
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
void *(* MEM_malloc_arrayN)(size_t len, size_t size, const char *str)
void(* MEM_freeN)(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
void *(* MEM_mallocN)(size_t len, const char *str)
struct CustomData pdata ldata
uint * vert_groups_buffer
struct WeldGroup * vert_groups
struct WeldGroupEdge * edge_groups
uint * edge_groups_buffer