[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [22220] branches/bmesh/blender/source/ blender: bmeshafied select more/less

Joseph Eagar joeedh at gmail.com
Wed Aug 5 09:15:17 CEST 2009


Revision: 22220
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=22220
Author:   joeedh
Date:     2009-08-05 09:15:17 +0200 (Wed, 05 Aug 2009)

Log Message:
-----------
bmeshafied select more/less

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/bmesh/bmesh_iterators.h
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c
    branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c
    branches/bmesh/blender/source/blender/editors/mesh/editmesh_mods.c
    branches/bmesh/blender/source/blender/editors/mesh/editmesh_tools.c
    branches/bmesh/blender/source/blender/editors/mesh/mesh_ops.c

Modified: branches/bmesh/blender/source/blender/bmesh/bmesh_iterators.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh_iterators.h	2009-08-05 06:45:47 UTC (rev 22219)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh_iterators.h	2009-08-05 07:15:17 UTC (rev 22220)
@@ -34,6 +34,10 @@
 for (ele = BMIter_New(iter, bm, type, data); ele; ele=BMIter_Step(iter)) {\
 	if (BM_TestHFlag(ele, BM_HIDDEN) || !BM_TestHFlag(ele, BM_SELECT)) continue;
 
+#define BM_ITER_NOTSELECT(ele, iter, bm, type, data)\
+for (ele = BMIter_New(iter, bm, type, data); ele; ele=BMIter_Step(iter)) {\
+	if (BM_TestHFlag(ele, BM_HIDDEN) || BM_TestHFlag(ele, BM_SELECT)) continue;
+
 /*these are topological iterators.*/
 #define BM_EDGES_OF_VERT 			4
 #define BM_FACES_OF_VERT 			5

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c	2009-08-05 06:45:47 UTC (rev 22219)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c	2009-08-05 07:15:17 UTC (rev 22220)
@@ -223,15 +223,37 @@
 		}while(l != f->loopbase);
 	}
 	else{ 
+		BMIter liter, fiter, eiter;
+		BMFace *f2;
+		BMLoop *l;
+		BMEdge *e;
+
 		if (BM_TestHFlag(f, BM_SELECT)) bm->totfacesel -= 1;
+		BM_ClearHFlag(&(f->head), BM_SELECT);
 
-		BM_ClearHFlag(&(f->head), BM_SELECT);
-		l = f->loopbase;
-		do {
-			BM_Select_Vert(bm, l->v, 0);
-			BM_Select_Edge(bm, l->e, 0);
-			l = ((BMLoop*)(l->head.next));
-		} while(l != f->loopbase);
+		/*flush down to edges*/
+		BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
+			BM_ITER(f2, &fiter, bm, BM_FACES_OF_EDGE, l->e) {
+				if (BM_TestHFlag(f2, BM_SELECT))
+					break;
+			}
+
+			if (!f2) {
+				BM_Select(bm, l->e, 0);
+			}
+		}
+
+		/*flush down to verts*/
+		BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
+			BM_ITER(e, &eiter, bm, BM_EDGES_OF_VERT, l->v) {
+				if (BM_TestHFlag(e, BM_SELECT))
+					break;
+			}
+
+			if (!e) {
+				BM_Select(bm, l->v, 0);
+			}
+		}
 	}
 }
 
@@ -417,7 +439,7 @@
 		
 		/*for now, use face normal*/
 
-		/* make a fake  plane thats at rightangles to the normal
+		/* make a fake plane thats at rightangles to the normal
 		we cant make a crossvec from a vec thats the same as the vec
 		unlikely but possible, so make sure if the normal is (0,0,1)
 		that vec isnt the same or in the same direction even.*/
@@ -425,7 +447,7 @@
 		else if (efa->no[1]<0.5)	vec[1]=1.0f;
 		else				vec[2]=1.0f;
 		Crossf(plane, efa->no, vec);
