diff options
Diffstat (limited to 'source/blender/blenkernel/intern/mesh_mirror.c')
-rw-r--r-- | source/blender/blenkernel/intern/mesh_mirror.c | 34 |
1 files changed, 19 insertions, 15 deletions
diff --git a/source/blender/blenkernel/intern/mesh_mirror.c b/source/blender/blenkernel/intern/mesh_mirror.c index ce3fc5d99c8..3968e6a01ff 100644 --- a/source/blender/blenkernel/intern/mesh_mirror.c +++ b/source/blender/blenkernel/intern/mesh_mirror.c @@ -131,7 +131,6 @@ Mesh *BKE_mesh_mirror_apply_mirror_on_axis_for_modifier(MirrorModifierData *mmd, (axis == 2 && mmd->flag & MOD_MIR_BISECT_AXIS_Z)); Mesh *result; - MVert *mv, *mv_prev; MEdge *me; MLoop *ml; MPoly *mp; @@ -209,9 +208,11 @@ Mesh *BKE_mesh_mirror_apply_mirror_on_axis_for_modifier(MirrorModifierData *mmd, CustomData_copy_data(&mesh->pdata, &result->pdata, 0, 0, maxPolys); /* Subdivision-surface for eg won't have mesh data in the custom-data arrays. - * Now add #MVert/#MEdge/#MPoly layers. */ - if (!CustomData_has_layer(&mesh->vdata, CD_MVERT)) { - memcpy(BKE_mesh_verts_for_write(result), BKE_mesh_verts(mesh), sizeof(MVert) * mesh->totvert); + * Now add position/#MEdge/#MPoly layers. */ + if (BKE_mesh_positions(mesh) != NULL) { + memcpy(BKE_mesh_positions_for_write(result), + BKE_mesh_positions(mesh), + sizeof(float[3]) * mesh->totvert); } if (!CustomData_has_layer(&mesh->edata, CD_MEDGE)) { memcpy(BKE_mesh_edges_for_write(result), BKE_mesh_edges(mesh), sizeof(MEdge) * mesh->totedge); @@ -237,10 +238,11 @@ Mesh *BKE_mesh_mirror_apply_mirror_on_axis_for_modifier(MirrorModifierData *mmd, } /* mirror vertex coordinates */ - mv_prev = BKE_mesh_verts_for_write(result); - mv = mv_prev + maxVerts; - for (i = 0; i < maxVerts; i++, mv++, mv_prev++) { - mul_m4_v3(mtx, mv->co); + float(*positions)[3] = BKE_mesh_positions_for_write(result); + for (i = 0; i < maxVerts; i++) { + const int vert_index_prev = i; + const int vert_index = maxVerts + i; + mul_m4_v3(mtx, positions[vert_index]); if (do_vtargetmap) { /* Compare location of the original and mirrored vertex, @@ -257,13 +259,14 @@ Mesh *BKE_mesh_mirror_apply_mirror_on_axis_for_modifier(MirrorModifierData *mmd, * old, incorrect behavior of merging the source vertex into its copy. */ if (use_correct_order_on_merge) { - if (UNLIKELY(len_squared_v3v3(mv_prev->co, mv->co) < tolerance_sq)) { + if (UNLIKELY(len_squared_v3v3(positions[vert_index_prev], positions[vert_index]) < + tolerance_sq)) { *vtmap_b = i; tot_vtargetmap++; /* average location */ - mid_v3_v3v3(mv->co, mv_prev->co, mv->co); - copy_v3_v3(mv_prev->co, mv->co); + mid_v3_v3v3(positions[vert_index], positions[vert_index_prev], positions[vert_index]); + copy_v3_v3(positions[vert_index_prev], positions[vert_index]); } else { *vtmap_b = -1; @@ -273,13 +276,14 @@ Mesh *BKE_mesh_mirror_apply_mirror_on_axis_for_modifier(MirrorModifierData *mmd, *vtmap_a = -1; } else { - if (UNLIKELY(len_squared_v3v3(mv_prev->co, mv->co) < tolerance_sq)) { + if (UNLIKELY(len_squared_v3v3(positions[vert_index_prev], positions[vert_index]) < + tolerance_sq)) { *vtmap_a = maxVerts + i; tot_vtargetmap++; /* average location */ - mid_v3_v3v3(mv->co, mv_prev->co, mv->co); - copy_v3_v3(mv_prev->co, mv->co); + mid_v3_v3v3(positions[vert_index], positions[vert_index_prev], positions[vert_index]); + copy_v3_v3(positions[vert_index_prev], positions[vert_index]); } else { *vtmap_a = -1; @@ -405,7 +409,7 @@ Mesh *BKE_mesh_mirror_apply_mirror_on_axis_for_modifier(MirrorModifierData *mmd, /* calculate custom normals into loop_normals, then mirror first half into second half */ - BKE_mesh_normals_loop_split(BKE_mesh_verts(result), + BKE_mesh_normals_loop_split(BKE_mesh_positions(result), BKE_mesh_vertex_normals_ensure(result), result->totvert, BKE_mesh_edges(result), |