[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [19222] branches/bmesh/blender/source/ blender/bmesh: merge with 2.5 at 19207, plus some half-finished walker stuff

Joseph Eagar joeedh at gmail.com
Sun Mar 8 09:03:27 CET 2009


Revision: 19222
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19222
Author:   joeedh
Date:     2009-03-08 09:03:27 +0100 (Sun, 08 Mar 2009)

Log Message:
-----------
merge with 2.5 at 19207, plus some half-finished walker stuff

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/bmesh/bmesh_queries.h
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_queries.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_walkers.c

Modified: branches/bmesh/blender/source/blender/bmesh/bmesh_queries.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh_queries.h	2009-03-08 07:15:41 UTC (rev 19221)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh_queries.h	2009-03-08 08:03:27 UTC (rev 19222)
@@ -12,6 +12,10 @@
 int BM_Verts_In_Edge(struct BMVert *v1, struct BMVert *v2, BMEdge *e);
 
 struct BMVert *BM_OtherEdgeVert(struct BMEdge *e, struct BMVert *v);
+
+/*finds other loop that shares v with e's loop in f.*/
+struct BMLoop *BM_OtherFaceLoop(BMEdge *e, BMFace *f, BMVert *v);
+
 //#define BM_OtherEdgeVert(e, v) (v==e->v1?e->v2:e->v1)
 
 struct BMEdge *BM_Edge_Exist(struct BMVert *v1, struct BMVert *v2);

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_queries.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_queries.c	2009-03-08 07:15:41 UTC (rev 19221)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_queries.c	2009-03-08 08:03:27 UTC (rev 19222)
@@ -50,6 +50,27 @@
 }
 
 /*
+ * BMESH OTHER EDGE IN FACE SHARING A VERTEX
+ *
+ * Returns an opposing edge that shares the same face.
+ *
+*/
+
+BMLoop *BM_OtherFaceLoop(BMEdge *e, BMFace *f, BMVert *v)
+{
+	BMLoop *l = f->loopbase, *l2, *l3;
+	int found = 0;
+	
+	do {
+		if (l->v == v) break;
+		found = 1;
+		l = l->head.next;
+	} while (l != f->loopbase);
+	
+	return l->head.prev;
+}
+
+/*
  * BMESH VERT IN FACE
  *
  * Returns whether or not a given vertex is

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_walkers.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_walkers.c	2009-03-08 07:15:41 UTC (rev 19221)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_walkers.c	2009-03-08 08:03:27 UTC (rev 19222)
@@ -15,7 +15,9 @@
  * walkers now use ghash rather then stealing flags.
    ghash can be rewritten to be faster if necassary.
  * walkers should always raise BMERR_WALKER_FAILED,
-   with a custom error message.
+   with a custom error message.  This message will
+   probably be replaced by operator-specific messages
+   in most cases.
  * tools should ALWAYS have necassary error handling
    for if walkers fail.
 */
@@ -215,6 +217,12 @@
 	walker->currentstate = newstate;
 }
 
+void BMWalker_reset(BMWalker *walker) {
+	while (walker->currentstate) {
+		BMWalker_popstate(walker);
+	}
+}
+
 /*	Shell Walker:
  *
  *	Starts at a vertex on the mesh and walks over the 'shell' it belongs 
@@ -319,33 +327,60 @@
 static void *islandboundWalker_Step(BMWalker *walker)
 {
 	islandboundWalker *iwalk = walker->currentstate, *owalk;
-	BMIter iter;
+	BMIter iter, liter;
 	BMVert *v;
 	BMEdge *e = iwalk->curedge;
-	int found;
+	BMFace *f;
+	BMLoop *l;
+	int found=0, radlen, sellen;;
 
 	owalk = iwalk;
 
 	if (iwalk->lastv == e->v1) v = e->v2;
 	else v = e->v1;
-	
-	BMWalker_popstate(walker);
 
-	e=BMIter_New(&iter, walker->bm, BM_EDGES_OF_VERT, v);
-	for (; e; e=BMIter_Step(&iter)) {
-		if (!BMO_TestFlag(walker->bm, e, walker->restrictflag))
-			continue;
-		if (BLI_ghash_haskey(walker->visithash, e)) continue;
+	if (BM_Nonmanifold_Vert(v)) {
+		BMWalker_reset(walker);
+		BMO_RaiseError(walker->bm, NULL,BMERR_WALKER_FAILED,
+			"Non-manifold vert"
+			"while searching region boundary");
+		return NULL;
+	}
 
-		BLI_ghash_insert(walker->visithash, e, NULL);
-		BMWalker_pushstate(walker);
-		
-		iwalk = walker->currentstate;
-		iwalk->base = iwalk->base;
-		iwalk->curedge = e;
-		iwalk->lastv = v;		
-		
+	BMWalker_popstate(walker);
+	
+	/*find start face*/
+	l = BMIter_New(&liter, walker->bm, BM_LOOPS_OF_EDGE; e);
+	for (; l; l=BMIter_Step(&liter)) {
+		if (BMO_TestFlag(walker->bm, l->f, walker->restrictflag)) {
+			f = l->f;
+			break;
+		}
 	}
+	
+	while (1) {
+		l = BM_OtherFaceLoop(e, v, f);
+		if (l) {
+			l = l->radial.next->data;
+			f = l->f;
+			e = l->e;
+			if(!BMO_TestFlag(walker->bm,l->f,walker->restrictflag))
+				break;
+		} else {
+			break;
+		}
+	}
+	
+	if (e == iwalk->curedge) return NULL;
+	if (BLI_ghash_haskey(walker->visithash, e)) return NULL;
 
+	BLI_ghash_insert(walker->visithash, e, NULL);
+	BMWalker_pushstate(walker);
+	
+	iwalk = walker->currentstate;
+	iwalk->base = owalk->base;
+	iwalk->curedge = e;
+	iwalk->lastv = v;				
+
 	return iwalk->curedge;
 }





More information about the Bf-blender-cvs mailing list