last commit was accidental. anyway, face loop select mostly works now. there's still some issues. shift-unselecting loops isn't working right now, need to fix it.

This commit is contained in:
Joseph Eagar
2009-06-16 21:33:12 +00:00
parent 508c961b24
commit c3fd34d9a7
3 changed files with 30 additions and 13 deletions

View File

@@ -56,7 +56,7 @@ typedef struct loopWalker {
typedef struct faceloopWalker {
struct faceloopWalker * prev;
BMFace *f;
BMLoop *l;
} faceloopWalker;
/* NOTE: this comment is out of date, update it - joeedh
@@ -553,7 +553,6 @@ static void *loopWalker_yield(BMWalker *walker)
static void *loopWalker_step(BMWalker *walker)
{
loopWalker *lwalk = walker->currentstate, owalk;
BMIter iter;
BMEdge *e = lwalk->cur, *nexte = NULL;
BMLoop *l, *l2;
BMVert *v;
@@ -606,7 +605,7 @@ static void *loopWalker_step(BMWalker *walker)
static void faceloopWalker_begin(BMWalker *walker, void *data)
{
faceloopWalker *lwalk;
faceloopWalker *lwalk, owalk;
BMEdge *e = data;
BMW_pushstate(walker);
@@ -615,7 +614,20 @@ static void faceloopWalker_begin(BMWalker *walker, void *data)
lwalk = walker->currentstate;
lwalk->l = e->loop;
BLI_ghash_insert(walker->visithash, lwalk->l->f, NULL);
/*rewind*/
while (walker->currentstate) {
owalk = *((faceloopWalker*)walker->currentstate);
BMW_walk(walker);
}
BMW_pushstate(walker);
lwalk = walker->currentstate;
*lwalk = owalk;
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->f, NULL);
}
@@ -634,15 +646,20 @@ static void *faceloopWalker_step(BMWalker *walker)
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)) {
l = l->head.next->next;
if (l == l->radial.next->data) {
l = l->head.prev->prev;
}
l = l->radial.next->data;
if (l->f->len == 4 && !BLI_ghash_haskey(walker->visithash, l->f)) {
BMW_pushstate(walker);
lwalk = walker->currentstate;
lwalk->l = l;
BLI_ghash_insert(walker->visithash, l->f, NULL);
}
return f;

View File

@@ -805,13 +805,13 @@ static int similar_face_select__internal(Scene *scene, BMEditMesh *em, int mode)
/* ***************************************************** */
/* **************** LOOP SELECTS *************** */
static void walker_select(BMEditMesh *em, int walker, void *start, int select)
static void walker_select(BMEditMesh *em, int walkercode, void *start, int select)
{
BMesh *bm = em->bm;
BMHeader *h;
BMWalker walker;
BMW_Init(&walker, bm, walker, 0);
BMW_Init(&walker, bm, walkercode, 0);
h = BMW_Begin(&walker, start);
for (; h; h=BMW_Step(&walker)) {
BM_Select(bm, h, select);
@@ -1067,19 +1067,19 @@ static void mouse_mesh_loop(bContext *C, short mval[2], short extend, short ring
else if(extend) select=0;
if(em->selectmode & SCE_SELECT_FACE) {
walker_select(em, BMW_FACELOOP, starteed, select);
walker_select(em, BMW_FACELOOP, eed, select);
}
else if(em->selectmode & SCE_SELECT_EDGE) {
if(ring)
edgering_select(em, eed, select);
else
walker_select(em, BMW_LOOP, starteed, select);
walker_select(em, BMW_LOOP, eed, select);
}
else if(em->selectmode & SCE_SELECT_VERTEX) {
if(ring)
edgering_select(em, eed, select);
else
walker_select(em, BMW_LOOP, starteed, select);
walker_select(em, BMW_LOOP, eed, select);
}
EDBM_selectmode_flush(em);

View File

@@ -1307,6 +1307,7 @@ static int delete_mesh(Object *obedit, wmOperator *op, int event, Scene *scene)
/* Note, these values must match delete_mesh() event values */
static EnumPropertyItem prop_mesh_delete_types[] = {
{7, "DISSOLVE", "Dissolve Verts", ""},
{10,"VERT", "Vertices", ""},
{1, "EDGE", "Edges", ""},
{2, "FACE", "Faces", ""},
@@ -1314,7 +1315,6 @@ static EnumPropertyItem prop_mesh_delete_types[] = {
{4, "EDGE_FACE","Edges & Faces", ""},
{5, "ONLY_FACE","Only Faces", ""},
{6, "EDGE_LOOP","Edge Loop", ""},
{7, "DISSOLVE","Dissolve Verts", ""},
{0, NULL, NULL, NULL}
};