[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