diff options
author | Campbell Barton <ideasman42@gmail.com> | 2014-02-26 16:34:09 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2014-02-26 16:42:47 +0400 |
commit | b5b1ce9d212208bbbf8342839e9c6edcf9e266c1 (patch) | |
tree | b30a23bf7e197747d63cbd05778503685384453a /source/blender/bmesh | |
parent | 8a5221750e73b48ea204bde7a489bc11e49770a6 (diff) |
BMesh: add overwrite option to BM_mesh_elem_hflag_enable/disable_test
Diffstat (limited to 'source/blender/bmesh')
-rw-r--r-- | source/blender/bmesh/intern/bmesh_marking.c | 53 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_marking.h | 4 |
2 files changed, 35 insertions, 22 deletions
diff --git a/source/blender/bmesh/intern/bmesh_marking.c b/source/blender/bmesh/intern/bmesh_marking.c index 833a556e46c..eff3cf220f3 100644 --- a/source/blender/bmesh/intern/bmesh_marking.c +++ b/source/blender/bmesh/intern/bmesh_marking.c @@ -900,7 +900,7 @@ bool BM_select_history_active_get(BMesh *bm, BMEditSelection *ese) } void BM_mesh_elem_hflag_disable_test(BMesh *bm, const char htype, const char hflag, - const bool respecthide, const char hflag_test) + const bool respecthide, const bool overwrite, const char hflag_test) { const char iter_types[3] = {BM_VERTS_OF_MESH, BM_EDGES_OF_MESH, @@ -908,6 +908,8 @@ void BM_mesh_elem_hflag_disable_test(BMesh *bm, const char htype, const char hfl const char flag_types[3] = {BM_VERT, BM_EDGE, BM_FACE}; + const char hflag_nosel = hflag & ~BM_ELEM_SELECT; + int i; BLI_assert((htype & ~BM_ALL_NOLOOP) == 0); @@ -946,17 +948,22 @@ void BM_mesh_elem_hflag_disable_test(BMesh *bm, const char htype, const char hfl ele = BM_iter_new(&iter, bm, iter_types[i], NULL); for ( ; ele; ele = BM_iter_step(&iter)) { - if (respecthide && BM_elem_flag_test(ele, BM_ELEM_HIDDEN)) { - continue; + if (UNLIKELY(respecthide && BM_elem_flag_test(ele, BM_ELEM_HIDDEN))) { + /* pass */ } - if (hflag_test && !BM_elem_flag_test(ele, hflag_test)) { - continue; + else if (!hflag_test || BM_elem_flag_test(ele, hflag_test)) { + if (hflag & BM_ELEM_SELECT) { + BM_elem_select_set(bm, ele, false); + } + BM_elem_flag_disable(ele, hflag); } - - if (hflag & BM_ELEM_SELECT) { - BM_elem_select_set(bm, ele, false); + else if (overwrite) { + /* no match! */ + if (hflag & BM_ELEM_SELECT) { + BM_elem_select_set(bm, ele, true); + } + BM_elem_flag_enable(ele, hflag_nosel); } - BM_elem_flag_disable(ele, hflag); } } } @@ -964,7 +971,7 @@ void BM_mesh_elem_hflag_disable_test(BMesh *bm, const char htype, const char hfl } void BM_mesh_elem_hflag_enable_test(BMesh *bm, const char htype, const char hflag, - const bool respecthide, const char hflag_test) + const bool respecthide, const bool overwrite, const char hflag_test) { const char iter_types[3] = {BM_VERTS_OF_MESH, BM_EDGES_OF_MESH, @@ -996,17 +1003,23 @@ void BM_mesh_elem_hflag_enable_test(BMesh *bm, const char htype, const char hfla ele = BM_iter_new(&iter, bm, iter_types[i], NULL); for ( ; ele; ele = BM_iter_step(&iter)) { - if (respecthide && BM_elem_flag_test(ele, BM_ELEM_HIDDEN)) { - continue; + if (UNLIKELY(respecthide && BM_elem_flag_test(ele, BM_ELEM_HIDDEN))) { + /* pass */ } - if (hflag_test && !BM_elem_flag_test(ele, hflag_test)) { - continue; + else if (!hflag_test || BM_elem_flag_test(ele, hflag_test)) { + /* match! */ + if (hflag & BM_ELEM_SELECT) { + BM_elem_select_set(bm, ele, true); + } + BM_elem_flag_enable(ele, hflag_nosel); } - - if (hflag & BM_ELEM_SELECT) { - BM_elem_select_set(bm, ele, true); + else if (overwrite) { + /* no match! */ + if (hflag & BM_ELEM_SELECT) { + BM_elem_select_set(bm, ele, false); + } + BM_elem_flag_disable(ele, hflag); } - BM_elem_flag_enable(ele, hflag_nosel); } } } @@ -1016,14 +1029,14 @@ void BM_mesh_elem_hflag_disable_all(BMesh *bm, const char htype, const char hfla const bool respecthide) { /* call with 0 hflag_test */ - BM_mesh_elem_hflag_disable_test(bm, htype, hflag, respecthide, 0); + BM_mesh_elem_hflag_disable_test(bm, htype, hflag, respecthide, false, 0); } void BM_mesh_elem_hflag_enable_all(BMesh *bm, const char htype, const char hflag, const bool respecthide) { /* call with 0 hflag_test */ - BM_mesh_elem_hflag_enable_test(bm, htype, hflag, respecthide, 0); + BM_mesh_elem_hflag_enable_test(bm, htype, hflag, respecthide, false, 0); } /***************** Mesh Hiding stuff *********** */ diff --git a/source/blender/bmesh/intern/bmesh_marking.h b/source/blender/bmesh/intern/bmesh_marking.h index f23eac61278..99456ea2c98 100644 --- a/source/blender/bmesh/intern/bmesh_marking.h +++ b/source/blender/bmesh/intern/bmesh_marking.h @@ -44,9 +44,9 @@ void BM_face_hide_set(BMFace *f, const bool hide); void BM_elem_select_set(BMesh *bm, BMElem *ele, const bool select); void BM_mesh_elem_hflag_enable_test(BMesh *bm, const char htype, const char hflag, - const bool respecthide, const char hflag_test); + const bool respecthide, const bool overwrite, const char hflag_test); void BM_mesh_elem_hflag_disable_test(BMesh *bm, const char htype, const char hflag, - const bool respecthide, const char hflag_test); + const bool respecthide, const bool overwrite, const char hflag_test); void BM_mesh_elem_hflag_enable_all(BMesh *bm, const char htype, const char hflag, const bool respecthide); |