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:
authorCampbell Barton <ideasman42@gmail.com>2009-10-20 20:31:03 +0400
committerCampbell Barton <ideasman42@gmail.com>2009-10-20 20:31:03 +0400
commit9a00cc55c170cfca5718d89fc8a2036fe05155b1 (patch)
treeeb2b99a67976f8b9255972cce02be850cae9f6cb /source/blender/editors/mesh/editmesh_mods.c
parent5d0f5d210a5f7e6e0d10153b573468f39d8eae69 (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.c77
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,