Index: source/blender/makesdna/DNA_scene_types.h =================================================================== --- source/blender/makesdna/DNA_scene_types.h (revision 10991) +++ source/blender/makesdna/DNA_scene_types.h (working copy) @@ -333,7 +333,8 @@ short uvcalc_mapalign; short uvcalc_flag; - short pad2; + /* Mirror axis */ + short mirror; /* Image Paint (8 byte aligned please!) */ struct ImagePaintSettings imapaint; Index: source/blender/include/blendef.h =================================================================== --- source/blender/include/blendef.h (revision 10991) +++ source/blender/include/blendef.h (working copy) @@ -420,22 +420,27 @@ #define B_KEEPORIG 2 #define B_BEAUTY 4 #define B_SMOOTH 8 -#define B_BEAUTY_SHORT 16 +#define B_BEAUTY_SHORT 16 #define B_AUTOFGON 32 #define B_KNIFE 0x80 -#define B_PERCENTSUBD 0x40 -#define B_MESH_X_MIRROR 0x100 -#define B_JOINTRIA_UV 0x200 -#define B_JOINTRIA_VCOL 0X400 -#define B_JOINTRIA_SHARP 0X800 -#define B_JOINTRIA_MAT 0X1000 +#define B_PERCENTSUBD 0x40 +#define B_MESH_MIRROR 0x100 +#define B_JOINTRIA_UV 0x200 +#define B_JOINTRIA_VCOL 0X400 +#define B_JOINTRIA_SHARP 0X800 +#define B_JOINTRIA_MAT 0X1000 /* DISPLAYMODE */ #define R_DISPLAYIMAGE 0 #define R_DISPLAYWIN 1 #define R_DISPLAYSCREEN 2 - /* Gvp.flag and Gwp.flag */ +/* mirror axes */ +#define MIRROR_X 0 +#define MIRROR_Y 1 +#define MIRROR_Z 2 + +/* Gvp.flag and Gwp.flag */ #define VP_COLINDEX 1 #define VP_AREA 2 #define VP_SOFT 4 Index: source/blender/include/BIF_meshtools.h =================================================================== --- source/blender/include/BIF_meshtools.h (revision 10991) +++ source/blender/include/BIF_meshtools.h (working copy) @@ -44,7 +44,8 @@ extern long mesh_octree_table(struct Object *ob, float *co, char mode); extern int mesh_get_x_mirror_vert(struct Object *ob, int index); -extern struct EditVert *editmesh_get_x_mirror_vert(struct Object *ob, float *co); +extern void setmirroredcoords(float *vec, float *co, int mirror); +extern struct EditVert *editmesh_get_mirror_vert(struct Object *ob, float *co, int mirror); #endif Index: source/blender/src/buttons_editing.c =================================================================== --- source/blender/src/buttons_editing.c (revision 10991) +++ source/blender/src/buttons_editing.c (working copy) @@ -4381,8 +4381,12 @@ uiBlockEndAlign(block); uiBlockBeginAlign(block); - uiDefButBitI(block, TOG, G_ALLEDGES, 0, "All Edges", 1125, 22,150,19, &G.f, 0, 0, 0, 0, "Displays all edges in object mode without optimization"); - uiDefButBitS(block, TOG, B_MESH_X_MIRROR, B_DIFF, "X-axis mirror",1125,0,150,19, &G.scene->toolsettings->editbutflag, 0, 0, 0, 0, "While using transforms, mirrors the transformation"); + uiDefButBitI(block, TOG, G_ALLEDGES, 0, "All Edges", 1125, 44,150,19, &G.f, 0, 0, 0, 0, "Displays all edges in object mode without optimization"); + + uiDefButBitS(block, TOG, B_MESH_MIRROR, B_DIFF, "Mirror",1125,22,150,19, &G.scene->toolsettings->editbutflag, 0, 0, 0, 0, "Enable mirrored editing"); + uiDefButS(block, ROW, B_DIFF, "X", 1125, 0, 50, 19, &G.scene->toolsettings->mirror, 0, MIRROR_X, 0, 0, "Enable X-axis mirrored editing"); + uiDefButS(block, ROW, B_DIFF, "Y", 1175, 0, 50, 19, &G.scene->toolsettings->mirror, 0, MIRROR_Y, 0, 0, "Enable Y-axis mirrored editing"); + uiDefButS(block, ROW, B_DIFF, "Z", 1225, 0, 50, 19, &G.scene->toolsettings->mirror, 0, MIRROR_Z, 0, 0, "Enable Z-axis mirrored editing"); uiBlockEndAlign(block); } Index: source/blender/src/transform_conversions.c =================================================================== --- source/blender/src/transform_conversions.c (revision 10991) +++ source/blender/src/transform_conversions.c (working copy) @@ -1637,7 +1637,7 @@ float mtx[3][3], smtx[3][3]; int count=0, countsel=0; int propmode = t->flag & T_PROP_EDIT; - int mirror= (G.scene->toolsettings->editbutflag & B_MESH_X_MIRROR); + int mirror = G.scene->toolsettings->mirror, negmirror= 0; // transform now requires awareness for select mode, so we tag the f1 flags in verts if(G.scene->selectmode & SCE_SELECT_VERTEX) { @@ -1706,16 +1706,14 @@ } /* find out which half we do */ - if(mirror) { - for (eve=em->verts.first; eve; eve=eve->next) { - if(eve->h==0 && eve->f1 && eve->co[0]!=0.0f) { - if(eve->co[0]<0.0f) - mirror = -1; - break; - } + for (eve=em->verts.first; eve; eve=eve->next) { + if(eve->h==0 && eve->f1 && eve->co[mirror]!=0.0f) { + if(eve->co[mirror]<0.0f) + negmirror= 1; + break; } } - + for (eve=em->verts.first; eve; eve=eve->next) { if(eve->h==0) { if(propmode || eve->f1) { @@ -1752,9 +1750,11 @@ } /* Mirror? */ - if( (mirror>0 && tob->iloc[0]>0.0f) || (mirror<0 && tob->iloc[0]<0.0f)) { - EditVert *vmir= editmesh_get_x_mirror_vert(G.obedit, tob->iloc); /* initializes octree on first call */ - if(vmir!=eve) tob->tdmir= vmir; + if(mirror >= 0) { + if((!negmirror && tob->iloc[mirror]>0.0f) || (negmirror && tob->iloc[mirror]<0.0f)) { + EditVert *vmir= editmesh_get_mirror_vert(G.obedit, tob->iloc, mirror); /* initializes octree on first call */ + if(vmir!=eve) tob->tdmir= vmir; + } } tob++; } Index: source/blender/src/meshtools.c =================================================================== --- source/blender/src/meshtools.c (revision 10991) +++ source/blender/src/meshtools.c (working copy) @@ -805,15 +805,23 @@ return mesh_octree_table(ob, vec, 'u'); } -EditVert *editmesh_get_x_mirror_vert(Object *ob, float *co) +void setmirroredcoords(float *vec, float *co, int mirror) { + int i; + + for(i=0; i<3; i++) { + if(i==mirror) vec[i]= -co[i]; + else vec[i]= co[i]; + } +} + +EditVert *editmesh_get_mirror_vert(Object *ob, float *co, int mirror) +{ float vec[3]; long poinval; - - vec[0]= -co[0]; - vec[1]= co[1]; - vec[2]= co[2]; - + + setmirroredcoords(vec, co, mirror); + poinval= mesh_octree_table(ob, vec, 'u'); if(poinval != -1) return (EditVert *)(poinval); Index: source/blender/src/transform_generics.c =================================================================== --- source/blender/src/transform_generics.c (revision 10991) +++ source/blender/src/transform_generics.c (working copy) @@ -187,7 +187,7 @@ } /* assumes G.obedit set to mesh object */ -static void editmesh_apply_to_mirror(TransInfo *t) +static void editmesh_apply_to_mirror(TransInfo *t, int mirror) { TransData *td = t->data; EditVert *eve; @@ -200,12 +200,8 @@ break; eve= td->tdmir; - if(eve) { - eve->co[0]= -td->loc[0]; - eve->co[1]= td->loc[1]; - eve->co[2]= td->loc[2]; - } - } + if(eve) setmirroredcoords(eve->co, td->loc, mirror); + } } /* called for updating while transform acts, once per redraw */ @@ -224,8 +220,8 @@ if(t->state != TRANS_CANCEL) clipMirrorModifier(t, G.obedit); - if(G.scene->toolsettings->editbutflag & B_MESH_X_MIRROR) - editmesh_apply_to_mirror(t); + if(G.scene->toolsettings->editbutflag & B_MESH_MIRROR) + editmesh_apply_to_mirror(t, G.scene->toolsettings->mirror); DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA); /* sets recalc flags */ Index: source/blender/src/editmesh_mods.c =================================================================== --- source/blender/src/editmesh_mods.c (revision 10991) +++ source/blender/src/editmesh_mods.c (working copy) @@ -116,10 +116,11 @@ if(G.scene->selectmode & SCE_SELECT_VERTEX) { EditMesh *em = G.editMesh; EditVert *eve, *v1; + int mirror = G.scene->toolsettings->mirror; for(eve= em->verts.first; eve; eve= eve->next) { if(eve->f & SELECT) { - v1= editmesh_get_x_mirror_vert(G.obedit, eve->co); + v1= editmesh_get_mirror_vert(G.obedit, eve->co, mirror); if(v1) { eve->f &= ~SELECT; v1->f |= SELECT;