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);
                }


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to