Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoseph Eagar <joeedh@gmail.com>2009-08-06 09:06:55 +0400
committerJoseph Eagar <joeedh@gmail.com>2009-08-06 09:06:55 +0400
commit88b43b52b1a66fc531b5b9fc64789fc085400fe7 (patch)
treec1f2ff47ab3acb2ef0db0263b8a99e9440eae4bc /source/blender/editors/mesh
parentc73712675b5b6e08365a8145980c1177992c083f (diff)
select more/less properly uses bmops now, and also made a little start on documenting the bmops.
Diffstat (limited to 'source/blender/editors/mesh')
-rw-r--r--source/blender/editors/mesh/bmesh_select.c172
-rw-r--r--source/blender/editors/mesh/bmesh_tools.c11
-rw-r--r--source/blender/editors/mesh/bmeshutils.c31
3 files changed, 55 insertions, 159 deletions
diff --git a/source/blender/editors/mesh/bmesh_select.c b/source/blender/editors/mesh/bmesh_select.c
index 616f22f8145..ec1e699d03e 100644
--- a/source/blender/editors/mesh/bmesh_select.c
+++ b/source/blender/editors/mesh/bmesh_select.c
@@ -1622,84 +1622,25 @@ void MESH_OT_select_linked(wmOperatorType *ot)
/* ******************** **************** */
-void EDBM_select_more(BMEditMesh *em)
+static int select_more(bContext *C, wmOperator *op)
{
- BMIter iter;
-
- /*for now, bmops aren't supposed to mess with header flags
- (might need to revisit that design decision later), so
- this function is slightly unconventional to avoid the use
- of the BMO_[Set/Clear]Flag functions. it accumulates lists
- of elements to make selection changes to in pointer arrays.*/
-
- if (em->selectmode <= SCE_SELECT_EDGE) {
- BMVert *v;
- BMEdge *e;
- BMIter eiter;
- BMVert **verts = NULL;
- V_DECLARE(verts);
- V_DECLARE(edges);
- BMEdge **edges = NULL;
- int vtot=0, etot=0, i;
-
- BM_ITER_NOTSELECT(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL)
- BM_ITER(e, &eiter, em->bm, BM_EDGES_OF_VERT, v) {
- if (BM_TestHFlag(BM_OtherEdgeVert(e, v), BM_SELECT))
- break;
- }
-
- if (e) {
- V_GROW(verts);
- verts[vtot++] = v;
- }
-
- }
-
- for (i=0; i<vtot; i++) {
- BM_Select(em->bm, verts[i], 1);
- }
-
- /*make sure we flush from vertices on up, not from edges*/
- EDBM_select_flush(em, SCE_SELECT_VERTEX);
-
- V_FREE(verts);
- } else {
- BMIter liter, fiter;
- BMFace *f, *f2, **faces = NULL;
- V_DECLARE(faces);
- BMLoop *l;
- int i, tot=0;
-
- BM_ITER_SELECT(f, &iter, em->bm, BM_FACES_OF_MESH, NULL)
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, f) {
- BM_ITER(f2, &fiter, em->bm, BM_FACES_OF_EDGE, l->e) {
- if (!BM_TestHFlag(f2, BM_SELECT)) {
- V_GROW(faces);
- faces[tot++] = f2;
- }
- }
- }
- }
+ Object *obedit= CTX_data_edit_object(C);
+ BMEditMesh *em= (((Mesh *)obedit->data))->edit_btmesh;
+ BMOperator bmop;
+ int usefaces = em->selectmode > SCE_SELECT_EDGE;
- for (i=0; i<tot; i++) {
- BM_Select(em->bm, faces[i], 1);
- }
+ EDBM_InitOpf(em, &bmop, op, "regionextend geom=%hvef constrict=%d usefaces=%d",
+ BM_SELECT, 0, usefaces);
- V_FREE(faces);
- }
+ BMO_Exec_Op(em->bm, &bmop);
+ BMO_HeaderFlag_Buffer(em->bm, &bmop, "geomout", BM_SELECT);
EDBM_selectmode_flush(em);
-}
-
-static int select_more(bContext *C, wmOperator *op)
-{
- Object *obedit= CTX_data_edit_object(C);
- BMEditMesh *em= (((Mesh *)obedit->data))->edit_btmesh;
- EDBM_select_more(em);
+ if (!EDBM_FinishOp(em, &bmop, op, 1))
+ return OPERATOR_CANCELLED;
WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
-
return OPERATOR_FINISHED;
}
@@ -1717,92 +1658,23 @@ void MESH_OT_select_more(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-void EDBM_select_less(BMEditMesh *em)
+static int select_less(bContext *C, wmOperator *op)
{
- BMIter iter;
-
- /*for now, bmops aren't supposed to mess with header flags
- (might need to revisit that design decision later), so
- this function is slightly unconventional to avoid the use
- of the BMO_[Set/Clear]Flag functions. it accumulates lists
- of elements to make selection changes to in pointer arrays.*/
-
- if (em->selectmode <= SCE_SELECT_EDGE) {
- BMVert *v;
- BMEdge *e;
- BMIter eiter;
- BMVert **verts = NULL;
- V_DECLARE(verts);
- V_DECLARE(edges);
- BMEdge **edges = NULL;
- int vtot=0, etot=0, i;
-
- BM_ITER_SELECT(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL)
- BM_ITER(e, &eiter, em->bm, BM_EDGES_OF_VERT, v) {
- if (!BM_TestHFlag(e, BM_SELECT))
- break;
- }
-
- if (e) {
- V_GROW(verts);
- verts[vtot++] = v;
-
- BM_ITER(e, &eiter, em->bm, BM_EDGES_OF_VERT, v) {
- V_GROW(edges);
- edges[etot++] = e;
- }
- }
- }
-
- for (i=0; i<vtot; i++) {
- BM_Select(em->bm, verts[i], 0);
- }
-
- for (i=0; i<etot; i++) {
- BM_Select(em->bm, edges[i], 0);
- }
-
- V_FREE(verts);
- V_FREE(edges);
- } else {
- BMIter liter, fiter;
- BMFace *f, *f2, **faces = NULL;
- V_DECLARE(faces);
- BMLoop *l;
- int i, tot=0;
-
- BM_ITER_SELECT(f, &iter, em->bm, BM_FACES_OF_MESH, NULL)
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, f) {
- BM_ITER(f2, &fiter, em->bm, BM_FACES_OF_EDGE, l->e) {
- if (!BM_TestHFlag(f2, BM_SELECT))
- break;
- }
- if (f2)
- break;
- }
-
- if (l) {
- V_GROW(faces);
- faces[tot++] = f;
- }
- }
+ Object *obedit= CTX_data_edit_object(C);
+ BMEditMesh *em= (((Mesh *)obedit->data))->edit_btmesh;
+ BMOperator bmop;
+ int usefaces = em->selectmode > SCE_SELECT_EDGE;
- for (i=0; i<tot; i++) {
- BM_Select(em->bm, faces[i], 0);
- }
+ EDBM_InitOpf(em, &bmop, op, "regionextend geom=%hvef constrict=%d usefaces=%d",
+ BM_SELECT, 1, usefaces);
- V_FREE(faces);
- }
+ BMO_Exec_Op(em->bm, &bmop);
+ BMO_UnHeaderFlag_Buffer(em->bm, &bmop, "geomout", BM_SELECT);
EDBM_selectmode_flush(em);
-}
-static int select_less(bContext *C, wmOperator *op)
-{
- Object *obedit= CTX_data_edit_object(C);
- BMEditMesh *em= (((Mesh *)obedit->data))->edit_btmesh;
-
- EDBM_select_less(em);
+ if (!EDBM_FinishOp(em, &bmop, op, 1))
+ return OPERATOR_CANCELLED;
WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
return OPERATOR_FINISHED;
diff --git a/source/blender/editors/mesh/bmesh_tools.c b/source/blender/editors/mesh/bmesh_tools.c
index 80dd5cdd11b..21c1c00026b 100644
--- a/source/blender/editors/mesh/bmesh_tools.c
+++ b/source/blender/editors/mesh/bmesh_tools.c
@@ -502,18 +502,11 @@ short EDBM_Extrude_verts_indiv(BMEditMesh *em, wmOperator *op, short flag, float
EDBM_InitOpf(em, &bmop, op, "extrude_vert_indiv verts=%hv", flag);
/*deselect original verts*/
- v = BMO_IterNew(&siter, em->bm, &bmop, "verts", BM_VERT);
- for (; v; v=BMO_IterStep(&siter)) {
- BM_Select(em->bm, v, 0);
- }
+ BMO_UnHeaderFlag_Buffer(em->bm, &bmop, "verts", BM_SELECT);
BMO_Exec_Op(em->bm, &bmop);
- v = BMO_IterNew(&siter, em->bm, &bmop, "vertout", BM_VERT);
- for (; v; v=BMO_IterStep(&siter)) {
- BM_Select(em->bm, v, 1);
- }
-
+ BMO_HeaderFlag_Buffer(em->bm, &bmop, "vertout", BM_SELECT);
if (!EDBM_FinishOp(em, &bmop, op, 1)) return 0;
return 'g'; // g is grab
diff --git a/source/blender/editors/mesh/bmeshutils.c b/source/blender/editors/mesh/bmeshutils.c
index 108aff7bf40..51644457f87 100644
--- a/source/blender/editors/mesh/bmeshutils.c
+++ b/source/blender/editors/mesh/bmeshutils.c
@@ -399,6 +399,37 @@ void EDBM_selectmode_flush(BMEditMesh *em)
BM_SelectMode_Flush(em->bm);
}
+/*EDBM_select_[more/less] are api functions, I think the uv editor
+ uses them? though the select more/less ops themselves do not.*/
+void EDBM_select_more(BMEditMesh *em)
+{
+ BMOperator bmop;
+ int usefaces = em->selectmode > SCE_SELECT_EDGE;
+
+ BMO_InitOpf(em->bm, &bmop,
+ "regionextend geom=%hvef constrict=%d usefaces=%d",
+ BM_SELECT, 0, usefaces);
+ BMO_Exec_Op(em->bm, &bmop);
+ BMO_HeaderFlag_Buffer(em->bm, &bmop, "geomout", BM_SELECT);
+ BMO_Finish_Op(em->bm, &bmop);
+
+ EDBM_selectmode_flush(em);
+}
+
+void EDBM_select_less(BMEditMesh *em)
+{
+ BMOperator bmop;
+ int usefaces = em->selectmode > SCE_SELECT_EDGE;
+
+ BMO_InitOpf(em->bm, &bmop,
+ "regionextend geom=%hvef constrict=%d usefaces=%d",
+ BM_SELECT, 0, usefaces);
+ BMO_Exec_Op(em->bm, &bmop);
+ BMO_HeaderFlag_Buffer(em->bm, &bmop, "geomout", BM_SELECT);
+ BMO_Finish_Op(em->bm, &bmop);
+
+ EDBM_selectmode_flush(em);
+}
int EDBM_get_actSelection(BMEditMesh *em, BMEditSelection *ese)
{