diff options
author | Joseph Eagar <joeedh@gmail.com> | 2009-08-06 09:06:55 +0400 |
---|---|---|
committer | Joseph Eagar <joeedh@gmail.com> | 2009-08-06 09:06:55 +0400 |
commit | 88b43b52b1a66fc531b5b9fc64789fc085400fe7 (patch) | |
tree | c1f2ff47ab3acb2ef0db0263b8a99e9440eae4bc /source/blender/editors/mesh | |
parent | c73712675b5b6e08365a8145980c1177992c083f (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.c | 172 | ||||
-rw-r--r-- | source/blender/editors/mesh/bmesh_tools.c | 11 | ||||
-rw-r--r-- | source/blender/editors/mesh/bmeshutils.c | 31 |
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) { |