[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [40704] branches/bmesh/blender/source/ blender: Fixes for a few bugs in selection and the interaction between BM_SELECT and BM_HIDDEN :

Andrew Wiggin ender79bl at gmail.com
Fri Sep 30 06:27:14 CEST 2011


Revision: 40704
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=40704
Author:   ender79
Date:     2011-09-30 04:27:12 +0000 (Fri, 30 Sep 2011)
Log Message:
-----------
Fixes for a few bugs in selection and the interaction between BM_SELECT and BM_HIDDEN:
- Select all was selecting hidden elements
- Select flush was also selecting hidden elements (so selecting two *visible* vertices of a *hidden* edge selected that hidden edge)
- Several places were using BM_SetHFlag(elem, BM_SELECT) directly, when they should be using BM_Select(bm, elem)
- In certain scenarios, "reveal all" could leave you with selections which aren't valid in that selection mode (e.g. lonely edges selected in face select mode)

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c
    branches/bmesh/blender/source/blender/bmesh/operators/subdivideop.c
    branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c
    branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c	2011-09-29 23:51:41 UTC (rev 40703)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c	2011-09-30 04:27:12 UTC (rev 40704)
@@ -69,8 +69,12 @@
 
 	if(bm->selectmode & SCE_SELECT_VERTEX) {
 		for(e = BMIter_New(&edges, bm, BM_EDGES_OF_MESH, bm ); e; e= BMIter_Step(&edges)) {
-			if(BM_TestHFlag(e->v1, BM_SELECT) && BM_TestHFlag(e->v2, BM_SELECT)) BM_SetHFlag(e, BM_SELECT);
-			else BM_ClearHFlag(e, BM_SELECT);
+			if(BM_TestHFlag(e->v1, BM_SELECT) && BM_TestHFlag(e->v2, BM_SELECT) && !BM_TestHFlag(e, BM_HIDDEN)) {
+				BM_SetHFlag(e, BM_SELECT);
+			}
+			else {
+				BM_ClearHFlag(e, BM_SELECT);
+			}
 		}
 		for(f = BMIter_New(&faces, bm, BM_FACES_OF_MESH, bm ); f; f= BMIter_Step(&faces)) {
 			totsel = 0;
@@ -81,10 +85,12 @@
 				l = l->next;
 			} while(l != bm_firstfaceloop(f));
 			
-			if(totsel == f->len) 
+			if(totsel == f->len && !BM_TestHFlag(f, BM_HIDDEN)) {
 				BM_SetHFlag(f, BM_SELECT);
-			else
+			}
+			else {
 				BM_ClearHFlag(f, BM_SELECT);
+			}
 		}
 	}
 	else if(bm->selectmode & SCE_SELECT_EDGE) {
@@ -97,10 +103,12 @@
 				l = l->next;
 			}while(l!=bm_firstfaceloop(f));
 			
-			if(totsel == f->len) 
+			if(totsel == f->len && !BM_TestHFlag(f, BM_HIDDEN)) {
 				BM_SetHFlag(f, BM_SELECT);
-			else 
+			}
+			else {
 				BM_ClearHFlag(f, BM_SELECT);
+			}
 		}
 	}
 
@@ -123,12 +131,20 @@
 	/* BMIter iter; */
 	/* BMEdge *e; */
 
+	if (BM_TestHFlag(v, BM_HIDDEN)) {
+		return;
+	}
+
 	if(select) {
-		if (!BM_TestHFlag(v, BM_SELECT)) bm->totvertsel += 1;
-		BM_SetHFlag(v, BM_SELECT);
+		if (!BM_TestHFlag(v, BM_SELECT)) {
+			bm->totvertsel += 1;
+			BM_SetHFlag(v, BM_SELECT);
+		}
 	} else {
-		if (BM_TestHFlag(v, BM_SELECT)) bm->totvertsel -= 1;
-		BM_ClearHFlag(v, BM_SELECT);
+		if (BM_TestHFlag(v, BM_SELECT)) {
+			bm->totvertsel -= 1;
+			BM_ClearHFlag(v, BM_SELECT);
+		}
 	}
 }
 
