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-02-26 16:34:09 +0400
committerCampbell Barton <ideasman42@gmail.com>2014-02-26 16:42:47 +0400
commitb5b1ce9d212208bbbf8342839e9c6edcf9e266c1 (patch)
treeb30a23bf7e197747d63cbd05778503685384453a /source/blender/bmesh
parent8a5221750e73b48ea204bde7a489bc11e49770a6 (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.c53
-rw-r--r--source/blender/bmesh/intern/bmesh_marking.h4
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);