diff options
Diffstat (limited to 'source/blender/editors/mesh')
-rw-r--r-- | source/blender/editors/mesh/editface.c | 10 | ||||
-rw-r--r-- | source/blender/editors/mesh/editmesh_select.c | 69 |
2 files changed, 66 insertions, 13 deletions
diff --git a/source/blender/editors/mesh/editface.c b/source/blender/editors/mesh/editface.c index 3da2b4711f3..b592449fff5 100644 --- a/source/blender/editors/mesh/editface.c +++ b/source/blender/editors/mesh/editface.c @@ -509,7 +509,7 @@ void seam_mark_clear_tface(Scene *scene, short mode) } #endif -int paintface_mouse_select(struct bContext *C, Object *ob, const int mval[2], int extend) +int paintface_mouse_select(struct bContext *C, Object *ob, const int mval[2], int extend, int deselect, int toggle) { Mesh *me; MPoly *mpoly, *mpoly_sel; @@ -530,7 +530,7 @@ int paintface_mouse_select(struct bContext *C, Object *ob, const int mval[2], in /* clear flags */ mpoly = me->mpoly; a = me->totpoly; - if (!extend) { + if (!extend && !deselect && !toggle) { while (a--) { mpoly->flag &= ~ME_FACE_SEL; mpoly++; @@ -540,6 +540,12 @@ int paintface_mouse_select(struct bContext *C, Object *ob, const int mval[2], in me->act_face = (int)index; if (extend) { + mpoly_sel->flag |= ME_FACE_SEL; + } + else if (deselect) { + mpoly_sel->flag &= ~ME_FACE_SEL; + } + else if (toggle) { if (mpoly_sel->flag & ME_FACE_SEL) mpoly_sel->flag &= ~ME_FACE_SEL; else diff --git a/source/blender/editors/mesh/editmesh_select.c b/source/blender/editors/mesh/editmesh_select.c index 55f575bbdea..0a8fe142aaf 100644 --- a/source/blender/editors/mesh/editmesh_select.c +++ b/source/blender/editors/mesh/editmesh_select.c @@ -1454,7 +1454,7 @@ void MESH_OT_select_shortest_path(wmOperatorType *ot) /* ************************************************** */ /* here actual select happens */ /* gets called via generic mouse select operator */ -int mouse_mesh(bContext *C, const int mval[2], short extend) +int mouse_mesh(bContext *C, const int mval[2], short extend, short deselect, short toggle) { ViewContext vc; BMVert *eve = NULL; @@ -1468,40 +1468,87 @@ int mouse_mesh(bContext *C, const int mval[2], short extend) if (unified_findnearest(&vc, &eve, &eed, &efa)) { - if (extend == 0) EDBM_flag_disable_all(vc.em, BM_ELEM_SELECT); + // Deselect everything + if (extend == 0 && deselect == 0 && toggle == 0) + EDBM_flag_disable_all(vc.em, BM_ELEM_SELECT); if (efa) { - /* set the last selected face */ - BM_active_face_set(vc.em->bm, efa); - - if (!BM_elem_flag_test(efa, BM_ELEM_SELECT)) { + if (extend) { + // set the last selected face + BM_active_face_set(vc.em->bm, efa); + + // Work-around: deselect first, so we can guarantee it will + // be active even if it was already selected + BM_select_history_remove(vc.em->bm, efa); + BM_face_select_set(vc.em->bm, efa, FALSE); BM_select_history_store(vc.em->bm, efa); BM_face_select_set(vc.em->bm, efa, TRUE); } - else if (extend) { + else if (deselect) { BM_select_history_remove(vc.em->bm, efa); BM_face_select_set(vc.em->bm, efa, FALSE); } + else { + // set the last selected face + BM_active_face_set(vc.em->bm, efa); + + if (!BM_elem_flag_test(efa, BM_ELEM_SELECT)) { + BM_select_history_store(vc.em->bm, efa); + BM_face_select_set(vc.em->bm, efa, TRUE); + } + else if (toggle) { + BM_select_history_remove(vc.em->bm, efa); + BM_face_select_set(vc.em->bm, efa, FALSE); + } + } } else if (eed) { - if (!BM_elem_flag_test(eed, BM_ELEM_SELECT)) { + if (extend) { + // Work-around: deselect first, so we can guarantee it will + // be active even if it was already selected + BM_select_history_remove(vc.em->bm, eed); + BM_edge_select_set(vc.em->bm, eed, FALSE); BM_select_history_store(vc.em->bm, eed); BM_edge_select_set(vc.em->bm, eed, TRUE); } - else if (extend) { + else if (deselect) { BM_select_history_remove(vc.em->bm, eed); BM_edge_select_set(vc.em->bm, eed, FALSE); } + else { + if (!BM_elem_flag_test(eed, BM_ELEM_SELECT)) { + BM_select_history_store(vc.em->bm, eed); + BM_edge_select_set(vc.em->bm, eed, TRUE); + } + else if (toggle) { + BM_select_history_remove(vc.em->bm, eed); + BM_edge_select_set(vc.em->bm, eed, FALSE); + } + } } else if (eve) { - if (!BM_elem_flag_test(eve, BM_ELEM_SELECT)) { + if (extend) { + // Work-around: deselect first, so we can guarantee it will + // be active even if it was already selected + BM_select_history_remove(vc.em->bm, eve); + BM_vert_select_set(vc.em->bm, eve, FALSE); BM_select_history_store(vc.em->bm, eve); BM_vert_select_set(vc.em->bm, eve, TRUE); } - else if (extend) { + else if (deselect) { BM_select_history_remove(vc.em->bm, eve); BM_vert_select_set(vc.em->bm, eve, FALSE); } + else { + if (!BM_elem_flag_test(eve, BM_ELEM_SELECT)) { + BM_select_history_store(vc.em->bm, eve); + BM_vert_select_set(vc.em->bm, eve, TRUE); + } + else if (toggle) { + BM_select_history_remove(vc.em->bm, eve); + BM_vert_select_set(vc.em->bm, eve, FALSE); + } + } } EDBM_selectmode_flush(vc.em); |