[Bf-blender-cvs] [b5b1ce9] master: BMesh: add overwrite option to BM_mesh_elem_hflag_enable/disable_test

Campbell Barton noreply at git.blender.org
Wed Feb 26 13:44:05 CET 2014


Commit: b5b1ce9d212208bbbf8342839e9c6edcf9e266c1
Author: Campbell Barton
Date:   Wed Feb 26 23:34:09 2014 +1100
https://developer.blender.org/rBb5b1ce9d212208bbbf8342839e9c6edcf9e266c1

BMesh: add overwrite option to BM_mesh_elem_hflag_enable/disable_test

===================================================================

M	source/blender/bmesh/intern/bmesh_marking.c
M	source/blender/bmesh/intern/bmesh_marking.h
M	source/blender/editors/mesh/editmesh_knife_project.c
M	source/blender/editors/mesh/editmesh_tools.c
M	source/blender/editors/uvedit/uvedit_ops.c

===================================================================

diff --git a/source/blender/bmesh/intern/bmesh_marking.c b/source/blender/bmesh/intern/bmesh_marking.c
index 833a556..eff3cf2 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 f23eac6..99456ea 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);
diff --git a/source/blender/editors/mesh/editmesh_knife_project.c b/source/blender/editors/mesh/editmesh_knife_project.c
index 57a85f1..cc26d60 100644
--- a/source/blender/editors/mesh/editmesh_knife_project.c
+++ b/source/blender/editors/mesh/editmesh_knife_project.c
@@ -143,7 +143,7 @@ static int knifeproject_exec(bContext *C, wmOperator *op)
 		 * note: call after de-select to avoid selection flushing */
 		EDBM_selectmode_disable(scene, em, SCE_SELECT_VERTEX, SCE_SELECT_EDGE);
 
-		BM_mesh_elem_hflag_enable_test(em->bm, BM_FACE, BM_ELEM_SELECT, true, BM_ELEM_TAG);
+		BM_mesh_elem_hflag_enable_test(em->bm, BM_FACE, BM_ELEM_SELECT, true, false, BM_ELEM_TAG);
 
 		BM_mesh_select_mode_flush(em->bm);
 
diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c
index f8b50d4..189eafe 100644
--- a/source/blender/editors/mesh/editmesh_tools.c
+++ b/source/blender/editors/mesh/editmesh_tools.c
@@ -2580,7 +2580,7 @@ static bool mesh_separate_selected(Main *bmain, Scene *scene, Base *base_old, BM
 	BM_mesh_elem_hflag_disable_all(bm_old, BM_FACE | BM_EDGE | BM_VERT, BM_ELEM_TAG, false);
 
 	/* sel -> tag */
-	BM_mesh_elem_hflag_enable_test(bm_old, BM_FACE | BM_EDGE | BM_VERT, BM_ELEM_TAG, true, BM_ELEM_SELECT);
+	BM_mesh_elem_hflag_enable_test(bm_old, BM_FACE | BM_EDGE | BM_VERT, BM_ELEM_TAG, true, false, BM_ELEM_SELECT);
 
 	return (mesh_separate_tagged(bmain, scene, base_old, bm_old) != NULL);
 }
@@ -3757,7 +3757,7 @@ static int edbm_delete_edgeloop_exec(bContext *C, wmOperator *op)
 		return OPERATOR_CANCELLED;
 	}
 
-	BM_mesh_elem_hflag_enable_test(em->bm, BM_FACE, BM_ELEM_SELECT, true, BM_ELEM_TAG);
+	BM_mesh_elem_hflag_enable_test(em->bm, BM_FACE, BM_ELEM_SELECT, true, false, BM_ELEM_TAG);
 
 	EDBM_update_generic(em, true, true);
 
diff --git a/source/blender/editors/uvedit/uvedit_ops.c b/source/blender/editors/uvedit/uvedit_ops.c
index 8e980bd..ff2a2fc 100644
--- a/source/blender/editors/uvedit/uvedit_ops.c
+++ b/source/blender/editors/uvedit/uvedit_ops.c
@@ -3802,7 +3802,7 @@ static int uv_reveal_exec(bContext *C, wmOperator *UNUSED(op))
 	}
 	
 	/* re-select tagged faces */
-	BM_mesh_elem_hflag_enable_test(em->bm, BM_FACE, BM_ELEM_SELECT, TRUE, BM_ELEM_TAG);
+	BM_mesh_elem_hflag_enable_test(em->bm, BM_FACE, BM_ELEM_SELECT, true, false, BM_ELEM_TAG);
 
 	WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);




More information about the Bf-blender-cvs mailing list