119 const bool use_correct_order_on_merge,
120 int **r_vert_merge_map,
121 int *r_vert_merge_map_len)
133 float plane_co[3], plane_no[3];
135 int *vtmap_a =
nullptr, *vtmap_b =
nullptr;
139 mtx[axis][axis] = -1.0f;
142 if (mirror_ob !=
nullptr) {
149 mul_m4_m4m4(tmp, tmp, ob->object_to_world().ptr());
164 float ob_scale[3] = {
171 if (
LIKELY(ob_scale_max != 0.0f)) {
172 mul_v3_fl(ob_scale, 1.0f / ob_scale_max);
177 else if (do_bisect) {
183 Mesh *mesh_bisect =
nullptr;
186 mmd,
mesh, axis, plane_co, plane_no);
196 mesh, src_verts_num * 2, src_edges_num * 2, src_faces.
size() * 2, src_loops_num * 2);
214 vtmap_a = *r_vert_merge_map;
215 vtmap_b = *r_vert_merge_map + src_verts_num;
217 *r_vert_merge_map_len = 0;
222 for (
int i = 0; i < src_verts_num; i++) {
223 const int vert_index_prev = i;
224 const int vert_index = src_verts_num + i;
241 if (use_correct_order_on_merge) {
246 (*r_vert_merge_map_len)++;
249 mid_v3_v3v3(positions[vert_index], positions[vert_index_prev], positions[vert_index]);
250 copy_v3_v3(positions[vert_index_prev], positions[vert_index]);
263 *vtmap_a = src_verts_num + i;
264 (*r_vert_merge_map_len)++;
267 mid_v3_v3v3(positions[vert_index], positions[vert_index_prev], positions[vert_index]);
268 copy_v3_v3(positions[vert_index_prev], positions[vert_index]);
285 for (a = 0; a < totshape; a++) {
286 float(*
cos)[3] =
static_cast<float(*)[3]
>(
288 for (
int i = src_verts_num; i <
result->verts_num; i++) {
300 result_edges[i] += src_verts_num;
303 result_face_offsets.
take_front(src_faces.
size()).copy_from(
mesh->face_offsets().drop_back(1));
305 result_face_offsets[src_faces.
size() + i] = src_faces[i].start() + src_loops_num;
312 const int mirror_i = src_faces.
size() + i;
320 for (
int j = 1; j < mirror_face.
size(); j++) {
326 const int e = mirror_face_edges.
first();
327 for (
int j = 0; j < mirror_face.
size() - 1; j++) {
328 mirror_face_edges[j] = mirror_face_edges[j + 1];
330 mirror_face_edges.
last() =
e;
335 result_corner_verts[i] += src_verts_num;
338 result_corner_edges[i] += src_edges_num;
341 if (!
mesh->
runtime->subsurf_optimal_display_edges.is_empty()) {
343 result->runtime->subsurf_optimal_display_edges.resize(
result->edges_num);
361 for (a = 0; a < totuv; a++) {
364 int j = src_loops_num;
366 for (; j-- > 0; dmloopuv++) {
368 float u = (*dmloopuv)[0];
373 (*dmloopuv)[0] = 1.0f - u + mmd->
uv_offset[0];
377 float v = (*dmloopuv)[1];
382 (*dmloopuv)[1] = 1.0f -
v + mmd->
uv_offset[1];
394 if (ob->
type ==
OB_MESH && custom_normals && custom_normals.
domain == bke::AttrDomain::Corner &&
408 const VArraySpan sharp_edges = *attributes.
lookup<
bool>(
"sharp_edge", AttrDomain::Edge);
409 const VArraySpan sharp_faces = *attributes.
lookup<
bool>(
"sharp_face", AttrDomain::Face);
414 result->vert_to_face_map(),
415 result->face_normals_true(),
425 const int mirror_i = src_faces.
size() + i;
427 for (
const int j : src_face) {
428 int mirrorj = result_faces[mirror_i].start();
429 if (j > src_face.
start()) {
430 mirrorj += result_faces[mirror_i].
size() - (j - src_face.
start());
433 copy_v3_v3(corner_normals[mirrorj], corner_normals[j]);
434 mul_m4_v3(mtx_nor, corner_normals[mirrorj]);
438 lnors_spacearr.
spaces[space_index], corner_normals[mirrorj]);
450 int flip_map_len = 0;
453 for (
int i = 0; i < src_verts_num; dvert++, i++) {
455 if (use_correct_order_on_merge && do_vtargetmap &&
456 ((*r_vert_merge_map)[i + src_verts_num] != -1))
460 else if (!use_correct_order_on_merge && do_vtargetmap && ((*r_vert_merge_map)[i] != -1))
474 if (mesh_bisect !=
nullptr) {