Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2014-03-16 17:23:05 +0400
committerCampbell Barton <ideasman42@gmail.com>2014-03-16 17:25:34 +0400
commitcaf8684b5066720d4f4124092e23857dd462cb8b (patch)
tree7611dfb7a0b42f534dba5bad17a95b2d6e68dc9f /source/blender/bmesh/intern
parent37dd7360d64f70f7e9034f82f9dd03b14c41102a (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.c54
-rw-r--r--source/blender/bmesh/intern/bmesh_queries.h4
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);