diff options
author | Campbell Barton <ideasman42@gmail.com> | 2015-11-02 08:53:42 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2015-11-02 09:04:29 +0300 |
commit | 56bcda8bc63fa8461c8abe05f1d501fd3f536f45 (patch) | |
tree | 76bb85995fc1891ed4e1c2aae9d2fb83f6b4565e | |
parent | 8e7eb0b733ea0729eb6274f4c49b198f7ac0adc9 (diff) |
Fix BMesh selection flushing w/ mixed modes
Fix for T46494 wasn't working properly when de-selecting faces,
adjacent faces would remain selected but have unselected edges.
Logic here is admittedly rather fragile since it relies on both
selection functions and flushing afterwards.
-rw-r--r-- | source/blender/bmesh/intern/bmesh_marking.c | 59 |
1 files changed, 34 insertions, 25 deletions
diff --git a/source/blender/bmesh/intern/bmesh_marking.c b/source/blender/bmesh/intern/bmesh_marking.c index cd3c8325831..3fe888736f0 100644 --- a/source/blender/bmesh/intern/bmesh_marking.c +++ b/source/blender/bmesh/intern/bmesh_marking.c @@ -102,7 +102,6 @@ static bool bm_vert_is_edge_select_any(const BMVert *v) } #endif -#if 0 static bool bm_edge_is_face_select_any_other(BMLoop *l_first) { const BMLoop *l_iter = l_first; @@ -115,7 +114,6 @@ static bool bm_edge_is_face_select_any_other(BMLoop *l_first) } return false; } -#endif #if 0 static bool bm_edge_is_face_select_any(const BMEdge *e) @@ -505,33 +503,44 @@ void BM_face_select_set(BMesh *bm, BMFace *f, const bool select) * an edge bay be de-selected, but an adjacent face remains selected. * * Rely on #BM_mesh_select_mode_flush to correct these cases. + * + * \note flushing based on mode, see T46494 */ -#if 1 - l_iter = l_first = BM_FACE_FIRST_LOOP(f); - do { - BM_vert_select_set(bm, l_iter->v, false); - BM_edge_select_set(bm, l_iter->e, false); - } while ((l_iter = l_iter->next) != l_first); -#else - /* disabled, see T46494 */ - - /* flush down to edges */ - l_iter = l_first = BM_FACE_FIRST_LOOP(f); - do { - /* vertex flushing is handled below */ - if (bm_edge_is_face_select_any_other(l_iter) == false) { + if (bm->selectmode & SCE_SELECT_VERTEX) { + l_iter = l_first = BM_FACE_FIRST_LOOP(f); + do { + BM_vert_select_set(bm, l_iter->v, false); BM_edge_select_set_noflush(bm, l_iter->e, false); + } while ((l_iter = l_iter->next) != l_first); + } + else { + /** + * \note use #BM_edge_select_set_noflush, + * vertex flushing is handled last. + */ + if (bm->selectmode & SCE_SELECT_EDGE) { + l_iter = l_first = BM_FACE_FIRST_LOOP(f); + do { + BM_edge_select_set_noflush(bm, l_iter->e, false); + } while ((l_iter = l_iter->next) != l_first); } - } while ((l_iter = l_iter->next) != l_first); - - /* flush down to verts */ - l_iter = l_first = BM_FACE_FIRST_LOOP(f); - do { - if (bm_vert_is_edge_select_any_other(l_iter->v, l_iter->e) == false) { - BM_vert_select_set(bm, l_iter->v, false); + else { + l_iter = l_first = BM_FACE_FIRST_LOOP(f); + do { + if (bm_edge_is_face_select_any_other(l_iter) == false) { + BM_edge_select_set_noflush(bm, l_iter->e, false); + } + } while ((l_iter = l_iter->next) != l_first); } - } while ((l_iter = l_iter->next) != l_first); -#endif + + /* flush down to verts */ + l_iter = l_first = BM_FACE_FIRST_LOOP(f); + do { + if (bm_vert_is_edge_select_any_other(l_iter->v, l_iter->e) == false) { + BM_vert_select_set(bm, l_iter->v, false); + } + } while ((l_iter = l_iter->next) != l_first); + } } } |