199 const Mesh *mesh = meshData;
211 const int quad_ord[4] = {
217 const int quad_ord_ofs[4] = {
224 uint maxVerts = 0, maxEdges = 0, maxPolys = 0;
229 uint *edge_face_map =
nullptr;
230 uint *vert_loop_map =
nullptr;
233 const uint uv_map_layers_tot =
uint(
238 float uv_v_range_inv;
239 float uv_axis_plane[4];
241 char axis_char =
'X';
245 float axis_vec[3] = {0.0f, 0.0f, 0.0f};
246 float tmp_vec1[3], tmp_vec2[3];
250 float mtx_tx_inv[4][4];
251 float mtx_tmp_a[4][4];
253 uint vc_tot_linked = 0;
254 short other_axis_1, other_axis_2;
255 const float *tmpf1, *tmpf2;
271 switch (ltmd->
axis) {
286 axis_vec[ltmd->
axis] = 1.0f;
288 if (ob_axis !=
nullptr) {
291 copy_m4_m4(mtx_tx_inv, ob_axis->object_to_world().ptr());
301 float totlen =
len_v3(mtx_tx[3]);
303 if (totlen != 0.0f) {
304 const float zero[3] = {0.0f, 0.0f, 0.0f};
316 if (ltmd->
flag & MOD_SCREW_OBJECT_ANGLE) {
320 float vec[3] = {0, 1, 0};
339 if (
len_v3v3(axis_tmp, axis_vec) > 1.0f) {
347 axis_char = char(axis_char + ltmd->
axis);
351 axis_vec[ltmd->
axis] = 1.0f;
357 uv_u_scale = 1.0f /
float(step_tot);
360 step_tot = ((step_tot + 1) * ltmd->
iter) - (ltmd->
iter - 1);
365 if (
fabsf(screw_ofs) <= (FLT_EPSILON * 100.0f) &&
371 maxVerts = totvert * step_tot;
372 maxEdges = (totvert * step_tot) +
373 (totedge * step_tot);
374 maxPolys = totedge * step_tot;
380 step_tot = std::max<uint>(step_tot, 2);
382 maxVerts = totvert * step_tot;
383 maxEdges = (totvert * (step_tot - 1)) +
384 (totedge * step_tot);
385 maxPolys = totedge * (step_tot - 1);
396 mesh,
int(maxVerts),
int(maxEdges),
int(maxPolys),
int(maxPolys) * 4);
421 int *origindex =
static_cast<int *
>(
426 if (uv_map_layers_tot) {
427 const float zero_co[3] = {0};
431 if (uv_map_layers_tot) {
433 for (uv_lay = 0; uv_lay < uv_map_layers_tot; uv_lay++) {
439 for (
uint i = 0;
i < totvert;
i++) {
441 uv_v_minmax[0] =
min_ff(
v, uv_v_minmax[0]);
442 uv_v_minmax[1] =
max_ff(
v, uv_v_minmax[1]);
448 uv_v_range_inv = uv_v_minmax[1] - uv_v_minmax[0];
449 uv_v_range_inv = uv_v_range_inv ? 1.0f / uv_v_range_inv : 0.0f;
456 edge_new = edges_new.
data();
457 for (
uint i = 0;
i < totedge;
i++, edge_orig++, edge_new++) {
458 *edge_new = *edge_orig;
465 memset(edge_face_map, 0xff,
sizeof(*edge_face_map) * totedge);
468 memset(vert_loop_map, 0xff,
sizeof(*vert_loop_map) * totvert);
471 for (
const int64_t corner : faces_orig[
i]) {
472 const int vert_i = corner_verts_orig[corner];
473 const int edge_i = corner_edges_orig[corner];
474 edge_face_map[edge_i] =
uint(
i);
475 vert_loop_map[vert_i] =
uint(corner);
478 if (edges_new[edge_i][0] != vert_i) {
479 std::swap(edges_new[edge_i][0], edges_new[edge_i][1]);
500 edge_new = edges_new.
data();
502 if (ob_axis !=
nullptr) {
504 for (
uint i = 0;
i < totvert;
i++, vc++) {
505 vc->
co[0] = vert_positions_new[
i][0] = vert_positions_orig[
i][0];
506 vc->
co[1] = vert_positions_new[
i][1] = vert_positions_orig[
i][1];
507 vc->
co[2] = vert_positions_new[
i][2] = vert_positions_orig[
i][2];
510 vc->
e[0] = vc->
e[1] =
nullptr;
515 vc->
dist_sq = vc->
co[other_axis_1] * vc->
co[other_axis_1] +
516 vc->
co[other_axis_2] * vc->
co[other_axis_2];
522 for (
uint i = 0;
i < totvert;
i++, vc++) {
523 vc->
co[0] = vert_positions_new[
i][0] = vert_positions_orig[
i][0];
524 vc->
co[1] = vert_positions_new[
i][1] = vert_positions_orig[
i][1];
525 vc->
co[2] = vert_positions_new[
i][2] = vert_positions_orig[
i][2];
528 vc->
e[0] = vc->
e[1] =
nullptr;
532 vc->
dist_sq = vc->
co[other_axis_1] * vc->
co[other_axis_1] +
533 vc->
co[other_axis_2] * vc->
co[other_axis_2];
540 for (
uint i = 0;
i < totedge;
i++, edge_new++) {
541 vc = &vert_connect[(*edge_new)[0]];
544 vc->
v[0] =
uint((*edge_new)[1]);
548 vc->
v[1] =
uint((*edge_new)[1]);
555 vc = &vert_connect[(*edge_new)[1]];
559 vc->
v[0] =
uint((*edge_new)[0]);
563 vc->
v[1] =
uint((*edge_new)[0]);
573 for (
uint i = 0;
i < totvert;
i++, vc++) {
583 bool ed_loop_flip =
false;
587 for (j = 0; j < 2; j++) {
604 if (fl <= lt_iter.v_poin->dist_sq) {
623 if (vc_tot_linked > 1) {
624 float vf_1, vf_2, vf_best;
626 vc_tmp = &vert_connect[v_best];
628 tmpf1 = vert_connect[vc_tmp->
v[0]].
co;
629 tmpf2 = vert_connect[vc_tmp->
v[1]].
co;
636 vf_1 = tmpf1[ltmd->
axis];
637 vf_2 = tmpf2[ltmd->
axis];
638 vf_best = vc_tmp->
co[ltmd->
axis];
640 if (vf_1 < vf_best && vf_best < vf_2) {
641 ed_loop_flip =
false;
643 else if (vf_1 > vf_best && vf_best > vf_2) {
653 if (tmp_vec1[ltmd->
axis] < tmp_vec2[ltmd->
axis]) {
657 ed_loop_flip =
false;
663 if (tmpf1[ltmd->
axis] < vc_tmp->
co[ltmd->
axis]) {
667 ed_loop_flip =
false;
672 printf(
"No Connected ___\n");
682 ed_loop_flip = !ed_loop_flip;
687 ed_loop_flip = !ed_loop_flip;
691 for (j = ed_loop_closed; j < 2; j++) {
702 ed_loop_flip = !ed_loop_flip;
710 if (lt_iter.
v ==
uint((*lt_iter.
e)[0])) {
711 if (ed_loop_flip == 0) {
713 std::swap((*lt_iter.
e)[0], (*lt_iter.
e)[1]);
717 printf(
"\t\t\tFlipping Not 0\n");
721 else if (lt_iter.
v ==
uint((*lt_iter.
e)[1])) {
722 if (ed_loop_flip == 1) {
724 std::swap((*lt_iter.
e)[0], (*lt_iter.
e)[1]);
728 printf(
"\t\t\tFlipping Not 1\n");
734 printf(
"\t\tIncorrect edge topology");
740 printf(
"\t\tNo Edge at this point\n");
752 for (
uint i = 0;
i < totvert;
i++) {
753 copy_v3_v3(vert_positions_new[
i], vert_positions_orig[
i]);
760 const uint varray_stride = totvert *
step;
766 if (ob_axis !=
nullptr) {
775 madd_v3_v3fl(mat[3], axis_vec, screw_ofs * (
float(
step) /
float(step_tot - 1)));
780 &mesh->
vert_data, &
result->vert_data, 0,
int(varray_stride),
int(totvert));
783 for (j = 0; j < totvert; j++) {
784 const int vert_new = int(varray_stride) + int(j);
786 copy_v3_v3(vert_positions_new[vert_new], vert_positions_new[j]);
791 if (ob_axis !=
nullptr) {
792 sub_v3_v3(vert_positions_new[vert_new], mtx_tx[3]);
794 mul_m4_v3(mat, vert_positions_new[vert_new]);
796 add_v3_v3(vert_positions_new[vert_new], mtx_tx[3]);
799 mul_m4_v3(mat, vert_positions_new[vert_new]);
803 (*edge_new)[0] = int(varray_stride + j);
804 (*edge_new)[1] = (*edge_new)[0] - int(totvert);
812 vert_connect =
nullptr;
817 const uint varray_stride = (step_tot - 1) * totvert;
819 for (
uint i = 0;
i < totvert;
i++) {
820 (*edge_new)[0] = int(
i);
821 (*edge_new)[1] = int(varray_stride +
i);
826 int new_loop_index = 0;
827 med_new_firstloop = edges_new.
data();
830 edge_offset = totedge + (totvert * (step_tot - (close ? 0 : 1)));
833 const VArraySpan src_material_index = *src_attributes.lookup<
int>(
"material_index",
840 for (
uint i = 0;
i < totedge;
i++, med_new_firstloop++) {
841 const uint step_last = step_tot - (close ? 1 : 2);
842 const uint face_index_orig = faces_num ? edge_face_map[
i] :
UINT_MAX;
843 const bool has_mpoly_orig = (face_index_orig !=
UINT_MAX);
844 float uv_v_offset_a, uv_v_offset_b;
846 const uint mloop_index_orig[2] = {
847 vert_loop_map ? vert_loop_map[edges_new[
i][0]] :
UINT_MAX,
848 vert_loop_map ? vert_loop_map[edges_new[
i][1]] :
UINT_MAX,
850 const bool has_mloop_orig = mloop_index_orig[0] !=
UINT_MAX;
855 i1 =
uint((*med_new_firstloop)[0]);
856 i2 =
uint((*med_new_firstloop)[1]);
858 if (has_mpoly_orig) {
859 mat_nr = src_material_index.
is_empty() ? 0 : src_material_index[face_index_orig];
865 if (has_mloop_orig ==
false && uv_map_layers_tot) {
870 uv_v_offset_a = (uv_v_offset_a - uv_v_minmax[0]) * uv_v_range_inv;
871 uv_v_offset_b = (uv_v_offset_b - uv_v_minmax[0]) * uv_v_range_inv;
878 if (has_mpoly_orig) {
880 &mesh->
face_data, &
result->face_data,
int(face_index_orig), face_index, 1);
881 origindex[face_index] = int(face_index_orig);
885 dst_material_index.
span[face_index] = mat_nr;
886 sharp_faces.
span[face_index] = use_flat_shading;
888 face_offests_new[face_index] = face_index * 4;
891 if (has_mloop_orig) {
895 int(mloop_index_orig[0]),
900 int(mloop_index_orig[1]),
905 int(mloop_index_orig[1]),
910 int(mloop_index_orig[0]),
914 if (uv_map_layers_tot) {
916 const float uv_u_offset_a =
float(
step) * uv_u_scale;
917 const float uv_u_offset_b =
float(
step + 1) * uv_u_scale;
918 for (uv_lay = 0; uv_lay < uv_map_layers_tot; uv_lay++) {
921 mluv[quad_ord[0]][0] += uv_u_offset_a;
922 mluv[quad_ord[1]][0] += uv_u_offset_a;
923 mluv[quad_ord[2]][0] += uv_u_offset_b;
924 mluv[quad_ord[3]][0] += uv_u_offset_b;
929 if (uv_map_layers_tot) {
931 const float uv_u_offset_a =
float(
step) * uv_u_scale;
932 const float uv_u_offset_b =
float(
step + 1) * uv_u_scale;
933 for (uv_lay = 0; uv_lay < uv_map_layers_tot; uv_lay++) {
936 copy_v2_fl2(mluv[quad_ord[0]], uv_u_offset_a, uv_v_offset_a);
937 copy_v2_fl2(mluv[quad_ord[1]], uv_u_offset_a, uv_v_offset_b);
938 copy_v2_fl2(mluv[quad_ord[2]], uv_u_offset_b, uv_v_offset_b);
939 copy_v2_fl2(mluv[quad_ord[3]], uv_u_offset_b, uv_v_offset_a);
945 if (!(close &&
step == step_last)) {
947 corner_verts_new[new_loop_index + quad_ord[0]] = int(i1);
948 corner_verts_new[new_loop_index + quad_ord[1]] = int(i2);
949 corner_verts_new[new_loop_index + quad_ord[2]] = int(i2 + totvert);
950 corner_verts_new[new_loop_index + quad_ord[3]] = int(i1 + totvert);
952 corner_edges_new[new_loop_index + quad_ord_ofs[0]] = int(
953 step == 0 ?
i : (edge_offset +
step + (
i * (step_tot - 1))) - 1);
954 corner_edges_new[new_loop_index + quad_ord_ofs[1]] = int(totedge + i2);
955 corner_edges_new[new_loop_index + quad_ord_ofs[2]] = int(edge_offset +
step +
956 (
i * (step_tot - 1)));
957 corner_edges_new[new_loop_index + quad_ord_ofs[3]] = int(totedge + i1);
961 (*edge_new)[0] = int(i1);
962 (*edge_new)[1] = int(i2);
970 corner_verts_new[new_loop_index + quad_ord[0]] = int(i1);
971 corner_verts_new[new_loop_index + quad_ord[1]] = int(i2);
972 corner_verts_new[new_loop_index + quad_ord[2]] = int((*med_new_firstloop)[1]);
973 corner_verts_new[new_loop_index + quad_ord[3]] = int((*med_new_firstloop)[0]);
975 corner_edges_new[new_loop_index + quad_ord_ofs[0]] = int(
976 (edge_offset +
step + (
i * (step_tot - 1))) - 1);
977 corner_edges_new[new_loop_index + quad_ord_ofs[1]] = int(totedge + i2);
978 corner_edges_new[new_loop_index + quad_ord_ofs[2]] = int(
i);
979 corner_edges_new[new_loop_index + quad_ord_ofs[3]] = int(totedge + i1);
987 (*edge_new)[0] = int(i1);
988 (*edge_new)[1] = int(i2);
997 for (;
i < maxPolys * 4;
i += 4) {
999 ml_new = mloop_new +
i;
1000 ii = findEd(edges_new, maxEdges, ml_new[0].
v, ml_new[1].
v);
1001 printf(
"%d %d -- ", ii, ml_new[0].
e);
1004 ii = findEd(edges_new, maxEdges, ml_new[1].
v, ml_new[2].
v);
1005 printf(
"%d %d -- ", ii, ml_new[1].
e);
1008 ii = findEd(edges_new, maxEdges, ml_new[2].
v, ml_new[3].
v);
1009 printf(
"%d %d -- ", ii, ml_new[2].
e);
1012 ii = findEd(edges_new, maxEdges, ml_new[3].
v, ml_new[0].
v);
1013 printf(
"%d %d\n", ii, ml_new[3].
e);
1020 dst_material_index.
finish();
1022 if (edge_face_map) {
1026 if (vert_loop_map) {
1030 if (do_remove_doubles) {
1036 ob_axis !=
nullptr ? mtx_tx[3] :
nullptr,