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

Reply via email to