[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20940] branches/bmesh/blender/source/ blender: further fixes for modifiers, and edge loop select works now.

Joseph Eagar joeedh at gmail.com
Tue Jun 16 22:33:13 CEST 2009


Revision: 20940
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20940
Author:   joeedh
Date:     2009-06-16 22:33:13 +0200 (Tue, 16 Jun 2009)

Log Message:
-----------
further fixes for modifiers, and edge loop select works now.

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/bmesh/bmesh_walkers.h
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_walkers.c
    branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c

Modified: branches/bmesh/blender/source/blender/bmesh/bmesh_walkers.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh_walkers.h	2009-06-16 20:08:40 UTC (rev 20939)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh_walkers.h	2009-06-16 20:33:13 UTC (rev 20940)
@@ -40,24 +40,25 @@
 BMW_End(&walker);
 */
 
-/*walk over connected geometry.  can restrict to a search flag,
-  or not, it's optional.*/
-#define BMW_SHELL	0
+enum {
+	/*walk over connected geometry.  can restrict to a search flag,
+	or not, it's optional.*/
+	BMW_SHELL,
+	/*walk over an edge loop.  search flag doesn't do anything.*/
+	BMW_LOOP,
+	BMW_FACELOOP,
+	BMW_EDGERING,
+	/*#define BMW_RING	2
+	#define BMW_UVISLANDS	3*/
+	/*walk over an island of flagged faces.  note, that this doesn't work on
+	  non-manifold geometry.  it might be better to rewrite this to extract
+	  boundary info from the island walker, rather then directly walking
+	  over the boundary.  raises an error if it encouters nonmanifold
+	  geometry.*/
+	BMW_ISLANDBOUND,
+	/*walk over all faces in an island of tool flagged faces.*/
+	BMW_ISLAND,
+	BMW_MAXWALKERS,
+};
 
-/*walk over an edge loop.  search flag doesn't do anything.*/
-#define BMW_LOOP	1
-/*#define BMW_RING	2
-#define BMW_UVISLANDS	3*/
-/*walk over an island of flagged faces.  note, that this doesn't work on
-  non-manifold geometry.  it might be better to rewrite this to extract
-  boundary info from the island walker, rather then directly walking
-  over the boundary.  raises an error if it encouters nonmanifold
-  geometry.*/
-#define BMW_ISLANDBOUND	2
-
-/*walk over all faces in an island of tool flagged faces.*/
-#define BMW_ISLAND	3
-
-#define BMW_MAXWALKERS	4
-
 #endif
\ No newline at end of file

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_walkers.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_walkers.c	2009-06-16 20:08:40 UTC (rev 20939)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_walkers.c	2009-06-16 20:33:13 UTC (rev 20940)
@@ -48,12 +48,17 @@
 } islandWalker;
 
 typedef struct loopWalker {
-	struct islandWalker * prev;
+	struct loopWalker * prev;
 	BMEdge *cur, *start;
 	BMVert *lastv, *startv;
 	int startrad, stage2;
 } loopWalker;
 
+typedef struct faceloopWalker {
+	struct faceloopWalker * prev;
+	BMFace *f;
+} faceloopWalker;
+
 /*  NOTE: this comment is out of date, update it - joeedh
  *	BMWalker - change this to use the filters functions.
  *	
@@ -98,6 +103,10 @@
 static void *loopWalker_yield(BMWalker *walker);
 static void *loopWalker_step(BMWalker *walker);
 
+static void faceloopWalker_begin(BMWalker *walker, void *data);
+static void *faceloopWalker_yield(BMWalker *walker);
+static void *faceloopWalker_step(BMWalker *walker);
+
 /* Pointer hiding*/
 typedef struct bmesh_walkerGeneric{
 	struct bmesh_walkerGeneric *prev;
@@ -153,12 +162,12 @@
 			walker->yield = loopWalker_yield;
 			size = sizeof(loopWalker);
 			break;
-		//case BMW_RING:
-		//	walker->begin = ringwalker_Begin;
-		//	walker->step = ringwalker_Step;
-		//	walker->yield = ringwalker_Yield;
-		//	size = sizeof(ringWalker);
-		//	break;
+		case BMW_FACELOOP:
+			walker->begin = faceloopWalker_begin;
+			walker->step = faceloopWalker_step;
+			walker->yield = faceloopWalker_yield;
+			size = sizeof(faceloopWalker);
+			break;
 		default:
 			break;
 	}
