diff options
author | Campbell Barton <ideasman42@gmail.com> | 2009-10-20 20:31:03 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2009-10-20 20:31:03 +0400 |
commit | 9a00cc55c170cfca5718d89fc8a2036fe05155b1 (patch) | |
tree | eb2b99a67976f8b9255972cce02be850cae9f6cb /source/blender/editors/mesh/editmesh_mods.c | |
parent | 5d0f5d210a5f7e6e0d10153b573468f39d8eae69 (diff) |
- editmesh select mirror (in editmode select menu)
- weight blending (Vertex specials menu), currently blends from surrounding unselected verts (nice for blending edge loops), but will eventually support face mask mode.
Diffstat (limited to 'source/blender/editors/mesh/editmesh_mods.c')
-rw-r--r-- | source/blender/editors/mesh/editmesh_mods.c | 77 |
1 files changed, 65 insertions, 12 deletions
diff --git a/source/blender/editors/mesh/editmesh_mods.c b/source/blender/editors/mesh/editmesh_mods.c index 968bb30b0cd..7ca044b8087 100644 --- a/source/blender/editors/mesh/editmesh_mods.c +++ b/source/blender/editors/mesh/editmesh_mods.c @@ -100,19 +100,39 @@ static int pupmenu() {return 0;} /* ****************************** MIRROR **************** */ -void EM_select_mirrored(Object *obedit, EditMesh *em) +void EM_cache_x_mirror_vert(struct Object *ob, struct EditMesh *em) { - if(em->selectmode & SCE_SELECT_VERTEX) { - EditVert *eve, *v1; - - for(eve= em->verts.first; eve; eve= eve->next) { - if(eve->f & SELECT) { - v1= editmesh_get_x_mirror_vert(obedit, em, eve->co); - if(v1) { - eve->f &= ~SELECT; - v1->f |= SELECT; - } - } + EditVert *eve, *eve_mirror; + + for(eve= em->verts.first; eve; eve= eve->next) { + eve->tmp.v= NULL; + } + + for(eve= em->verts.first; eve; eve= eve->next) { + if(eve->tmp.v==NULL) { + eve_mirror = editmesh_get_x_mirror_vert(ob, em, eve->co); + eve->tmp.v= eve_mirror; + eve_mirror->tmp.v = eve; + } + } +} + +void EM_select_mirrored(Object *obedit, EditMesh *em, int extend) +{ + + EditVert *eve; + + EM_cache_x_mirror_vert(obedit, em); + + for(eve= em->verts.first; eve; eve= eve->next) { + if(eve->f & SELECT && eve->tmp.v) { + eve->tmp.v->f |= SELECT; + + if(extend==FALSE) + eve->f &= ~SELECT; + + /* remove the interference */ + eve->tmp.v->tmp.v= eve->tmp.v= NULL; } } } @@ -2825,6 +2845,39 @@ void MESH_OT_select_by_number_vertices(wmOperatorType *ot) RNA_def_enum(ot->srna, "type", type_items, 3, "Type", "Type of elements to select."); } + +int select_mirror_exec(bContext *C, wmOperator *op) +{ + Object *obedit= CTX_data_edit_object(C); + EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)obedit->data)); + + int extend= RNA_boolean_get(op->ptr, "extend"); + + EM_select_mirrored(obedit, em, extend); + + WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data); + + return OPERATOR_FINISHED; +} + +void MESH_OT_select_mirror(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Select Mirror"; + ot->description= "Select mesh items at mirrored locations."; + ot->idname= "MESH_OT_select_mirror"; + + /* api callbacks */ + ot->exec= select_mirror_exec; + ot->poll= ED_operator_editmesh; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* props */ + RNA_def_boolean(ot->srna, "extend", 0, "Extend", "Extend the existing selection"); +} + static int select_sharp_edges_exec(bContext *C, wmOperator *op) { /* Find edges that have exactly two neighboring faces, |