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:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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}
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user