[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [19255] branches/bmesh/blender/source/ blender: implemented an (edge) loop walker.

Joseph Eagar joeedh at gmail.com
Wed Mar 11 06:13:37 CET 2009


Revision: 19255
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19255
Author:   joeedh
Date:     2009-03-11 06:13:36 +0100 (Wed, 11 Mar 2009)

Log Message:
-----------
implemented an (edge) loop walker.  note I misunderstood 
how original edge loop worked, and made it so if it starts
at a boundary edge, it walks across the boundary.  I'm not
sure if this is bad, most of the time I do that I want it
to do that anyway.

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/bmesh/bmesh.h
    branches/bmesh/blender/source/blender/bmesh/bmesh_operators.h
    branches/bmesh/blender/source/blender/bmesh/bmesh_queries.h
    branches/bmesh/blender/source/blender/bmesh/bmesh_walkers.h
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_polygon.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_queries.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_walkers.c
    branches/bmesh/blender/source/blender/bmesh/intern/editmesh_to_bmesh.c
    branches/bmesh/blender/source/blender/editors/mesh/editmesh_mods.c

Modified: branches/bmesh/blender/source/blender/bmesh/bmesh.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh.h	2009-03-11 02:58:18 UTC (rev 19254)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh.h	2009-03-11 05:13:36 UTC (rev 19255)
@@ -209,7 +209,9 @@
 //void bmesh_data_interp_from_face(struct BMesh *bm, struct BMFace *source, struct BMFace *target);
 
 struct EditMesh;
+struct BMOperator;
 BMesh *editmesh_to_bmesh(struct EditMesh *em);
+BMesh *init_editmesh_to_bmesh(struct EditMesh *em, struct BMOperator *op);
 struct EditMesh *bmesh_to_editmesh(BMesh *bm);
 
 /*include the rest of the API*/

Modified: branches/bmesh/blender/source/blender/bmesh/bmesh_operators.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh_operators.h	2009-03-11 02:58:18 UTC (rev 19254)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh_operators.h	2009-03-11 05:13:36 UTC (rev 19255)
@@ -55,6 +55,11 @@
 /*editmesh->bmesh op*/
 enum {
 	BMOP_FROM_EDITMESH_EM, /*em*/
+	
+	/*maps old elements to new ones.
+	 coud do new elements to old too,
+	 in the future*/
+	BMOP_FROM_EDITMESH_MAP,
 	BMOP_FROM_EDITMESH_TOTSLOT,
 };
 

Modified: branches/bmesh/blender/source/blender/bmesh/bmesh_queries.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh_queries.h	2009-03-11 02:58:18 UTC (rev 19254)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh_queries.h	2009-03-11 05:13:36 UTC (rev 19255)
@@ -33,4 +33,5 @@
 int BM_Edge_Share_Faces(struct BMEdge *e1, struct BMEdge *e2);
 int BM_Validate_Face(BMesh *bm, BMFace *face, FILE *err);
 int BM_FacesAroundEdge(BMEdge *e);
+int BM_EdgesAroundVert(BMVert *v);
 #endif

Modified: branches/bmesh/blender/source/blender/bmesh/bmesh_walkers.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh_walkers.h	2009-03-11 02:58:18 UTC (rev 19254)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh_walkers.h	2009-03-11 05:13:36 UTC (rev 19255)
@@ -39,11 +39,11 @@
 */
 
 #define BMW_SHELL	0
-/*#define BMW_LOOP	1
-#define BMW_RING	2
+#define BMW_LOOP	1
+/*#define BMW_RING	2
 #define BMW_UVISLANDS	3*/
-#define BMW_ISLANDBOUND	1
-#define BMW_ISLAND	2
-#define BMW_MAXWALKERS	3
+#define BMW_ISLANDBOUND	2
+#define BMW_ISLAND	3
+#define BMW_MAXWALKERS	4
 
 #endif
\ No newline at end of file

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c	2009-03-11 02:58:18 UTC (rev 19254)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c	2009-03-11 05:13:36 UTC (rev 19255)
@@ -240,6 +240,11 @@
 			}
 		}
 		
