[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [22005] branches/bmesh/blender/source/ blender: edge ring select works again.

Joseph Eagar joeedh at gmail.com
Wed Jul 29 02:43:05 CEST 2009


Revision: 22005
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=22005
Author:   joeedh
Date:     2009-07-29 02:43:05 +0200 (Wed, 29 Jul 2009)

Log Message:
-----------
edge ring select works again.

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

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_walkers.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_walkers.c	2009-07-29 00:37:37 UTC (rev 22004)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_walkers.c	2009-07-29 00:43:05 UTC (rev 22005)
@@ -19,7 +19,7 @@
  basic design pattern: the walker step function goes through it's
  list of possible choices for recursion, and recurses (by pushing a new state)
  using the first non-visited one.  this choise is the flagged as visited using
- the ghash.  each time this happens, only one state is pushed.
+ the ghash.  each step may push multiple new states onto the stack at once.
 
  * walkers use tool flags, not header flags
  * walkers now use ghash for storing visited elements, 
@@ -57,8 +57,14 @@
 typedef struct faceloopWalker {
 	struct faceloopWalker * prev;
 	BMLoop *l;
+	int nocalc;
 } faceloopWalker;
 
+typedef struct edgeringWalker {
+	struct edgeringWalker * prev;
+	BMLoop *l;
+} edgeringWalker;
+
 /*  NOTE: this comment is out of date, update it - joeedh
  *	BMWalker - change this to use the filters functions.
  *	
@@ -107,6 +113,10 @@
 static void *faceloopWalker_yield(BMWalker *walker);
 static void *faceloopWalker_step(BMWalker *walker);
 
+static void edgeringWalker_begin(BMWalker *walker, void *data);
+static void *edgeringWalker_yield(BMWalker *walker);
+static void *edgeringWalker_step(BMWalker *walker);
+
 /* Pointer hiding*/
 typedef struct bmesh_walkerGeneric{
 	struct bmesh_walkerGeneric *prev;
@@ -168,6 +178,12 @@
 			walker->yield = faceloopWalker_yield;
 			size = sizeof(faceloopWalker);
 			break;
+		case BMW_EDGERING:
+			walker->begin = edgeringWalker_begin;
+			walker->step = edgeringWalker_step;
+			walker->yield = edgeringWalker_yield;
+			size = sizeof(edgeringWalker);
+			break;
 		default:
 			break;
 	}
@@ -614,6 +630,7 @@
 
 	lwalk = walker->currentstate;
 	lwalk->l = e->loop;
+	lwalk->nocalc = 0;
 	BLI_ghash_insert(walker->visithash, lwalk->l->f, NULL);
 
 	/*rewind*/
@@ -625,6 +642,7 @@
 	BMW_pushstate(walker);
 	lwalk = walker->currentstate;
 	*lwalk = owalk;
+	lwalk->nocalc = 0;
 
 	BLI_ghash_free(walker->visithash, NULL, NULL);
 	walker->visithash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp);
