Fix weight-mirror reporting invalid failed mirror verts

Use vertex tagging instead of clearing mirror index.
This commit is contained in:
Campbell Barton
2016-05-10 00:52:06 +10:00
parent f616caa315
commit 299a25cb35

View File

@@ -2197,28 +2197,34 @@ void ED_vgroup_mirror(Object *ob,
EDBM_verts_mirror_cache_begin(em, 0, true, false, use_topology); EDBM_verts_mirror_cache_begin(em, 0, true, false, use_topology);
BM_mesh_elem_hflag_disable_all(em->bm, BM_VERT, BM_ELEM_TAG, false);
/* Go through the list of editverts and assign them */ /* Go through the list of editverts and assign them */
BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) { BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
if ((eve_mirr = EDBM_verts_mirror_get(em, eve))) { if (!BM_elem_flag_test(eve, BM_ELEM_TAG)) {
if (eve_mirr != eve) { if ((eve_mirr = EDBM_verts_mirror_get(em, eve))) {
sel = BM_elem_flag_test(eve, BM_ELEM_SELECT); if (eve_mirr != eve) {
sel_mirr = BM_elem_flag_test(eve_mirr, BM_ELEM_SELECT); if (!BM_elem_flag_test(eve_mirr, BM_ELEM_TAG)) {
sel = BM_elem_flag_test(eve, BM_ELEM_SELECT);
sel_mirr = BM_elem_flag_test(eve_mirr, BM_ELEM_SELECT);
if ((sel || sel_mirr) && (eve != eve_mirr)) { if ((sel || sel_mirr) && (eve != eve_mirr)) {
dvert = BM_ELEM_CD_GET_VOID_P(eve, cd_dvert_offset); dvert = BM_ELEM_CD_GET_VOID_P(eve, cd_dvert_offset);
dvert_mirr = BM_ELEM_CD_GET_VOID_P(eve_mirr, cd_dvert_offset); dvert_mirr = BM_ELEM_CD_GET_VOID_P(eve_mirr, cd_dvert_offset);
VGROUP_MIRR_OP; VGROUP_MIRR_OP;
totmirr++; totmirr++;
}
/* don't use these again */
BM_elem_flag_enable(eve, BM_ELEM_TAG);
BM_elem_flag_enable(eve_mirr, BM_ELEM_TAG);
}
} }
} }
else {
/* don't use these again */ totfail++;
EDBM_verts_mirror_cache_clear(em, eve); }
EDBM_verts_mirror_cache_clear(em, eve_mirr);
}
else {
totfail++;
} }
} }
EDBM_verts_mirror_cache_end(em); EDBM_verts_mirror_cache_end(em);