+		if (j != len) {
+			/*sanity check*/
+			return NULL;
+		}
+
 		overlap = BM_Exist_Face_Overlaps(bm, verts, len, &f);
 		
 		/*clear flags*/

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c	2009-03-11 02:58:18 UTC (rev 19254)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c	2009-03-11 05:13:36 UTC (rev 19255)
@@ -76,17 +76,17 @@
 
 BMOpDefine def_edit2bmesh = {
 	"editmesh_to_bmesh",
-	{{BMOP_OPSLOT_PNT, "emout"}},
+	{{BMOP_OPSLOT_PNT, "em"}, {BMOP_OPSLOT_MAPPING, "map"}},
 	edit2bmesh_exec,
-	BMOP_TO_EDITMESH_TOTSLOT,
+	BMOP_FROM_EDITMESH_TOTSLOT,
 	0
 };
 
 BMOpDefine def_bmesh2edit = {
 	"bmesh_to_editmesh",
-	{{BMOP_OPSLOT_PNT, "em"}},
+	{{BMOP_OPSLOT_PNT, "emout"}},
 	bmesh2edit_exec,
-	BMOP_FROM_EDITMESH_TOTSLOT,
+	BMOP_TO_EDITMESH_TOTSLOT,
 	0
 };
 

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_polygon.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_polygon.c	2009-03-11 02:58:18 UTC (rev 19254)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_polygon.c	2009-03-11 05:13:36 UTC (rev 19255)
@@ -395,18 +395,23 @@
 	
 	if (testedgeside(v1, v2, v3)) return 0;
 	
-	for (i=0; i<nvert; i++) {
-		if (i == v1i || i == v2i || i == v3i) continue;
+	//for (i=0; i<nvert; i++) {
+	do {
+		i = l->v->head.eflag2;
+		if (i == v1i || i == v2i || i == v3i) {
+			l = l->head.next;
+			continue;
+		}
 		
-		VECCOPY(pv1, projectverts[i]); //l->v->head.eflag2]);
-		VECCOPY(pv2, projectverts[(i+1) % nvert]); //((BMLoop*)l->head.next)->v->head.eflag2]);
+		VECCOPY(pv1, projectverts[l->v->head.eflag2]);
+		VECCOPY(pv2, projectverts[((BMLoop*)l->head.next)->v->head.eflag2]);
 		
 		//if (linecrosses(pv1, pv2, v1, v3)) return 0;
 		if (point_in_triangle(v1, v2, v3, pv1)) return 0;
 		if (point_in_triangle(v3, v2, v1, pv1)) return 0;
 
-		//l = l->head.next;
-	} //while (l != f->loopbase);
+		l = l->head.next;
+	} while (l != f->loopbase);
 	return 1;
 }
 /*

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_queries.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_queries.c	2009-03-11 02:58:18 UTC (rev 19254)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_queries.c	2009-03-11 05:13:36 UTC (rev 19255)
@@ -36,6 +36,12 @@
 	return 0;
 }
 
+int BM_EdgesAroundVert(BMVert *v)
+{
+	if (v == v->edge->v1) return bmesh_cycle_length(&v->edge->d1);
+	else return bmesh_cycle_length(&v->edge->d2);
+}
+
 /*
  * BMESH VERT IN EDGE
  *
@@ -52,7 +58,7 @@
 /*
  * BMESH OTHER EDGE IN FACE SHARING A VERTEX
  *
- * Returns an opposing edge that shares the same face.
+ * Returns an opposing loop that shares the same face.
  *
 */
 

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_walkers.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_walkers.c	2009-03-11 02:58:18 UTC (rev 19254)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_walkers.c	2009-03-11 05:13:36 UTC (rev 19255)
@@ -29,10 +29,6 @@
    for if walkers fail.
 */
 
-/*
-NOTE: This code needs to be read through a couple of times!!
-*/
-
 typedef struct shellWalker{
 	struct shellWalker *prev;
 	BMVert *base;			
@@ -51,6 +47,13 @@
 	BMFace *cur;
 } islandWalker;
 
+typedef struct loopWalker {
+	struct islandWalker * prev;
+	BMEdge *cur, *start;
+	BMVert *lastv, *startv;
+	int startrad, stage2;
+} loopWalker;
+
 /*  NOTE: this comment is out of date, update it - joeedh
  *	BMWalker - change this to use the filters functions.
  *	
@@ -87,12 +90,13 @@
 static void *islandboundWalker_yield(BMWalker *walker);
 static void *islandboundWalker_step(BMWalker *walker);
 
-
 static void islandWalker_begin(BMWalker *walker, void *data);
 static void *islandWalker_yield(BMWalker *walker);
 static void *islandWalker_step(BMWalker *walker);
 
-struct shellWalker;
+static void loopWalker_begin(BMWalker *walker, void *data);
+static void *loopWalker_yield(BMWalker *walker);
+static void *loopWalker_step(BMWalker *walker);
 
 /* Pointer hiding*/
 typedef struct bmesh_walkerGeneric{
@@ -143,13 +147,12 @@
 			walker->yield = islandWalker_yield;
 			size = sizeof(islandWalker);		
 			break;
-		
-		//case BMW_LOOP:
-		//	walker->begin = loopwalker_Begin;
-		//	walker->step = loopwalker_Step;
-		//	walker->yield = loopwalker_Yield;
-		//	size = sizeof(loopWalker);
-		//	break;
+		case BMW_LOOP:
+			walker->begin = loopWalker_begin;
+			walker->step = loopWalker_step;
+			walker->yield = loopWalker_yield;
+			size = sizeof(loopWalker);
+			break;
 		//case BMW_RING:
 		//	walker->begin = ringwalker_Begin;
 		//	walker->step = ringwalker_Step;
@@ -479,3 +482,115 @@
 	
 	return curf;
 }
