[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [40704] branches/bmesh/blender/source/ blender: Fixes for a few bugs in selection and the interaction between BM_SELECT and BM_HIDDEN :
Andrew Wiggin
ender79bl at gmail.com
Fri Sep 30 06:27:14 CEST 2011
Revision: 40704
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=40704
Author: ender79
Date: 2011-09-30 04:27:12 +0000 (Fri, 30 Sep 2011)
Log Message:
-----------
Fixes for a few bugs in selection and the interaction between BM_SELECT and BM_HIDDEN:
- Select all was selecting hidden elements
- Select flush was also selecting hidden elements (so selecting two *visible* vertices of a *hidden* edge selected that hidden edge)
- Several places were using BM_SetHFlag(elem, BM_SELECT) directly, when they should be using BM_Select(bm, elem)
- In certain scenarios, "reveal all" could leave you with selections which aren't valid in that selection mode (e.g. lonely edges selected in face select mode)
Modified Paths:
--------------
branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c
branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c
branches/bmesh/blender/source/blender/bmesh/operators/subdivideop.c
branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c
branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c
Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c 2011-09-29 23:51:41 UTC (rev 40703)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c 2011-09-30 04:27:12 UTC (rev 40704)
@@ -69,8 +69,12 @@
if(bm->selectmode & SCE_SELECT_VERTEX) {
for(e = BMIter_New(&edges, bm, BM_EDGES_OF_MESH, bm ); e; e= BMIter_Step(&edges)) {
- if(BM_TestHFlag(e->v1, BM_SELECT) && BM_TestHFlag(e->v2, BM_SELECT)) BM_SetHFlag(e, BM_SELECT);
- else BM_ClearHFlag(e, BM_SELECT);
+ if(BM_TestHFlag(e->v1, BM_SELECT) && BM_TestHFlag(e->v2, BM_SELECT) && !BM_TestHFlag(e, BM_HIDDEN)) {
+ BM_SetHFlag(e, BM_SELECT);
+ }
+ else {
+ BM_ClearHFlag(e, BM_SELECT);
+ }
}
for(f = BMIter_New(&faces, bm, BM_FACES_OF_MESH, bm ); f; f= BMIter_Step(&faces)) {
totsel = 0;
@@ -81,10 +85,12 @@
l = l->next;
} while(l != bm_firstfaceloop(f));
- if(totsel == f->len)
+ if(totsel == f->len && !BM_TestHFlag(f, BM_HIDDEN)) {
BM_SetHFlag(f, BM_SELECT);
- else
+ }
+ else {
BM_ClearHFlag(f, BM_SELECT);
+ }
}
}
else if(bm->selectmode & SCE_SELECT_EDGE) {
@@ -97,10 +103,12 @@
l = l->next;
}while(l!=bm_firstfaceloop(f));
- if(totsel == f->len)
+ if(totsel == f->len && !BM_TestHFlag(f, BM_HIDDEN)) {
BM_SetHFlag(f, BM_SELECT);
- else
+ }
+ else {
BM_ClearHFlag(f, BM_SELECT);
+ }
}
}
@@ -123,12 +131,20 @@
/* BMIter iter; */
/* BMEdge *e; */
+ if (BM_TestHFlag(v, BM_HIDDEN)) {
+ return;
+ }
+
if(select) {
- if (!BM_TestHFlag(v, BM_SELECT)) bm->totvertsel += 1;
- BM_SetHFlag(v, BM_SELECT);
+ if (!BM_TestHFlag(v, BM_SELECT)) {
+ bm->totvertsel += 1;
+ BM_SetHFlag(v, BM_SELECT);
+ }
} else {
- if (BM_TestHFlag(v, BM_SELECT)) bm->totvertsel -= 1;
- BM_ClearHFlag(v, BM_SELECT);
+ if (BM_TestHFlag(v, BM_SELECT)) {
+ bm->totvertsel -= 1;
+ BM_ClearHFlag(v, BM_SELECT);
+ }
}
}
@@ -142,6 +158,9 @@
void BM_Select_Edge(BMesh *bm, BMEdge *e, int select)
{
+ if (BM_TestHFlag(e, BM_HIDDEN)) {
+ return;
+ }
if(select){
if (!BM_TestHFlag(e, BM_SELECT)) bm->totedgesel += 1;
@@ -201,6 +220,10 @@
{
BMLoop *l;
+ if (BM_TestHFlag(f, BM_HIDDEN)) {
+ return;
+ }
+
if(select){
if (!BM_TestHFlag(f, BM_SELECT)) bm->totfacesel += 1;
@@ -607,25 +630,25 @@
static void vert_flush_hide(BMesh *bm, BMVert *v) {
BMIter iter;
BMEdge *e;
+ int hide = 1;
BM_ITER(e, &iter, bm, BM_EDGES_OF_VERT, v) {
- if (!BM_TestHFlag(e, BM_HIDDEN))
- return;
+ hide = hide && BM_TestHFlag(e, BM_HIDDEN);
}
- BM_SetHFlag(v, BM_HIDDEN);
+ SETHIDE(v);
}
static void edge_flush_hide(BMesh *bm, BMEdge *e) {
BMIter iter;
BMFace *f;
+ int hide = 1;
BM_ITER(f, &iter, bm, BM_FACES_OF_EDGE, e) {
- if (!BM_TestHFlag(f, BM_HIDDEN))
- return;
+ hide = hide && BM_TestHFlag(f, BM_HIDDEN);
}
- BM_SetHFlag(e, BM_HIDDEN);
+ SETHIDE(e);
}
void BM_Hide_Vert(BMesh *bm, BMVert *v, int hide)
Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c 2011-09-29 23:51:41 UTC (rev 40703)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c 2011-09-30 04:27:12 UTC (rev 40704)
@@ -678,8 +678,9 @@
if (!(type & data[i]->type))
continue;
- if (flag & BM_SELECT)
+ if (flag & BM_SELECT) {
BM_Select(bm, data[i], 1);
+ }
BM_SetHFlag(data[i], flag);
}
}
Modified: branches/bmesh/blender/source/blender/bmesh/operators/subdivideop.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/operators/subdivideop.c 2011-09-29 23:51:41 UTC (rev 40703)
+++ branches/bmesh/blender/source/blender/bmesh/operators/subdivideop.c 2011-09-30 04:27:12 UTC (rev 40704)
@@ -1141,11 +1141,11 @@
BM_ITER(e, &eiter, bm, BM_EDGES_OF_VERT, ele) {
if (!BM_TestHFlag(e, BM_SELECT) && BM_TestHFlag(e->v1, BM_SELECT)
&& BM_TestHFlag(e->v2, BM_SELECT)) {
- BM_SetHFlag(e, BM_SELECT);
+ BM_Select(bm, e, 1);
bm->totedgesel += 1;
} else if (BM_TestHFlag(e, BM_SELECT) && (!BM_TestHFlag(e->v1, BM_SELECT)
|| !BM_TestHFlag(e->v2, BM_SELECT))) {
- BM_ClearHFlag(e, BM_SELECT);
+ BM_Select(bm, e, 0);
bm->totedgesel -= 1;
}
}
Modified: branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c 2011-09-29 23:51:41 UTC (rev 40703)
+++ branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c 2011-09-30 04:27:12 UTC (rev 40704)
@@ -521,18 +521,20 @@
eed = BMIter_New(&iter, em->bm, BM_EDGES_OF_MESH, NULL);
for ( ; eed; eed=BMIter_Step(&iter)) {
if (BM_TestHFlag(eed, flag)) {
- if (flag != BM_SELECT) {
- BM_SetHFlag(eed->v1, flag);
- BM_SetHFlag(eed->v2, flag);
- } else {
+ if (flag & BM_SELECT) {
BM_Select(em->bm, eed->v1, 1);
BM_Select(em->bm, eed->v2, 1);
}
+
+ BM_SetHFlag(eed->v1, flag & ~BM_SELECT);
+ BM_SetHFlag(eed->v2, flag & ~BM_SELECT);
} else {
if (BM_TestHFlag(eed->v1, flag) && BM_TestHFlag(eed->v2, flag)) {
- if (flag != BM_SELECT)
- BM_SetHFlag(eed, flag);
- else BM_Select(em->bm, eed, 1);
+ if (flag & BM_SELECT) {
+ BM_Select(em->bm, eed, 1);
+ }
+
+ BM_SetHFlag(eed, flag & ~BM_SELECT);
}
}
}
@@ -1659,20 +1661,31 @@
BMIter iter;
BMHeader *ele;
int i, types[3] = {BM_VERTS_OF_MESH, BM_EDGES_OF_MESH, BM_FACES_OF_MESH};
- int sels[3] = {1, !(em->selectmode & SCE_SELECT_VERTEX), !(em->selectmode & (SCE_SELECT_VERTEX | SCE_SELECT_EDGE))};
+ int sels[3] = {
+ (em->selectmode & SCE_SELECT_VERTEX),
+ (em->selectmode & SCE_SELECT_EDGE),
+ (em->selectmode & SCE_SELECT_FACE),
+ };
- /*Reveal all hidden elements. Handle the reveal in order of faces,
- edges, and finally vertices. This is important because revealing
- edges may reveal faces, and revealing verts may reveal edges and
- faces. Revealing edges or faces in an earlier pass would keep them
- from getting selected in the later passes.*/
- for (i=2; i>=0; i--) {
+ /* Use index field to remember what was hidden before all is revealed. */
+ for (i=0; i<3; i++) {
BM_ITER(ele, &iter, em->bm, types[i], NULL) {
- if (BM_TestHFlag(ele, BM_HIDDEN)) {
- BM_Hide(em->bm, ele, 0);
+ BM_SetIndex(ele, BM_TestHFlag(ele, BM_HIDDEN) ? 1 : 0);
+ }
+ }
- if (sels[i])
- BM_Select(em->bm, ele, 1);
+ /* Reveal everything */
+ EDBM_clear_flag_all(em, BM_HIDDEN);
+
+ /* Select relevant just-revealed elements */
+ for (i=0; i<3; i++) {
+ if (!sels[i]) {
+ continue;
+ }
+
+ BM_ITER(ele, &iter, em->bm, types[i], NULL) {
+ if (BM_GetIndex(ele)) {
+ BM_Select(em->bm, ele, 1);
}
}
}
@@ -2755,17 +2768,17 @@
e = BM_OtherFaceLoop(e2, l->f, v)->e;
BM_SetIndex(e, 1);
- BM_SetHFlag(e, BM_SELECT);
+ BM_Select(em->bm, e, 1);
} else if (BM_Edge_FaceCount(e2) == 2) {
l = e2->l;
e = BM_OtherFaceLoop(e2, l->f, v)->e;
BM_SetIndex(e, 1);
- BM_SetHFlag(e, BM_SELECT);
+ BM_Select(em->bm, e, 1);
l = e2->l->radial_next;
e = BM_OtherFaceLoop(e2, l->f, v)->e;
BM_SetIndex(e, 1);
- BM_SetHFlag(e, BM_SELECT);
+ BM_Select(em->bm, e, 1);
}
dist = FLT_MAX;
Modified: branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c 2011-09-29 23:51:41 UTC (rev 40703)
+++ branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c 2011-09-30 04:27:12 UTC (rev 40704)
@@ -502,8 +502,11 @@
ele = BMIter_New(&iter, em->bm, type, NULL);
for ( ; ele; ele=BMIter_Step(&iter)) {
- if (flag & BM_SELECT) BM_Select(em->bm, ele, 1);
- BM_SetHFlag(ele, flag);
+ if (flag & BM_SELECT) {
+ BM_Select(em->bm, ele, 1);
+ }
+
+ BM_SetHFlag(ele, flag & ~BM_SELECT);
}
}
}
More information about the Bf-blender-cvs
mailing list