-#if 0
+#if 0 //BMESH_TODO
 
 		if (efa->v4) { /*if its a quad- set the plane along the 2 longest edges.*/
 			float vecA[3], vecB[3];

Modified: branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c	2009-08-05 06:45:47 UTC (rev 22219)
+++ branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c	2009-08-05 07:15:17 UTC (rev 22220)
@@ -1580,7 +1580,7 @@
 	int i, tot;
 
 	tot = 0;
-	BM_ITER_SELECT(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL)
+		BM_ITER_SELECT(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL)
 		if (BM_TestHFlag(v, BM_SELECT)) {
 			V_GROW(verts);
 			verts[tot++] = v;
@@ -1619,3 +1619,205 @@
 	
 	RNA_def_boolean(ot->srna, "limit", 0, "Limit by Seams", "");
 }
+
+/* ******************** **************** */
+
+void EDBM_select_more(BMEditMesh *em)
+{
+	BMIter iter;
+	
+	/*for now, bmops aren't supposed to mess with header flags
+	  (might need to revisit that design decision later), so 
+	  this function is slightly unconventional to avoid the use
+	  of the BMO_[Set/Clear]Flag functions.  it accumulates lists
+	  of elements to make selection changes to in pointer arrays.*/
+
+	if (em->selectmode <= SCE_SELECT_EDGE) {
+		BMVert *v;
+		BMEdge *e;
+		BMIter eiter;
+		BMVert **verts = NULL;
+		V_DECLARE(verts);
+		V_DECLARE(edges);
+		BMEdge **edges = NULL;
+		int vtot=0, etot=0, i;
+
+		BM_ITER_NOTSELECT(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL)
+			BM_ITER(e, &eiter, em->bm, BM_EDGES_OF_VERT, v) {
+				if (BM_TestHFlag(BM_OtherEdgeVert(e, v), BM_SELECT))
+					break;
+			}
+
+			if (e) {
+				V_GROW(verts);
+				verts[vtot++] = v;
+			}
+
+		}
+
+		for (i=0; i<vtot; i++) {
+			BM_Select(em->bm, verts[i], 1);
+		}
+
+		/*make sure we flush from vertices on up, not from edges*/
+		EDBM_select_flush(em, SCE_SELECT_VERTEX);
+
+		V_FREE(verts);
+	} else {
+		BMIter liter, fiter;
+		BMFace *f, *f2, **faces = NULL;
+		V_DECLARE(faces);
+		BMLoop *l;
+		int i, tot=0;
+
+		BM_ITER_SELECT(f, &iter, em->bm, BM_FACES_OF_MESH, NULL)
+			BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, f) {
+				BM_ITER(f2, &fiter, em->bm, BM_FACES_OF_EDGE, l->e) {
+					if (!BM_TestHFlag(f2, BM_SELECT)) {
+						V_GROW(faces);
+						faces[tot++] = f2;
+					}
+				}
+			}
+		}
+
+		for (i=0; i<tot; i++) {
+			BM_Select(em->bm, faces[i], 1);
+		}
+
+		V_FREE(faces);
+	}
+
+	EDBM_selectmode_flush(em);
+}
+
+static int select_more(bContext *C, wmOperator *op)
+{
+	Object *obedit= CTX_data_edit_object(C);
+	BMEditMesh *em= (((Mesh *)obedit->data))->edit_btmesh;
+
+	EDBM_select_more(em);
+
+	WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+
+	return OPERATOR_FINISHED;
+}
+
+void MESH_OT_select_more(wmOperatorType *ot)
+{
+	/* identifiers */
+	ot->name= "Select More";
+	ot->idname= "MESH_OT_select_more";
+
+	/* api callbacks */
+	ot->exec= select_more;
+	ot->poll= ED_operator_editmesh;
+	
+	/* flags */
+	ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+void EDBM_select_less(BMEditMesh *em)
+{
+	BMIter iter;
+	
+	/*for now, bmops aren't supposed to mess with header flags
+	  (might need to revisit that design decision later), so 
+	  this function is slightly unconventional to avoid the use
+	  of the BMO_[Set/Clear]Flag functions.  it accumulates lists
+	  of elements to make selection changes to in pointer arrays.*/
+
+	if (em->selectmode <= SCE_SELECT_EDGE) {
+		BMVert *v;
+		BMEdge *e;
+		BMIter eiter;
+		BMVert **verts = NULL;
+		V_DECLARE(verts);
+		V_DECLARE(edges);
+		BMEdge **edges = NULL;
+		int vtot=0, etot=0, i;
+
+		BM_ITER_SELECT(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL)
+			BM_ITER(e, &eiter, em->bm, BM_EDGES_OF_VERT, v) {
+				if (!BM_TestHFlag(e, BM_SELECT))
+					break;
+			}
+
+			if (e) {
+				V_GROW(verts);
+				verts[vtot++] = v;
+
+				BM_ITER(e, &eiter, em->bm, BM_EDGES_OF_VERT, v) {
+					V_GROW(edges);
+					edges[etot++] = e;
+				}
+			}
+		}
+
+		for (i=0; i<vtot; i++) {
+			BM_Select(em->bm, verts[i], 0);
+		}
+
+		for (i=0; i<etot; i++) {
+			BM_Select(em->bm, edges[i], 0);
+		}
+
+		V_FREE(verts);
+		V_FREE(edges);
+	} else {
+		BMIter liter, fiter;
+		BMFace *f, *f2, **faces = NULL;
+		V_DECLARE(faces);
+		BMLoop *l;
+		int i, tot=0;
+
+		BM_ITER_SELECT(f, &iter, em->bm, BM_FACES_OF_MESH, NULL)
+			BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, f) {
+				BM_ITER(f2, &fiter, em->bm, BM_FACES_OF_EDGE, l->e) {
+					if (!BM_TestHFlag(f2, BM_SELECT))
+						break;
+				}
+				if (f2)
+					break;
+			}
+
+			if (l) {
+				V_GROW(faces);
+				faces[tot++] = f;
+			}
+		}
+
+		for (i=0; i<tot; i++) {
+			BM_Select(em->bm, faces[i], 0);
+		}
+
+		V_FREE(faces);
+	}
+
+	EDBM_selectmode_flush(em);
+}
+
+static int select_less(bContext *C, wmOperator *op)
+{
+	Object *obedit= CTX_data_edit_object(C);
+	BMEditMesh *em= (((Mesh *)obedit->data))->edit_btmesh;
+
+	EDBM_select_less(em);
+
+	WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+	return OPERATOR_FINISHED;
+}
+
+void MESH_OT_select_less(wmOperatorType *ot)
+{
+	/* identifiers */
+	ot->name= "Select Less";
+	ot->idname= "MESH_OT_select_less";
+
+	/* api callbacks */
+	ot->exec= select_less;
+	ot->poll= ED_operator_editmesh;
+	
+	/* flags */
+	ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}