+
+
+/*	Island Walker:
+ *
+ *	Starts at a tool flagged-face and walks over the face region
+ *
+ *	TODO:
+ *
+ *  Add restriction flag/callback for wire edges.
+ * 
+*/
+
+static void loopWalker_begin(BMWalker *walker, void *data){
+	loopWalker *lwalk = NULL, owalk;
+	BMEdge *e = data;
+	BMVert *v;
+	int found=1, val;
+
+	v = e->v1;
+
+	val = BM_EdgesAroundVert(v);
+
+	BMW_pushstate(walker);
+	
+	lwalk = walker->currentstate;
+	BLI_ghash_insert(walker->visithash, e, NULL);
+	
+	lwalk->cur = lwalk->start = e;
+	lwalk->lastv = lwalk->startv = v;
+	lwalk->stage2 = 0;
+	lwalk->startrad = BM_FacesAroundEdge(e);
+
+	/*rewind*/
+	while (walker->currentstate) {
+		owalk = *((loopWalker*)walker->currentstate);
+		BMW_walk(walker);
+	}
+
+	BMW_pushstate(walker);
+	lwalk = walker->currentstate;
+	*lwalk = owalk;
+
+	if (lwalk->lastv == owalk.cur->v1) lwalk->lastv = owalk.cur->v2;
+	else lwalk->lastv = owalk.cur->v1;
+
+	lwalk->startv = lwalk->lastv;
+
+	BLI_ghash_free(walker->visithash, NULL, NULL);
+	walker->visithash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp);
+	BLI_ghash_insert(walker->visithash, owalk.cur, NULL);
+}
+
+static void *loopWalker_yield(BMWalker *walker)
+{
+	loopWalker *lwalk = walker->currentstate;
+
+	return lwalk->cur;
+}
+
+static void *loopWalker_step(BMWalker *walker)
+{
+	loopWalker *lwalk = walker->currentstate, owalk;
+	BMIter iter;
+	BMEdge *e = lwalk->cur, *nexte = NULL;
+	BMLoop *l, *l2;
+	BMVert *v;
+	int val, rlen, found=0, i=0, stopi;
+
+	owalk = *lwalk;
+	
+	if (e->v1 == lwalk->lastv) v = e->v2;
+	else v = e->v1;
+
+	val = BM_EdgesAroundVert(v);
+	
+	BMW_popstate(walker);
+	
+	rlen = owalk.startrad;
+	l = e->loop;
+
+	if (val == 4 || val == 2 || rlen == 1) {		
+		i = 0;
+		stopi = val / 2;
+		while (1) {
+			if (rlen != 1 && i == stopi) break;
+
+			l = BM_OtherFaceLoop(l->e, l->f, v);
+			l2 = bmesh_radial_nextloop(l);
+			
+			if (l2 == l) {
+				break;
+			}
+
+			l = l2;
+
+			i += 1;
+		}
+	}
+	
+	if (l != e->loop && !BLI_ghash_haskey(walker->visithash, l->e)) {
+		if (!(rlen != 1 && i != stopi)) {
+			BMW_pushstate(walker);
+			lwalk = walker->currentstate;
+			*lwalk = owalk;
+			lwalk->cur = l->e;
+			lwalk->lastv = v;
+			BLI_ghash_insert(walker->visithash, l->e, NULL);
+		}
+	}
+	
+	return owalk.cur;
+}

Modified: branches/bmesh/blender/source/blender/bmesh/intern/editmesh_to_bmesh.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/editmesh_to_bmesh.c	2009-03-11 02:58:18 UTC (rev 19254)
+++ branches/bmesh/blender/source/blender/bmesh/intern/editmesh_to_bmesh.c	2009-03-11 05:13:36 UTC (rev 19255)
@@ -86,7 +86,7 @@
  *
 */

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list