From 0e9dd3060e04459d4ecb5ccbce138de7532a3425 Mon Sep 17 00:00:00 2001 From: Martin Poirier Date: Wed, 12 Nov 2003 23:34:24 +0000 Subject: [PATCH] Fixed a majority of the mirror function bug. AFAIK, the last bug remaining is related to flipping normals. Also added a couple of undo_push_mesh where they were lacking (mainly Merge, Smooth, Mirror) --- source/blender/src/editobject.c | 42 +++++++++++++++++++++++---------- source/blender/src/space.c | 3 +++ 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/source/blender/src/editobject.c b/source/blender/src/editobject.c index c2c5af22637..41a914b5a46 100644 --- a/source/blender/src/editobject.c +++ b/source/blender/src/editobject.c @@ -1575,6 +1575,7 @@ void special_editmenu(void) subdivideflag(1, 0.0, editbutflag | B_SMOOTH); break; case 4: + undo_push_mesh("Merge"); mergemenu(); break; case 5: @@ -1591,12 +1592,15 @@ void special_editmenu(void) selectswap_mesh(); break; case 9: + undo_push_mesh("Flip Normals"); flip_editnormals(); break; case 10: + undo_push_mesh("Smooth"); vertexsmooth(); break; case 12: + undo_push_mesh("Mirror"); mirrormenu(); break; } @@ -6741,9 +6745,10 @@ void make_displists_by_obdata(void *obdata) { /* ******************************************************************** */ /* Mirror function in Edit Mode */ + void mirrormenu(void){ short mode = 0, axis, a; - float *curs, mat[3][3], imat[3][3], min[3], max[3]; + float mat[3][3], imat[3][3], min[3], max[3]; TransVert *tv; mode=pupmenu("Mirror Axis %t|Global X%x1| Y%x2| Z%x3|Local X%x4| Y%x5| Z%x6|View X%x7| Y%x8| Z%x9|"); @@ -6757,15 +6762,18 @@ void mirrormenu(void){ tv = transvmain; if(G.vd->around==V3D_CENTROID) { - VECCOPY(centre, centroid); + VecCopyf(centre, centroid); } else if(G.vd->around==V3D_CURSOR) { + float *curs; curs= give_cursor(); VECCOPY(centre, curs); + VecSubf(centre, centre, G.obedit->obmat[3]); + Mat3MulVecfl(imat, centre); + } + else if(G.vd->around==V3D_LOCAL) { + centre[0] = centre[1] = centre[2] = 0.0; } - - VecSubf(centre, centre, G.obedit->obmat[3]); - Mat3MulVecfl(imat, centre); if ((mode==1) || (mode==2) || (mode==3)) { @@ -6776,11 +6784,11 @@ void mirrormenu(void){ vec[0] = tv->loc[0]; vec[1] = tv->loc[1]; vec[2] = tv->loc[2]; + VecSubf(vec, vec, centre); Mat3MulVecfl(mat, vec); - vec[axis] -= centre[axis]; vec[axis] *= -1; - vec[axis] += centre[axis]; Mat3MulVecfl(imat, vec); + VecAddf(vec, vec, centre); tv->loc[0] = vec[0]; tv->loc[1] = vec[1]; tv->loc[2] = vec[2]; @@ -6801,10 +6809,12 @@ void mirrormenu(void){ else if ((mode==7) || (mode==8) || (mode==9)){ float viewmat[3][3], iviewmat[3][3]; - Mat3CpyMat4(viewmat, G.vd->persmat); + Mat3CpyMat4(viewmat, G.vd->viewmat); Mat3Inv(iviewmat, viewmat); axis = mode - 7; + Mat3MulVecfl(mat, centre); + VecAddf(centre, centre, G.obedit->obmat[3]); Mat3MulVecfl(viewmat, centre); for(a=0; aloc[0]; vec[1] = tv->loc[1]; vec[2] = tv->loc[2]; + + Mat3MulVecfl(mat, vec); + VecAddf(vec, vec, G.obedit->obmat[3]); Mat3MulVecfl(viewmat, vec); - vec[axis] -= centre[axis]; + + VecSubf(vec, vec, centre); vec[axis] *= -1; - vec[axis] += centre[axis]; - Mat3MulVecfl(imat, vec); + VecAddf(vec, vec, centre); + Mat3MulVecfl(iviewmat, vec); + VecSubf(vec, vec, G.obedit->obmat[3]); + Mat3MulVecfl(imat, vec); + tv->loc[0] = vec[0]; tv->loc[1] = vec[1]; tv->loc[2] = vec[2]; } } + calc_trans_verts(); special_trans_update(0); - special_aftertrans_update(mode, a & 1, 0, 0); + special_aftertrans_update('m', a & 1, 0, 0); allqueue(REDRAWVIEW3D, 0); scrarea_queue_headredraw(curarea); diff --git a/source/blender/src/space.c b/source/blender/src/space.c index 7e73f924f81..fe5b7f805aa 100644 --- a/source/blender/src/space.c +++ b/source/blender/src/space.c @@ -1140,9 +1140,12 @@ void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt) if(G.obedit){ if(G.qual==LR_ALTKEY) { if(G.obedit->type==OB_MESH) + undo_push_mesh("Merge"); mergemenu(); } else if((G.qual==0)) + if(G.obedit->type==OB_MESH) + undo_push_mesh("Mirror"); mirrormenu(); } else if((G.qual==0)){