diff options
author | Campbell Barton <ideasman42@gmail.com> | 2019-02-14 09:50:41 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2019-02-14 10:01:30 +0300 |
commit | c6cbcf83d0153922ac32452c198252f44867a6cb (patch) | |
tree | 2916f1301181d41655605dc472a762fe9c8aa641 /source/blender/editors/mesh/editmesh_utils.c | |
parent | 6074f62d1a099fc378aa25506a93321dba2d956b (diff) |
Fix T61472: Hide Unselected fails w/ no selection
Also skip mesh recalculation when no hide/reveal is performed.
Diffstat (limited to 'source/blender/editors/mesh/editmesh_utils.c')
-rw-r--r-- | source/blender/editors/mesh/editmesh_utils.c | 35 |
1 files changed, 27 insertions, 8 deletions
diff --git a/source/blender/editors/mesh/editmesh_utils.c b/source/blender/editors/mesh/editmesh_utils.c index e57c1aacbdb..a873331f2eb 100644 --- a/source/blender/editors/mesh/editmesh_utils.c +++ b/source/blender/editors/mesh/editmesh_utils.c @@ -1197,14 +1197,13 @@ void EDBM_verts_mirror_apply(BMEditMesh *em, const int sel_from, const int sel_t * \{ */ /* swap is 0 or 1, if 1 it hides not selected */ -void EDBM_mesh_hide(BMEditMesh *em, bool swap) +bool EDBM_mesh_hide(BMEditMesh *em, bool swap) { BMIter iter; BMElem *ele; int itermode; char hflag_swap = swap ? BM_ELEM_SELECT : 0; - - if (em == NULL) return; + bool changed = true; if (em->selectmode & SCE_SELECT_VERTEX) itermode = BM_VERTS_OF_MESH; @@ -1214,11 +1213,18 @@ void EDBM_mesh_hide(BMEditMesh *em, bool swap) itermode = BM_FACES_OF_MESH; BM_ITER_MESH (ele, &iter, em->bm, itermode) { - if (BM_elem_flag_test(ele, BM_ELEM_SELECT) ^ hflag_swap) - BM_elem_hide_set(em->bm, ele, true); + if (!BM_elem_flag_test(ele, BM_ELEM_HIDDEN)) { + if (BM_elem_flag_test(ele, BM_ELEM_SELECT) ^ hflag_swap) { + BM_elem_hide_set(em->bm, ele, true); + changed = true; + } + } } - EDBM_selectmode_flush(em); + if (changed) { + EDBM_selectmode_flush(em); + } + return changed; /* original hide flushing comment (OUTDATED): * hide happens on least dominant select mode, and flushes up, not down! @@ -1230,7 +1236,7 @@ void EDBM_mesh_hide(BMEditMesh *em, bool swap) */ } -void EDBM_mesh_reveal(BMEditMesh *em, bool select) +bool EDBM_mesh_reveal(BMEditMesh *em, bool select) { const char iter_types[3] = { BM_VERTS_OF_MESH, @@ -1244,6 +1250,7 @@ void EDBM_mesh_reveal(BMEditMesh *em, bool select) (em->selectmode & SCE_SELECT_FACE) != 0, }; int i; + bool changed = false; /* Use tag flag to remember what was hidden before all is revealed. * BM_ELEM_HIDDEN --> BM_ELEM_TAG */ @@ -1252,10 +1259,20 @@ void EDBM_mesh_reveal(BMEditMesh *em, bool select) BMElem *ele; BM_ITER_MESH (ele, &iter, em->bm, iter_types[i]) { - BM_elem_flag_set(ele, BM_ELEM_TAG, BM_elem_flag_test(ele, BM_ELEM_HIDDEN)); + if (BM_elem_flag_test(ele, BM_ELEM_HIDDEN)) { + BM_elem_flag_enable(ele, BM_ELEM_TAG); + changed = true; + } + else { + BM_elem_flag_disable(ele, BM_ELEM_TAG); + } } } + if (!changed) { + return false; + } + /* Reveal everything */ EDBM_flag_disable_all(em, BM_ELEM_HIDDEN); @@ -1279,6 +1296,8 @@ void EDBM_mesh_reveal(BMEditMesh *em, bool select) /* hidden faces can have invalid normals */ EDBM_mesh_normals_update(em); + + return true; } /** \} */ |