diff options
author | Campbell Barton <ideasman42@gmail.com> | 2014-03-16 17:23:05 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2014-03-16 17:25:34 +0400 |
commit | caf8684b5066720d4f4124092e23857dd462cb8b (patch) | |
tree | 7611dfb7a0b42f534dba5bad17a95b2d6e68dc9f /source/blender/bmesh/intern | |
parent | 37dd7360d64f70f7e9034f82f9dd03b14c41102a (diff) |
EditMesh: Support contracting the selection as well as extending
This allows for holding ctrl while switching from face->edge modes to
select an edge-ring.
Diffstat (limited to 'source/blender/bmesh/intern')
-rw-r--r-- | source/blender/bmesh/intern/bmesh_queries.c | 54 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_queries.h | 4 |
2 files changed, 58 insertions, 0 deletions
diff --git a/source/blender/bmesh/intern/bmesh_queries.c b/source/blender/bmesh/intern/bmesh_queries.c index 5a0aae28175..f240a10efc8 100644 --- a/source/blender/bmesh/intern/bmesh_queries.c +++ b/source/blender/bmesh/intern/bmesh_queries.c @@ -1799,6 +1799,60 @@ bool BM_face_exists_overlap_subset(BMVert **varr, const int len) return is_overlap; } +bool BM_vert_is_all_edge_flag_test(const BMVert *v, const char hflag, const bool respect_hide) +{ + if (v->e) { + BMEdge *e_other; + BMIter eiter; + + BM_ITER_ELEM (e_other, &eiter, (BMVert *)v, BM_EDGES_OF_VERT) { + if (!respect_hide || !BM_elem_flag_test(e_other, BM_ELEM_HIDDEN)) { + if (!BM_elem_flag_test(e_other, hflag)) { + return false; + } + } + } + } + + return true; +} + +bool BM_vert_is_all_face_flag_test(const BMVert *v, const char hflag, const bool respect_hide) +{ + if (v->e) { + BMEdge *f_other; + BMIter fiter; + + BM_ITER_ELEM (f_other, &fiter, (BMVert *)v, BM_FACES_OF_VERT) { + if (!respect_hide || !BM_elem_flag_test(f_other, BM_ELEM_HIDDEN)) { + if (!BM_elem_flag_test(f_other, hflag)) { + return false; + } + } + } + } + + return true; +} + + +bool BM_edge_is_all_face_flag_test(const BMEdge *e, const char hflag, const bool respect_hide) +{ + if (e->l) { + BMLoop *l_iter, *l_first; + + l_iter = l_first = e->l; + do { + if (!respect_hide || !BM_elem_flag_test(l_iter->f, BM_ELEM_HIDDEN)) { + if (!BM_elem_flag_test(l_iter->f, hflag)) { + return false; + } + } + } while ((l_iter = l_iter->radial_next) != l_first); + } + + return true; +} /* convenience functions for checking flags */ bool BM_edge_is_any_vert_flag_test(const BMEdge *e, const char hflag) diff --git a/source/blender/bmesh/intern/bmesh_queries.h b/source/blender/bmesh/intern/bmesh_queries.h index d4b6cd0e061..36e67a73f1f 100644 --- a/source/blender/bmesh/intern/bmesh_queries.h +++ b/source/blender/bmesh/intern/bmesh_queries.h @@ -119,6 +119,10 @@ void BM_edge_ordered_verts(const BMEdge *edge, BMVert **r_v1, BMVert **r_v2); void BM_edge_ordered_verts_ex(const BMEdge *edge, BMVert **r_v1, BMVert **r_v2, const BMLoop *edge_loop); +bool BM_vert_is_all_edge_flag_test(const BMVert *v, const char hflag, const bool respect_hide); +bool BM_vert_is_all_face_flag_test(const BMVert *v, const char hflag, const bool respect_hide); +bool BM_edge_is_all_face_flag_test(const BMEdge *e, const char hflag, const bool respect_hide); + bool BM_edge_is_any_vert_flag_test(const BMEdge *e, const char hflag); bool BM_face_is_any_vert_flag_test(const BMFace *f, const char hflag); bool BM_face_is_any_edge_flag_test(const BMFace *f, const char hflag); |