diff options
author | Joseph Eagar <joeedh@gmail.com> | 2009-09-14 09:00:03 +0400 |
---|---|---|
committer | Joseph Eagar <joeedh@gmail.com> | 2009-09-14 09:00:03 +0400 |
commit | a11ef8030aecfe80e4718b6000ea32d2bbc062a9 (patch) | |
tree | c2331d7373adaff7bc4416198fc1d6b329d081d5 | |
parent | 9f5e42ff7622b5b2dd0ef711769ecc541126efb5 (diff) |
2.5 mesh cleanup: merge tools all work again
-rw-r--r-- | source/blender/editors/mesh/editmesh_tools.c | 60 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_modifier_types.h | 5 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm.c | 6 |
3 files changed, 59 insertions, 12 deletions
diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c index 5a4397256de..9c8e8e11e86 100644 --- a/source/blender/editors/mesh/editmesh_tools.c +++ b/source/blender/editors/mesh/editmesh_tools.c @@ -98,8 +98,6 @@ static void waitcursor(int val) {} static int pupmenu() {return 0;} static int qtest() {return 0;} #define add_numbut(a, b, c, d, e, f, g) {} -static int snap_sel_to_curs() {return 0;} -static int snap_to_center() {return 0;} /* XXX */ @@ -5735,13 +5733,59 @@ int merge_firstlast(EditMesh *em, int first, int uvmerge) return removedoublesflag(em, 1, 0, MERGELIMIT); } -int merge_target(EditMesh *em, int target, int uvmerge) +void em_snap_to_center(EditMesh *em) +{ + EditVert *eve; + float cent[3] = {0.0f, 0.0f, 0.0f}; + int i=0; + + for (eve=em->verts.first; eve; eve=eve->next) { + if (eve->f & SELECT) { + VecAddf(cent, cent, eve->co); + i++; + } + } + + if (!i) + return; + + VecMulf(cent, 1.0f / (float)i); + + for (eve=em->verts.first; eve; eve=eve->next) { + if (eve->f & SELECT) { + VECCOPY(eve->co, cent); + } + } +} + +void em_snap_to_cursor(EditMesh *em, bContext *C) +{ + Scene *scene = CTX_data_scene(C); + Object *ob= CTX_data_edit_object(C); + View3D *v3d = CTX_wm_view3d(C); + EditVert *eve; + float co[3], *vco, invmat[4][4]; + + Mat4Invert(invmat, ob->obmat); + + vco = give_cursor(scene, v3d); + VECCOPY(co, vco); + Mat4MulVecfl(invmat, co); + + for (eve=em->verts.first; eve; eve=eve->next) { + if (eve->f & SELECT) { + VECCOPY(eve->co, co); + } + } +} + +int merge_target(bContext *C, EditMesh *em, int target, int uvmerge) { EditVert *eve; // XXX not working - if(target) snap_sel_to_curs(); - else snap_to_center(); + if(target) em_snap_to_cursor(em, C); + else em_snap_to_center(em); if(uvmerge && CustomData_has_layer(&em->fdata, CD_MTFACE)){ for(eve=em->verts.first; eve; eve=eve->next) eve->f1 = 0; @@ -5763,10 +5807,10 @@ static int merge_exec(bContext *C, wmOperator *op) switch(RNA_enum_get(op->ptr, "type")) { case 3: - count = merge_target(em, 0, uvs); + count = merge_target(C, em, 0, uvs); break; case 4: - count = merge_target(em, 1, uvs); + count = merge_target(C, em, 1, uvs); break; case 1: count = merge_firstlast(em, 0, uvs); @@ -5774,7 +5818,7 @@ static int merge_exec(bContext *C, wmOperator *op) case 6: count = merge_firstlast(em, 1, uvs); break; - case 2: + case 5: count = collapseEdges(em); break; } diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h index be7452c4ae1..d58488ce82d 100644 --- a/source/blender/makesdna/DNA_modifier_types.h +++ b/source/blender/makesdna/DNA_modifier_types.h @@ -469,8 +469,9 @@ typedef struct BooleanModifierData { int operation, pad; } BooleanModifierData; -#define MOD_MDEF_INVERT_VGROUP (1<<0) -#define MOD_MDEF_DYNAMIC_BIND (1<<1) +#define MOD_MDEF_INVERT_VGROUP (1<<0) +#define MOD_MDEF_DYNAMIC_BIND (1<<1) +#define MOD_MDEF_USE_FINAL (1<<2) typedef struct MDefInfluence { int vertex; diff --git a/source/blender/windowmanager/intern/wm.c b/source/blender/windowmanager/intern/wm.c index 38cf39c2081..651394d51af 100644 --- a/source/blender/windowmanager/intern/wm.c +++ b/source/blender/windowmanager/intern/wm.c @@ -75,9 +75,11 @@ void WM_operator_free(wmOperator *op) } if(op->macro.first) { - wmOperator *opm; - for(opm= op->macro.first; opm; opm= opm->next) + wmOperator *opm, *opmnext; + for(opm= op->macro.first; opm; opm= opmnext) { + opmnext = opm->next; WM_operator_free(opm); + } } MEM_freeN(op); |