2.5 mesh cleanup: merge tools all work again

This commit is contained in:
Joseph Eagar 2009-09-14 05:00:03 +00:00
parent 9f5e42ff76
commit a11ef8030a
3 changed files with 59 additions and 12 deletions

@ -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;
}

@ -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;

@ -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);