Modified: branches/bmesh/blender/source/blender/editors/mesh/editmesh_mods.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/editmesh_mods.c	2009-08-05 06:45:47 UTC (rev 22219)
+++ branches/bmesh/blender/source/blender/editors/mesh/editmesh_mods.c	2009-08-05 07:15:17 UTC (rev 22220)
@@ -2361,165 +2361,7 @@
 	ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
 }
 
-/* ******************** **************** */
 
-void EM_select_more(EditMesh *em)
-{
-	EditVert *eve;
-	EditEdge *eed;
-	EditFace *efa;
-	
-	for(eve= em->verts.first; eve; eve= eve->next) {
-		if(eve->f & SELECT) eve->f1= 1;
-		else eve->f1 = 0;
-	}
-	
-	/* set f1 flags in vertices to select 'more' */
-	for(eed= em->edges.first; eed; eed= eed->next) {
-		if(eed->h==0) {
-			if (eed->v1->f & SELECT)
-				eed->v2->f1 = 1;
-			if (eed->v2->f & SELECT)
-				eed->v1->f1 = 1;
-		}
-	}
-
-	/* new selected edges, but not in facemode */
-	if(em->selectmode <= SCE_SELECT_EDGE) {
-		
-		for(eed= em->edges.first; eed; eed= eed->next) {
-			if(eed->h==0) {
-				if(eed->v1->f1 && eed->v2->f1) EM_select_edge(eed, 1);
-			}
-		}
-	}
-	/* new selected faces */
-	for(efa= em->faces.first; efa; efa= efa->next) {
-		if(efa->h==0) {
-			if(efa->v1->f1 && efa->v2->f1 && efa->v3->f1 && (efa->v4==NULL || efa->v4->f1)) 
-				EM_select_face(efa, 1);
-		}
-	}
-}
-
-static int select_more(bContext *C, wmOperator *op)
-{
-	Object *obedit= CTX_data_edit_object(C);
-	EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)obedit->data)) ;
-
-	EM_select_more(em);
-
-//	if (EM_texFaceCheck(em))
-
-	WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
-
-	BKE_mesh_end_editmesh(obedit->data, em);
-	return OPERATOR_FINISHED;
-}
-
-void MESH_OT_select_more(wmOperatorType *ot)
-{
-	/* identifiers */
-	ot->name= "Select More";
-	ot->idname= "MESH_OT_select_more";
-
-	/* api callbacks */
-	ot->exec= select_more;
-	ot->poll= ED_operator_editmesh;
-	
-	/* flags */
-	ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-}
-
-void EM_select_less(EditMesh *em)
-{
-	EditEdge *eed;
-	EditFace *efa;
-
-	if(em->selectmode <= SCE_SELECT_EDGE) {
-		/* eed->f1 == 1:  edge with a selected and deselected vert */ 
-
-		for(eed= em->edges.first; eed; eed= eed->next) {
-			eed->f1= 0;
-			if(eed->h==0) {
-				
-				if ( !(eed->v1->f & SELECT) && (eed->v2->f & SELECT) ) 
-					eed->f1= 1;
-				if ( (eed->v1->f & SELECT) && !(eed->v2->f & SELECT) ) 
-					eed->f1= 1;
-			}
-		}
-		
-		/* deselect edges with flag set */
-		for(eed= em->edges.first; eed; eed= eed->next) {
-			if (eed->h==0 && eed->f1 == 1) {
-				EM_select_edge(eed, 0);
-			}
-		}
-		EM_deselect_flush(em);
-		
-	}
-	else {
-		/* deselect faces with 1 or more deselect edges */

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list