@@ -644,12 +662,15 @@
 {
 	faceloopWalker *lwalk = walker->currentstate;
 	BMFace *f = lwalk->l->f;
-	BMLoop *l = lwalk->l;
+	BMLoop *l = lwalk->l, *origl = lwalk->l;
 
 	BMW_popstate(walker);
 
 	l = l->radial.next->data;
 	
+	if (lwalk->nocalc)
+		return f;
+
 	if (BLI_ghash_haskey(walker->visithash, l->f)) {
 		l = lwalk->l;
 		l = l->head.next->next;
@@ -659,14 +680,86 @@
 		l = l->radial.next->data;
 	}
 
-	if (l->f->len == 4 && !BLI_ghash_haskey(walker->visithash, l->f)) {
+	if (!BLI_ghash_haskey(walker->visithash, l->f)) {
 		BMW_pushstate(walker);
 		lwalk = walker->currentstate;
 		lwalk->l = l;
 
+		if (l->f->len != 4) {
+			lwalk->nocalc = 1;
+			lwalk->l = origl;
+		} else
+			lwalk->nocalc = 0;
+
 		BLI_ghash_insert(walker->visithash, l->f, NULL);
 	}
 
 	return f;
 }
 
+static void edgeringWalker_begin(BMWalker *walker, void *data)
+{
+	edgeringWalker *lwalk, owalk;
+	BMEdge *e = data;
+
+	BMW_pushstate(walker);
+
+	if (!e->loop) return;
+
+	lwalk = walker->currentstate;
+	lwalk->l = e->loop;
+	BLI_ghash_insert(walker->visithash, lwalk->l->e, NULL);
+
+	/*rewind*/
+	while (walker->currentstate) {
+		owalk = *((edgeringWalker*)walker->currentstate);
+		BMW_walk(walker);
+	}
+
+	BMW_pushstate(walker);
+	lwalk = walker->currentstate;
+	*lwalk = owalk;
+
+	if (lwalk->l->f->len != 4)
+		lwalk->l = lwalk->l->radial.next->data;
+
+	BLI_ghash_free(walker->visithash, NULL, NULL);
+	walker->visithash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp);
+	BLI_ghash_insert(walker->visithash, lwalk->l->e, NULL);
+}
+
+static void *edgeringWalker_yield(BMWalker *walker)
+{
+	edgeringWalker *lwalk = walker->currentstate;
+	
+	if (!lwalk) return NULL;
+
+	return lwalk->l->e;
+}
+
+static void *edgeringWalker_step(BMWalker *walker)
+{
+	edgeringWalker *lwalk = walker->currentstate;
+	BMEdge *e = lwalk->l->e;
+	BMLoop *l = lwalk->l, *origl = lwalk->l;
+
+	BMW_popstate(walker);
+
+	l = l->radial.next->data;
+	l = l->head.next->next;
+	
+	if (l->f->len != 4) {
+		l = lwalk->l->head.next->next;
+	}
+
+	if (l->f->len == 4 && !BLI_ghash_haskey(walker->visithash, l->e)) {
+		BMW_pushstate(walker);
+		lwalk = walker->currentstate;
+		lwalk->l = l;
+
+		BLI_ghash_insert(walker->visithash, l->e, NULL);
+	}
+
+	return e;
+}
+

Modified: branches/bmesh/blender/source/blender/bmesh/operators/mesh_conv.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/operators/mesh_conv.c	2009-07-29 00:37:37 UTC (rev 22004)
+++ branches/bmesh/blender/source/blender/bmesh/operators/mesh_conv.c	2009-07-29 00:43:05 UTC (rev 22005)
@@ -374,7 +374,7 @@
 			ls[1] = efa->v2->tmp.p;
 			ls[2] = efa->v3->tmp.p;
 			
-			/*ensue correct winding.  I believe this is
+			/*ensure correct winding.  I believe this is
 			  analogous to bubble sort on three elements.*/
 			if (BMINDEX_GET(ls[0]) > BMINDEX_GET(ls[1])) {
 				SWAP(BMLoop*, ls[0], ls[1]);

Modified: branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c	2009-07-29 00:37:37 UTC (rev 22004)
+++ branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c	2009-07-29 00:43:05 UTC (rev 22005)
@@ -805,6 +805,10 @@
 /* ***************************************************** */
 
 /* ****************  LOOP SELECTS *************** */
+/*faceloop_select, edgeloop_select, and edgering_select, are left
+  here for reference purposes temporarily, but have all been replaced
+  by uses of walker_select.*/
+
 static void walker_select(BMEditMesh *em, int walkercode, void *start, int select)
 {
 	BMesh *bm = em->bm;
@@ -1071,13 +1075,13 @@
 		}
 		else if(em->selectmode & SCE_SELECT_EDGE) {
 			if(ring)
-				edgering_select(em, eed, select);
+				walker_select(em, BMW_EDGERING, eed, select);
 			else
 				walker_select(em, BMW_LOOP, eed, select);
 		}
 		else if(em->selectmode & SCE_SELECT_VERTEX) {
 			if(ring)
-				edgering_select(em, eed, select);
+				walker_select(em, BMW_EDGERING, eed, select);
 			else 
 				walker_select(em, BMW_LOOP, eed, select);
 		}





More information about the Bf-blender-cvs mailing list