Revision: 42111
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42111
Author:   campbellbarton
Date:     2011-11-24 01:33:41 +0000 (Thu, 24 Nov 2011)
Log Message:
-----------
fix [#29177] Select linked in face select mode doesn't stop on seams

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_walkers_impl.c
    branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c

Modified: 
branches/bmesh/blender/source/blender/bmesh/intern/bmesh_walkers_impl.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_walkers_impl.c     
2011-11-24 01:07:36 UTC (rev 42110)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_walkers_impl.c     
2011-11-24 01:33:41 UTC (rev 42111)
@@ -366,6 +366,11 @@
 
        l = BMIter_New(&liter, walker->bm, BM_LOOPS_OF_FACE, iwalk->cur);
        for (; l; l=BMIter_Step(&liter)) {
+               /* could skip loop here too, but dont add unless we need it */
+               if (walker->mask_edge && !BMO_TestFlag(walker->bm, l->e, 
walker->mask_edge)) {
+                       continue;
+               }
+
                f = BMIter_New(&iter, walker->bm, BM_FACES_OF_EDGE, l->e);
                for (; f; f=BMIter_Step(&iter)) {
                        if (walker->mask_face && !BMO_TestFlag(walker->bm, f, 
walker->mask_face)) {
@@ -830,7 +835,7 @@
        islandWalker_yield,
        sizeof(islandWalker),
        BMW_BREADTH_FIRST,
-       BM_FACE, /* valid restrict masks */
+       BM_EDGE | BM_FACE, /* valid restrict masks */
 };
 
 static BMWalker loop_walker_type = {

Modified: branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c   
2011-11-24 01:07:36 UTC (rev 42110)
+++ branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c   
2011-11-24 01:33:41 UTC (rev 42111)
@@ -1727,6 +1727,7 @@
 {
        Object *obedit= CTX_data_edit_object(C);
        ViewContext vc;
+       BMesh *bm;
        BMWalker walker;
        BMEditMesh *em;
        BMVert *eve;
@@ -1741,9 +1742,11 @@
        em_setup_viewcontext(C, &vc);
        em = vc.em;
 
-       if(vc.em->bm->totedge==0)
+       if(em->bm->totedge==0)
                return OPERATOR_CANCELLED;
        
+       bm= em->bm;
+
        vc.mval[0]= event->mval[0];
        vc.mval[1]= event->mval[1];
        
@@ -1761,23 +1764,44 @@
                return OPERATOR_CANCELLED;
        }
        
-       if (efa) {
-               eed = bm_firstfaceloop(efa)->e;
-       } else if (!eed) {
-               if (!eve || !eve->e)
+       if (em->selectmode == SCE_SELECT_FACE) {
+               BMIter iter;
+
+               if (efa == NULL)
                        return OPERATOR_CANCELLED;
-               
-               eed = eve->e;
+
+               BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+                       if (!BM_TestHFlag(e, BM_SEAM)) BMO_SetFlag(bm, e, 
BM_SELECT);
+                       else                           BMO_ClearFlag(bm, e, 
BM_SELECT); /* is this needed ? */
+               }
+
+               /* walk */
+               BMW_Init(&walker, bm, BMW_ISLAND,  0,BM_SELECT,0,0,  
BMW_NIL_LAY);
+               e = BMW_Begin(&walker, efa);
+               for (; efa; efa=BMW_Step(&walker)) {
+                       BM_Select(bm, efa, sel);
+               }
+               BMW_End(&walker);
        }
+       else {
+               if (efa) {
+                       eed = bm_firstfaceloop(efa)->e;
+               } else if (!eed) {
+                       if (!eve || !eve->e)
+                               return OPERATOR_CANCELLED;
 
-       BMW_Init(&walker, em->bm, BMW_SHELL, 0,0,0,0, BMW_NIL_LAY);
-       e = BMW_Begin(&walker, eed->v1);
-       for (; e; e=BMW_Step(&walker)) {
-                       BM_Select(em->bm, e->v1, sel);
-                       BM_Select(em->bm, e->v2, sel);
+                       eed = eve->e;
+               }
+
+               BMW_Init(&walker, bm, BMW_SHELL, 0,0,0,0, BMW_NIL_LAY);
+               e = BMW_Begin(&walker, eed->v1);
+               for (; e; e=BMW_Step(&walker)) {
+                               BM_Select(bm, e->v1, sel);
+                               BM_Select(bm, e->v2, sel);
+               }
+               BMW_End(&walker);
+               EDBM_select_flush(em, SCE_SELECT_VERTEX);
        }
-       BMW_End(&walker);
-       EDBM_select_flush(em, SCE_SELECT_VERTEX);
 
        WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit);
        return OPERATOR_FINISHED;       
@@ -1806,34 +1830,64 @@
 {
        Object *obedit= CTX_data_edit_object(C);
        BMEditMesh *em= ((Mesh*)obedit->data)->edit_btmesh;
-       BLI_array_declare(verts);
-       BMVert **verts = NULL;
+       BMesh *bm= em->bm;
        BMIter iter;
        BMVert *v;
        BMEdge *e;
        BMWalker walker;
-       int i, tot;
 
-       tot = 0;
-       BM_ITER(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
-               if (BM_TestHFlag(v, BM_SELECT) && !BM_TestHFlag(v, BM_HIDDEN)) {
-                       BLI_array_growone(verts);
-                       verts[tot++] = v;
+       if (em->selectmode == SCE_SELECT_FACE) {
+               BMFace *efa;
+
+               BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+                       if (BM_TestHFlag(efa, BM_SELECT) && !BM_TestHFlag(efa, 
BM_HIDDEN)) {
+                               BM_SetHFlag(efa, BM_TMP_TAG);
+                       }
+                       else {
+                               BM_ClearHFlag(efa, BM_TMP_TAG);
+                       }
                }
+
+               BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+                       if (!BM_TestHFlag(e, BM_SEAM)) BMO_SetFlag(bm, e, 
BM_SELECT);
+                       else                           BMO_ClearFlag(bm, e, 
BM_SELECT); /* is this needed ? */
+               }
+
+               BMW_Init(&walker, bm, BMW_ISLAND,  0,BM_SELECT,0,0,  
BMW_NIL_LAY);
+               BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+                       if (BM_TestHFlag(efa, BM_TMP_TAG)) {
+                               e = BMW_Begin(&walker, efa);
+                               for (; efa; efa=BMW_Step(&walker)) {
+                                       BM_Select(bm, efa, TRUE);
+                               }
+                       }
+               }
+               BMW_End(&walker);
        }
+       else  {
+               BM_ITER(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+                       if (BM_TestHFlag(v, BM_SELECT) && !BM_TestHFlag(v, 
BM_HIDDEN)) {
+                               BM_SetHFlag(v, BM_TMP_TAG);
+                       }
+                       else {
+                               BM_ClearHFlag(v, BM_TMP_TAG);
+                       }
+               }
 
-       BMW_Init(&walker, em->bm, BMW_SHELL, 0,0,0,0, BMW_NIL_LAY);
-       for (i=0; i<tot; i++) {
-               e = BMW_Begin(&walker, verts[i]);
-               for (; e; e=BMW_Step(&walker)) {
-                       BM_Select(em->bm, e->v1, 1);
-                       BM_Select(em->bm, e->v2, 1);
+               BMW_Init(&walker, em->bm, BMW_SHELL, 0,0,0,0, BMW_NIL_LAY);
+               BM_ITER(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+                       if (BM_TestHFlag(v, BM_TMP_TAG)) {
+                               e = BMW_Begin(&walker, v);
+                               for (; e; e=BMW_Step(&walker)) {
+                                       BM_Select(em->bm, e->v1, 1);
+                                       BM_Select(em->bm, e->v2, 1);
+                               }
+                       }
                }
+               BMW_End(&walker);
        }
-       BMW_End(&walker);
        EDBM_select_flush(em, SCE_SELECT_VERTEX);
 
-       BLI_array_free(verts);
        WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit);
 
        return OPERATOR_FINISHED;       

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

Reply via email to