@@ -142,6 +158,9 @@
 
 void BM_Select_Edge(BMesh *bm, BMEdge *e, int select)
 {
+	if (BM_TestHFlag(e, BM_HIDDEN)) {
+		return;
+	}
 
 	if(select){
 		if (!BM_TestHFlag(e, BM_SELECT)) bm->totedgesel += 1;
@@ -201,6 +220,10 @@
 {
 	BMLoop *l;
 
+	if (BM_TestHFlag(f, BM_HIDDEN)) {
+		return;
+	}
+
 	if(select){ 
 		if (!BM_TestHFlag(f, BM_SELECT)) bm->totfacesel += 1;
 
@@ -607,25 +630,25 @@
 static void vert_flush_hide(BMesh *bm, BMVert *v) {
 	BMIter iter;
 	BMEdge *e;
+	int hide = 1;
 
 	BM_ITER(e, &iter, bm, BM_EDGES_OF_VERT, v) {
-		if (!BM_TestHFlag(e, BM_HIDDEN))
-			return;
+		hide = hide && BM_TestHFlag(e, BM_HIDDEN);
 	}
 
-	BM_SetHFlag(v, BM_HIDDEN);
+	SETHIDE(v);
 }
 
 static void edge_flush_hide(BMesh *bm, BMEdge *e) {
 	BMIter iter;
 	BMFace *f;
+	int hide = 1;
 
 	BM_ITER(f, &iter, bm, BM_FACES_OF_EDGE, e) {
-		if (!BM_TestHFlag(f, BM_HIDDEN))
-			return;
+		hide = hide && BM_TestHFlag(f, BM_HIDDEN);
 	}
 
-	BM_SetHFlag(e, BM_HIDDEN);
+	SETHIDE(e);
 }
 
 void BM_Hide_Vert(BMesh *bm, BMVert *v, int hide)

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c	2011-09-29 23:51:41 UTC (rev 40703)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c	2011-09-30 04:27:12 UTC (rev 40704)
@@ -678,8 +678,9 @@
 		if (!(type & data[i]->type))
 			continue;
 
-		if (flag & BM_SELECT)
+		if (flag & BM_SELECT) {
 			BM_Select(bm, data[i], 1);
+		}
 		BM_SetHFlag(data[i], flag);
 	}
 }

Modified: branches/bmesh/blender/source/blender/bmesh/operators/subdivideop.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/operators/subdivideop.c	2011-09-29 23:51:41 UTC (rev 40703)
+++ branches/bmesh/blender/source/blender/bmesh/operators/subdivideop.c	2011-09-30 04:27:12 UTC (rev 40704)
@@ -1141,11 +1141,11 @@
 				BM_ITER(e, &eiter, bm, BM_EDGES_OF_VERT, ele) {
 					if (!BM_TestHFlag(e, BM_SELECT) && BM_TestHFlag(e->v1, BM_SELECT) 
 													&& BM_TestHFlag(e->v2, BM_SELECT)) {
-						BM_SetHFlag(e, BM_SELECT);
+						BM_Select(bm, e, 1);
 						bm->totedgesel += 1;
 					} else if (BM_TestHFlag(e, BM_SELECT) && (!BM_TestHFlag(e->v1, BM_SELECT) 
 														  || !BM_TestHFlag(e->v2, BM_SELECT))) {
-						BM_ClearHFlag(e, BM_SELECT);
+						BM_Select(bm, e, 0);
 						bm->totedgesel -= 1;		
 					}
 				}

Modified: branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c	2011-09-29 23:51:41 UTC (rev 40703)
+++ branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c	2011-09-30 04:27:12 UTC (rev 40704)
@@ -521,18 +521,20 @@
 		eed = BMIter_New(&iter, em->bm, BM_EDGES_OF_MESH, NULL);
 		for ( ; eed; eed=BMIter_Step(&iter)) {
 			if (BM_TestHFlag(eed, flag)) {
-				if (flag != BM_SELECT) {
-					BM_SetHFlag(eed->v1, flag);
-					BM_SetHFlag(eed->v2, flag);
-				} else {
+				if (flag & BM_SELECT) {
 					BM_Select(em->bm, eed->v1, 1);
 					BM_Select(em->bm, eed->v2, 1);
 				}
+
+				BM_SetHFlag(eed->v1, flag & ~BM_SELECT);
+				BM_SetHFlag(eed->v2, flag & ~BM_SELECT);
 			} else {
 				if (BM_TestHFlag(eed->v1, flag) && BM_TestHFlag(eed->v2, flag)) {
-					if (flag != BM_SELECT)
-						BM_SetHFlag(eed, flag);
-					else BM_Select(em->bm, eed, 1);
+					if (flag & BM_SELECT) {
+						BM_Select(em->bm, eed, 1);
+					}
+
+					BM_SetHFlag(eed, flag & ~BM_SELECT);
 				}
 			}
 		}
@@ -1659,20 +1661,31 @@
 	BMIter iter;
 	BMHeader *ele;
 	int i, types[3] = {BM_VERTS_OF_MESH, BM_EDGES_OF_MESH, BM_FACES_OF_MESH};
-	int sels[3] = {1, !(em->selectmode & SCE_SELECT_VERTEX), !(em->selectmode & (SCE_SELECT_VERTEX | SCE_SELECT_EDGE))};
+	int sels[3] = {
+		(em->selectmode & SCE_SELECT_VERTEX),
+		(em->selectmode & SCE_SELECT_EDGE),
+		(em->selectmode & SCE_SELECT_FACE),
+	};
 
-	/*Reveal all hidden elements. Handle the reveal in order of faces,
-	  edges, and finally vertices. This is important because revealing
-	  edges may reveal faces, and revealing verts may reveal edges and
-	  faces. Revealing edges or faces in an earlier pass would keep them
-	  from getting selected in the later passes.*/
-	for (i=2; i>=0; i--) {
+	/* Use index field to remember what was hidden before all is revealed. */
+	for (i=0; i<3; i++) {
 		BM_ITER(ele, &iter, em->bm, types[i], NULL) {
-			if (BM_TestHFlag(ele, BM_HIDDEN)) {
-				BM_Hide(em->bm, ele, 0);
+			BM_SetIndex(ele, BM_TestHFlag(ele, BM_HIDDEN) ? 1 : 0);
+		}
+	}
 
-				if (sels[i])
-					BM_Select(em->bm, ele, 1);
+	/* Reveal everything */
+	EDBM_clear_flag_all(em, BM_HIDDEN);
+
+	/* Select relevant just-revealed elements */
+	for (i=0; i<3; i++) {
+		if (!sels[i]) {
+			continue;
+		}
+
+		BM_ITER(ele, &iter, em->bm, types[i], NULL) {
+			if (BM_GetIndex(ele)) {
+				BM_Select(em->bm, ele, 1);
 			}
 		}
 	}
@@ -2755,17 +2768,17 @@
 			e = BM_OtherFaceLoop(e2, l->f, v)->e;
 
 			BM_SetIndex(e, 1);
-			BM_SetHFlag(e, BM_SELECT);
+			BM_Select(em->bm, e, 1);
 		} else if (BM_Edge_FaceCount(e2) == 2) {
 			l = e2->l;
 			e = BM_OtherFaceLoop(e2, l->f, v)->e;
 			BM_SetIndex(e, 1);
-			BM_SetHFlag(e, BM_SELECT);
+			BM_Select(em->bm, e, 1);
 			
 			l = e2->l->radial_next;
 			e = BM_OtherFaceLoop(e2, l->f, v)->e;
 			BM_SetIndex(e, 1);
-			BM_SetHFlag(e, BM_SELECT);
+			BM_Select(em->bm, e, 1);
 		}
 
 		dist = FLT_MAX;

Modified: branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c	2011-09-29 23:51:41 UTC (rev 40703)
+++ branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c	2011-09-30 04:27:12 UTC (rev 40704)
@@ -502,8 +502,11 @@
 		
 		ele = BMIter_New(&iter, em->bm, type, NULL);
 		for ( ; ele; ele=BMIter_Step(&iter)) {
-			if (flag & BM_SELECT) BM_Select(em->bm, ele, 1);
-			BM_SetHFlag(ele, flag);
+			if (flag & BM_SELECT) {
+				BM_Select(em->bm, ele, 1);
+			}
+
+			BM_SetHFlag(ele, flag & ~BM_SELECT);
 		}
 	}
 }




More information about the Bf-blender-cvs mailing list