Fix T78600: Crash when transforming doubles with mirroring on

`EDBM_verts_mirror_cache_begin_ex` could do a better work avoiding these
duplicates, but this is a separate problem.
This commit is contained in:
Germano Cavalcante 2020-07-31 11:23:43 -03:00
parent feaed44ef6
commit 1ff1a2be9c
Notes: blender-bot 2023-02-14 07:39:46 +01:00
Referenced by issue #78600, Crash (segfault) when scaling with mirroring on.
1 changed files with 14 additions and 7 deletions

View File

@ -472,7 +472,7 @@ static void editmesh_mirror_data_calc(BMEditMesh *em,
BMIter iter;
int i, flag, totvert = bm->totvert;
vert_map = MEM_mallocN(totvert * sizeof(*vert_map), __func__);
vert_map = MEM_callocN(totvert * sizeof(*vert_map), __func__);
float select_sum[3] = {0};
BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) {
@ -498,7 +498,8 @@ static void editmesh_mirror_data_calc(BMEditMesh *em,
uint mirror_elem_len = 0;
int *index[3] = {NULL, NULL, NULL};
bool test_selected_only = use_select && (mirror_axis[0] + mirror_axis[1] + mirror_axis[2]) == 1;
bool is_single_mirror_axis = (mirror_axis[0] + mirror_axis[1] + mirror_axis[2]) == 1;
bool test_selected_only = use_select && is_single_mirror_axis;
for (int a = 0; a < 3; a++) {
if (!mirror_axis[a]) {
continue;
@ -523,13 +524,23 @@ static void editmesh_mirror_data_calc(BMEditMesh *em,
if (!is_in_quadrant_v3(eve->co, quadrant, TRANSFORM_MAXDIST_MIRROR)) {
continue;
}
if (vert_map[i_mirr].flag != 0) {
/* One mirror per element.
* It can happen when vertices occupy the same position. */
continue;
}
vert_map[i_mirr] = (struct MirrorDataVert){i, flag};
mirror_elem_len++;
}
}
if (mirror_elem_len) {
if (!mirror_elem_len) {
MEM_freeN(vert_map);
vert_map = NULL;
}
else if (!is_single_mirror_axis) {
/* Adjustment for elements that are mirrors of mirrored elements. */
for (int a = 0; a < 3; a++) {
if (!mirror_axis[a]) {
continue;
@ -551,10 +562,6 @@ static void editmesh_mirror_data_calc(BMEditMesh *em,
}
}
}
else {
MEM_freeN(vert_map);
vert_map = NULL;
}
MEM_SAFE_FREE(index[0]);
MEM_SAFE_FREE(index[1]);