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); _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs