[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [42111] branches/bmesh/blender/source/ blender: fix [#29177] Select linked in face select mode doesn' t stop on seams
Campbell Barton
ideasman42 at gmail.com
Thu Nov 24 02:33:45 CET 2011
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;
More information about the Bf-blender-cvs
mailing list