@@ -594,3 +603,48 @@
 	
 	return owalk.cur;
 }
+
+static void faceloopWalker_begin(BMWalker *walker, void *data)
+{
+	faceloopWalker *lwalk;
+	BMEdge *e = data;
+
+	BMW_pushstate(walker);
+
+	if (!e->loop) return;
+
+	lwalk = walker->currentstate;
+	lwalk->l = e->loop;
+
+	BLI_ghash_insert(walker->visithash, lwalk->l->f, NULL);
+}
+
+static void *faceloopWalker_yield(BMWalker *walker)
+{
+	faceloopWalker *lwalk = walker->currentstate;
+	
+	if (!lwalk) return NULL;
+
+	return lwalk->l->f;
+}
+
+static void *faceloopWalker_step(BMWalker *walker)
+{
+	faceloopWalker *lwalk = walker->currentstate;
+	BMFace *f = lwalk->l->f;
+	BMLoop *l = lwalk->l;
+
+	l = l->head.next->next;
+	l = l->radial.next->data;
+	
+	BMW_popstate(walker);
+
+	if (!BLI_ghash_haskey(walker->visithash, l->f)) {
+		BMW_pushstate(walker);
+		lwalk = walker->currentstate;
+		lwalk->l = l;
+	}
+
+	return f;
+}
+

Modified: branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c	2009-06-16 20:08:40 UTC (rev 20939)
+++ branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c	2009-06-16 20:33:13 UTC (rev 20940)
@@ -805,14 +805,27 @@
 /* ***************************************************** */
 
 /* ****************  LOOP SELECTS *************** */
+static void walker_select(BMEditMesh *em, int walker, void *start, int select)
+{
+	BMesh *bm = em->bm;
+	BMHeader *h;
+	BMWalker walker;
 
+	BMW_Init(&walker, bm, walker, 0);
+	h = BMW_Begin(&walker, start);
+	for (; h; h=BMW_Step(&walker)) {
+		BM_Select(bm, h, select);
+	}
+	BMW_End(&walker);
+}
+
+#if 0
 /* selects quads in loop direction of indicated edge */
 /* only flush over edges with valence <= 2 */
-void faceloop_select(BMEditMesh *em, BMEdge *startedge, int select)
+void faceloop_select(EditMesh *em, EditEdge *startedge, int select)
 {
-#if 0 //BMESH_TODO
-	BMEdge *eed;
-	BMFace *efa;
+	EditEdge *eed;
+	EditFace *efa;
 	int looking= 1;
 	
 	/* in eed->f1 we put the valence (amount of faces in edge) */
@@ -875,8 +888,8 @@
 			if(efa->f1) EM_select_face(efa, select);
 		}
 	}
+}
 #endif
-}
 
 
 /* selects or deselects edges that:
@@ -890,20 +903,7 @@
 - if edge no face:
 	- has vertices with valence 2
 */
-static void edgeloop_select(BMEditMesh *em, BMEdge *starteed, int select)
-{
-	BMesh *bm = em->bm;
-	BMEdge *e;
-	BMWalker walker;
 
-	BMW_Init(&walker, bm, BMW_LOOP, 0);
-	e = BMW_Begin(&walker, starteed);
-	for (; e; e=BMW_Step(&walker)) {
-		BM_Select(bm, e, 1);
-	}
-	BMW_End(&walker);
-}
-
 /* 
    Almostly exactly the same code as faceloop select
 */
@@ -1067,19 +1067,19 @@
 		else if(extend) select=0;
 
 		if(em->selectmode & SCE_SELECT_FACE) {
-			faceloop_select(em, eed, select);
+			walker_select(em, BMW_FACELOOP, starteed, select);
 		}
 		else if(em->selectmode & SCE_SELECT_EDGE) {
 			if(ring)
 				edgering_select(em, eed, select);
 			else
-				edgeloop_select(em, eed, select);
+				walker_select(em, BMW_LOOP, starteed, select);
 		}
 		else if(em->selectmode & SCE_SELECT_VERTEX) {
 			if(ring)
 				edgering_select(em, eed, select);
 			else 
-				edgeloop_select(em, eed, select);
+				walker_select(em, BMW_LOOP, starteed, select);
 		}
 
 		EDBM_selectmode_flush(em);





More information about the Bf-blender-cvs mailing list