diff options
-rwxr-xr-x | source/blender/include/BIF_transform.h | 5 | ||||
-rwxr-xr-x | source/blender/include/transform.h | 11 | ||||
-rw-r--r-- | source/blender/src/editarmature.c | 6 | ||||
-rw-r--r-- | source/blender/src/editcurve.c | 9 | ||||
-rw-r--r-- | source/blender/src/editmball.c | 3 | ||||
-rw-r--r-- | source/blender/src/editmesh_add.c | 3 | ||||
-rw-r--r-- | source/blender/src/editmesh_tools.c | 6 | ||||
-rw-r--r-- | source/blender/src/editobject.c | 24 | ||||
-rw-r--r-- | source/blender/src/editview.c | 15 | ||||
-rw-r--r-- | source/blender/src/header_view3d.c | 108 | ||||
-rw-r--r-- | source/blender/src/space.c | 69 | ||||
-rw-r--r-- | source/blender/src/toolbox.c | 18 | ||||
-rwxr-xr-x | source/blender/src/transform.c | 491 | ||||
-rwxr-xr-x | source/blender/src/transform_constraints.c | 42 |
14 files changed, 456 insertions, 354 deletions
diff --git a/source/blender/include/BIF_transform.h b/source/blender/include/BIF_transform.h index aea415725c0..e0b464d147c 100755 --- a/source/blender/include/BIF_transform.h +++ b/source/blender/include/BIF_transform.h @@ -58,10 +58,9 @@ #define CTX_EDGE 2 #define CTX_NO_PET 4 #define CTX_NO_NOR_RECALC 8 -#define CTX_SETLOCALCONST 16 - -void Transform(int mode, int context); +void initTransform(int mode, int context); +void Transform(void); void Mirror(short mode); struct TransInfo; diff --git a/source/blender/include/transform.h b/source/blender/include/transform.h index 115e5a57e59..74857c1e527 100755 --- a/source/blender/include/transform.h +++ b/source/blender/include/transform.h @@ -125,11 +125,12 @@ typedef struct TransData { typedef struct TransInfo { int mode; /* current mode */ + short state; /* current state (running, canceled,...)*/ int context; /* current context */ int (*transform)(struct TransInfo *, short *); /* transform function pointer */ char redraw; /* redraw flag */ - int flag; /* generic flags for special behaviors */ + int flag; /* generic flags for special behaviors */ int total; /* total number of transformed data */ float propsize; /* proportional circle radius */ char proptext[20]; /* proportional falloff text */ @@ -166,6 +167,11 @@ typedef struct TransInfo { #define NUM_NO_FRACTION 16 #define NUM_AFFECT_ALL 32 +/* transinfo->state */ +#define TRANS_RUNNING 0 +#define TRANS_CONFIRM 1 +#define TRANS_CANCEL 2 + /* transinfo->flag */ #define T_OBJECT 1 #define T_EDIT 2 @@ -186,6 +192,8 @@ typedef struct TransInfo { #define T_PROP_EDIT 2048 #define T_PROP_CONNECTED 4096 +/* if MMB is pressed or not */ +#define T_MMB_PRESSED 8192 /* transinfo->con->mode */ #define CON_APPLY 1 @@ -279,6 +287,7 @@ int getConstraintSpaceDimension(TransInfo *t); void setNearestAxis(TransInfo *t); +char constraintModeToChar(TransInfo *t); /*********************** Generics ********************************/ void recalcData(TransInfo *t); diff --git a/source/blender/src/editarmature.c b/source/blender/src/editarmature.c index ec0c46801e9..74b8350b6a9 100644 --- a/source/blender/src/editarmature.c +++ b/source/blender/src/editarmature.c @@ -1997,7 +1997,8 @@ void extrude_armature(void) /* Transform the endpoints */ countall(); BIF_TransformSetUndo("Extrude"); - Transform(TFM_TRANSLATION, CTX_NO_PET); + initTransform(TFM_TRANSLATION, CTX_NO_PET); + Transform(); allqueue(REDRAWBUTSEDIT, 0); allqueue(REDRAWBUTSOBJECT, 0); allqueue(REDRAWOOPS, 0); @@ -2161,7 +2162,8 @@ void adduplicate_armature(void) } BIF_TransformSetUndo("Add Duplicate"); - Transform(TFM_TRANSLATION, CTX_NO_PET); + initTransform(TFM_TRANSLATION, CTX_NO_PET); + Transform(); allqueue(REDRAWBUTSEDIT, 0); allqueue(REDRAWBUTSOBJECT, 0); allqueue(REDRAWOOPS, 0); diff --git a/source/blender/src/editcurve.c b/source/blender/src/editcurve.c index e4610015e25..dd4af70c3f7 100644 --- a/source/blender/src/editcurve.c +++ b/source/blender/src/editcurve.c @@ -2795,7 +2795,8 @@ void addvert_Nurb(int mode) if(mode=='e') { BIF_TransformSetUndo("Extrude"); - Transform(TFM_TRANSLATION, CTX_NO_PET); + initTransform(TFM_TRANSLATION, CTX_NO_PET); + Transform(); } else while(get_mbut()&R_MOUSE) BIF_wait_for_statechange(); @@ -2833,7 +2834,8 @@ void extrude_nurb() makeDispList(G.obedit); countall(); BIF_TransformSetUndo("Extrude"); - Transform(TFM_TRANSLATION, CTX_NO_PET); + initTransform(TFM_TRANSLATION, CTX_NO_PET); + Transform(); } } } @@ -3062,7 +3064,8 @@ void adduplicate_nurb() countall(); BIF_TransformSetUndo("Add Duplicate"); - Transform(TFM_TRANSLATION, CTX_NO_PET); + initTransform(TFM_TRANSLATION, CTX_NO_PET); + Transform(); } void delNurb() diff --git a/source/blender/src/editmball.c b/source/blender/src/editmball.c index 1ba62b07206..62f4a85358b 100644 --- a/source/blender/src/editmball.c +++ b/source/blender/src/editmball.c @@ -313,7 +313,8 @@ void adduplicate_mball() } BIF_TransformSetUndo("Add Duplicate"); - Transform(TFM_TRANSLATION, CTX_NO_PET); + initTransform(TFM_TRANSLATION, CTX_NO_PET); + Transform(); allqueue(REDRAWBUTSEDIT, 0); } diff --git a/source/blender/src/editmesh_add.c b/source/blender/src/editmesh_add.c index f57fe178360..3e9b3b58cf3 100644 --- a/source/blender/src/editmesh_add.c +++ b/source/blender/src/editmesh_add.c @@ -438,7 +438,8 @@ void adduplicate_mesh(void) waitcursor(0); countall(); BIF_TransformSetUndo("Add Duplicate"); - Transform(TFM_TRANSLATION, CTX_NO_PET); + initTransform(TFM_TRANSLATION, CTX_NO_PET); + Transform(); } diff --git a/source/blender/src/editmesh_tools.c b/source/blender/src/editmesh_tools.c index 753839698fa..4d454930b73 100644 --- a/source/blender/src/editmesh_tools.c +++ b/source/blender/src/editmesh_tools.c @@ -582,15 +582,17 @@ void extrude_mesh(void) /* individual faces? */ BIF_TransformSetUndo("Extrude"); if(nr==2) { - Transform(TFM_SHRINKFATTEN, CTX_NO_PET|CTX_NO_NOR_RECALC); + initTransform(TFM_SHRINKFATTEN, CTX_NO_PET|CTX_NO_NOR_RECALC); + Transform(); } else { + initTransform(TFM_TRANSLATION, CTX_NO_PET); if(transmode=='n') { Mat4MulVecfl(G.obedit->obmat, nor); VecSubf(nor, nor, G.obedit->obmat[3]); BIF_setSingleAxisConstraint(nor, NULL); } - Transform(TFM_TRANSLATION, CTX_NO_PET); + Transform(); } } diff --git a/source/blender/src/editobject.c b/source/blender/src/editobject.c index 749dcc0ffae..71c42e10dd1 100644 --- a/source/blender/src/editobject.c +++ b/source/blender/src/editobject.c @@ -3265,8 +3265,10 @@ void std_rmouse_transform(void (*xf_func)(int, int)) while(get_mbut() & mousebut) { getmouseco_areawin(mval); if(abs(mval[0]-xo)+abs(mval[1]-yo) > 10) { - if(curarea->spacetype==SPACE_VIEW3D) - Transform(TFM_TRANSLATION, CTX_NONE); + if(curarea->spacetype==SPACE_VIEW3D) { + initTransform(TFM_TRANSLATION, CTX_NONE); + Transform(); + } else xf_func('g', 0); @@ -4134,7 +4136,8 @@ void adduplicate(float *dtrans) countall(); if(dtrans==0) { BIF_TransformSetUndo("Add Duplicate"); - Transform(TFM_TRANSLATION, CTX_NONE); + initTransform(TFM_TRANSLATION, CTX_NONE); + Transform(); } set_active_base(BASACT); @@ -4480,9 +4483,18 @@ void texspace_edit(void) } - if(nr==1) Transform(TFM_TRANSLATION, CTX_TEXTURE); - else if(nr==2) Transform(TFM_RESIZE, CTX_TEXTURE); - else if(nr==3) Transform(TFM_ROTATION, CTX_TEXTURE); + if(nr==1) { + initTransform(TFM_TRANSLATION, CTX_TEXTURE); + Transform(); + } + else if(nr==2) { + initTransform(TFM_RESIZE, CTX_TEXTURE); + Transform(); + } + else if(nr==3) { + initTransform(TFM_ROTATION, CTX_TEXTURE); + Transform(); + } } void first_base(void) diff --git a/source/blender/src/editview.c b/source/blender/src/editview.c index 18e05ed13f8..22d738fbafd 100644 --- a/source/blender/src/editview.c +++ b/source/blender/src/editview.c @@ -710,9 +710,18 @@ int gesture(void) else if(curarea->spacetype==SPACE_IMAGE) transform_tface_uv(i, 0); else if(curarea->spacetype==SPACE_OOPS) transform_oops('g', 0); else { - if(i=='g') Transform(TFM_TRANSLATION, CTX_NONE); - else if(i=='r') Transform(TFM_ROTATION, CTX_NONE); - else Transform(TFM_RESIZE, CTX_NONE); + if(i=='g') { + initTransform(TFM_TRANSLATION, CTX_NONE); + Transform(); + } + else if(i=='r') { + initTransform(TFM_ROTATION, CTX_NONE); + Transform(); + } + else { + initTransform(TFM_RESIZE, CTX_NONE); + Transform(); + } } } } diff --git a/source/blender/src/header_view3d.c b/source/blender/src/header_view3d.c index 39a5f09eaff..72bdd51fb58 100644 --- a/source/blender/src/header_view3d.c +++ b/source/blender/src/header_view3d.c @@ -1234,28 +1234,34 @@ void do_view3d_transform_moveaxismenu(void *arg, int event) switch(event) { case 0: /* X Global */ + initTransform(TFM_TRANSLATION, CTX_NONE); BIF_setSingleAxisConstraint(mat[0], " X"); - Transform(TFM_TRANSLATION, CTX_NONE); + Transform(); break; case 1: /* Y Global */ - BIF_setSingleAxisConstraint(mat[0], " Y"); - Transform(TFM_TRANSLATION, CTX_NONE); + initTransform(TFM_TRANSLATION, CTX_NONE); + BIF_setSingleAxisConstraint(mat[1], " Y"); + Transform(); break; case 2: /* Z Global */ - BIF_setSingleAxisConstraint(mat[0], " Z"); - Transform(TFM_TRANSLATION, CTX_NONE); + initTransform(TFM_TRANSLATION, CTX_NONE); + BIF_setSingleAxisConstraint(mat[2], " Z"); + Transform(); break; case 3: /* X Local */ + initTransform(TFM_TRANSLATION, CTX_NONE); BIF_setLocalAxisConstraint('X', " X"); - Transform(TFM_TRANSLATION, CTX_SETLOCALCONST); + Transform(); break; case 4: /* Y Local */ + initTransform(TFM_TRANSLATION, CTX_NONE); BIF_setLocalAxisConstraint('Y', " Y"); - Transform(TFM_TRANSLATION, CTX_SETLOCALCONST); + Transform(); break; case 5: /* Z Local */ + initTransform(TFM_TRANSLATION, CTX_NONE); BIF_setLocalAxisConstraint('Z', " Z"); - Transform(TFM_TRANSLATION, CTX_SETLOCALCONST); + Transform(); break; } allqueue(REDRAWVIEW3D, 0); @@ -1294,28 +1300,34 @@ void do_view3d_transform_rotateaxismenu(void *arg, int event) switch(event) { case 0: /* X Global */ + initTransform(TFM_ROTATION, CTX_NONE); BIF_setSingleAxisConstraint(mat[0], " X"); - Transform(TFM_ROTATION, CTX_NONE); + Transform(); break; case 1: /* Y Global */ + initTransform(TFM_ROTATION, CTX_NONE); BIF_setSingleAxisConstraint(mat[1], " Y"); - Transform(TFM_ROTATION, CTX_NONE); + Transform(); break; case 2: /* Z Global */ + initTransform(TFM_ROTATION, CTX_NONE); BIF_setSingleAxisConstraint(mat[2], " Z"); - Transform(TFM_ROTATION, CTX_NONE); - break; + Transform(); + break; case 3: /* X Local */ + initTransform(TFM_ROTATION, CTX_NONE); BIF_setLocalAxisConstraint('X', " X"); - Transform(TFM_ROTATION, CTX_SETLOCALCONST); + Transform(); break; case 4: /* Y Local */ + initTransform(TFM_ROTATION, CTX_NONE); BIF_setLocalAxisConstraint('Y', " Y"); - Transform(TFM_ROTATION, CTX_SETLOCALCONST); + Transform(); break; case 5: /* Z Local */ + initTransform(TFM_ROTATION, CTX_NONE); BIF_setLocalAxisConstraint('Z', " Z"); - Transform(TFM_ROTATION, CTX_SETLOCALCONST); + Transform(); break; } allqueue(REDRAWVIEW3D, 0); @@ -1354,28 +1366,34 @@ void do_view3d_transform_scaleaxismenu(void *arg, int event) switch(event) { case 0: /* X Global */ + initTransform(TFM_RESIZE, CTX_NONE); BIF_setSingleAxisConstraint(mat[0], " X"); - Transform(TFM_RESIZE, CTX_NONE); + Transform(); break; case 1: /* Y Global */ + initTransform(TFM_RESIZE, CTX_NONE); BIF_setSingleAxisConstraint(mat[1], " Y"); - Transform(TFM_RESIZE, CTX_NONE); + Transform(); break; case 2: /* Z Global */ + initTransform(TFM_RESIZE, CTX_NONE); BIF_setSingleAxisConstraint(mat[2], " Z"); - Transform(TFM_RESIZE, CTX_NONE); + Transform(); break; case 3: /* X Local */ + initTransform(TFM_RESIZE, CTX_NONE); BIF_setLocalAxisConstraint('X', " X"); - Transform(TFM_RESIZE, CTX_SETLOCALCONST); + Transform(); break; case 4: /* Y Local */ + initTransform(TFM_RESIZE, CTX_NONE); BIF_setLocalAxisConstraint('X', " X"); - Transform(TFM_RESIZE, CTX_SETLOCALCONST); + Transform(); break; case 5: /* Z Local */ + initTransform(TFM_RESIZE, CTX_NONE); BIF_setLocalAxisConstraint('X', " X"); - Transform(TFM_RESIZE, CTX_SETLOCALCONST); + Transform(); break; } allqueue(REDRAWVIEW3D, 0); @@ -1409,13 +1427,16 @@ static void do_view3d_transformmenu(void *arg, int event) { switch(event) { case 1: - Transform(TFM_TRANSLATION, CTX_NONE); + initTransform(TFM_TRANSLATION, CTX_NONE); + Transform(); break; case 2: - Transform(TFM_ROTATION, CTX_NONE); + initTransform(TFM_ROTATION, CTX_NONE); + Transform(); break; case 3: - Transform(TFM_RESIZE, CTX_NONE); + initTransform(TFM_RESIZE, CTX_NONE); + Transform(); break; } allqueue(REDRAWVIEW3D, 0); @@ -2056,7 +2077,8 @@ void do_view3d_edit_mesh_edgesmenu(void *arg, int event) editmesh_mark_seam(1); break; case 9: /* Cease SubSurf */ - Transform(TFM_CREASE, CTX_EDGE); + initTransform(TFM_CREASE, CTX_EDGE); + Transform(); break; case 10: /* Rotate Edge */ edge_rotate_selected(2); @@ -2336,13 +2358,16 @@ static void do_view3d_edit_meshmenu(void *arg, int event) delete_context_selected(); break; case 9: /* Shrink/Fatten Along Normals */ - Transform(TFM_SHRINKFATTEN, CTX_NONE); + initTransform(TFM_SHRINKFATTEN, CTX_NONE); + Transform(); break; case 10: /* Shear */ - Transform(TFM_SHEAR, CTX_NONE); + initTransform(TFM_SHEAR, CTX_NONE); + Transform(); break; case 11: /* Warp */ - Transform(TFM_WARP, CTX_NONE); + initTransform(TFM_WARP, CTX_NONE); + Transform(); break; case 12: /* proportional edit (toggle) */ if(G.scene->proportional) G.scene->proportional= 1; @@ -2433,7 +2458,8 @@ static void do_view3d_edit_curve_controlpointsmenu(void *arg, int event) { switch(event) { case 0: /* tilt */ - Transform(TFM_TILT, CTX_NONE); + initTransform(TFM_TILT, CTX_NONE); + Transform(); break; case 1: /* clear tilt */ clear_tilt(); @@ -2592,10 +2618,12 @@ static void do_view3d_edit_curvemenu(void *arg, int event) else G.scene->proportional= 1; break; case 13: /* Shear */ - Transform(TFM_SHEAR, CTX_NONE); + initTransform(TFM_SHEAR, CTX_NONE); + Transform(); break; case 14: /* Warp */ - Transform(TFM_WARP, CTX_NONE); + initTransform(TFM_WARP, CTX_NONE); + Transform(); break; } allqueue(REDRAWVIEW3D, 0); @@ -2713,10 +2741,12 @@ static void do_view3d_edit_metaballmenu(void *arg, int event) delete_context_selected(); break; case 5: /* Shear */ - Transform(TFM_SHEAR, CTX_NONE); + initTransform(TFM_SHEAR, CTX_NONE); + Transform(); break; case 6: /* Warp */ - Transform(TFM_WARP, CTX_NONE); + initTransform(TFM_WARP, CTX_NONE); + Transform(); break; case 7: /* Transform Properties */ add_blockhandler(curarea, VIEW3D_HANDLER_OBJECT, 0); @@ -2920,10 +2950,12 @@ static void do_view3d_edit_latticemenu(void *arg, int event) common_insertkey(); break; case 3: /* Shear */ - Transform(TFM_SHEAR, CTX_NONE); + initTransform(TFM_SHEAR, CTX_NONE); + Transform(); break; case 4: /* Warp */ - Transform(TFM_WARP, CTX_NONE); + initTransform(TFM_WARP, CTX_NONE); + Transform(); break; case 5: /* proportional edit (toggle) */ if(G.scene->proportional) G.scene->proportional= 0; @@ -2998,10 +3030,12 @@ static void do_view3d_edit_armaturemenu(void *arg, int event) delete_context_selected(); break; case 6: /* Shear */ - Transform(TFM_SHEAR, CTX_NONE); + initTransform(TFM_SHEAR, CTX_NONE); + Transform(); break; case 7: /* Warp */ - Transform(TFM_WARP, CTX_NONE); + initTransform(TFM_WARP, CTX_NONE); + Transform(); break; } allqueue(REDRAWVIEW3D, 0); diff --git a/source/blender/src/space.c b/source/blender/src/space.c index f613cb6a055..bec4fd46264 100644 --- a/source/blender/src/space.c +++ b/source/blender/src/space.c @@ -1215,7 +1215,8 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt) } else if (G.qual==LR_SHIFTKEY) { if (G.obedit && G.obedit->type==OB_MESH) { - Transform(TFM_CREASE, CTX_EDGE); + initTransform(TFM_CREASE, CTX_EDGE); + Transform(); } } break; @@ -1257,7 +1258,8 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt) doredraw= 1; } else if((G.qual==0)) { - Transform(TFM_TRANSLATION, CTX_NONE); + initTransform(TFM_TRANSLATION, CTX_NONE); + Transform(); } break; case HKEY: @@ -1500,13 +1502,17 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt) separatemenu(); else if ((G.qual==0) && ELEM(G.obedit->type, OB_CURVE, OB_SURF)) separate_nurb(); - else if (G.qual==LR_SHIFTKEY) - Transform(TFM_PUSHPULL, CTX_NONE); + else if (G.qual==LR_SHIFTKEY) { + initTransform(TFM_PUSHPULL, CTX_NONE); + Transform(); + } } else if(G.qual==LR_CTRLKEY || G.qual==(LR_SHIFTKEY|LR_CTRLKEY)) make_parent(); - else if(G.qual==LR_SHIFTKEY) - Transform(TFM_PUSHPULL, CTX_NONE); + else if(G.qual==LR_SHIFTKEY) { + initTransform(TFM_PUSHPULL, CTX_NONE); + Transform(); + } else if(G.qual==LR_ALTKEY) clear_parent(); else if((G.qual==0)) { @@ -1537,11 +1543,13 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt) loopoperations(LOOP_CUT); } else if((G.qual==0)) { - Transform(TFM_ROTATION, CTX_NONE); + initTransform(TFM_ROTATION, CTX_NONE); + Transform(); } } else if((G.qual==0)) { - Transform(TFM_ROTATION, CTX_NONE); + initTransform(TFM_ROTATION, CTX_NONE); + Transform(); } break; case SKEY: @@ -1550,19 +1558,27 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt) doredraw= 1; } else if(G.obedit) { - if(G.qual==LR_ALTKEY) - Transform(TFM_SHRINKFATTEN, CTX_NONE); - else if(G.qual==LR_CTRLKEY) - Transform(TFM_SHEAR, CTX_NONE); - else if(G.qual==(LR_CTRLKEY|LR_ALTKEY)) - Transform(TFM_SHEAR, CTX_NONE); + if(G.qual==LR_ALTKEY) { + initTransform(TFM_SHRINKFATTEN, CTX_NONE); + Transform(); + } + else if(G.qual==LR_CTRLKEY) { + initTransform(TFM_SHEAR, CTX_NONE); + Transform(); + } + else if(G.qual==(LR_CTRLKEY|LR_ALTKEY)) { + initTransform(TFM_SHEAR, CTX_NONE); + Transform(); + } else if(G.qual==LR_SHIFTKEY) snapmenu(); else if(G.qual==0) { - Transform(TFM_RESIZE, CTX_NONE); + initTransform(TFM_RESIZE, CTX_NONE); + Transform(); } else if(G.qual==(LR_SHIFTKEY|LR_CTRLKEY)){ - Transform(TFM_TOSPHERE, CTX_NONE); + initTransform(TFM_TOSPHERE, CTX_NONE); + Transform(); } } @@ -1575,12 +1591,17 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt) snapmenu(); } else if((G.qual==0)) { - Transform(TFM_RESIZE, CTX_NONE); + initTransform(TFM_RESIZE, CTX_NONE); + Transform(); + } + else if(G.qual==(LR_SHIFTKEY|LR_CTRLKEY)) { + initTransform(TFM_TOSPHERE, CTX_NONE); + Transform(); + } + else if(G.qual==(LR_CTRLKEY|LR_ALTKEY)) { + initTransform(TFM_SHEAR, CTX_NONE); + Transform(); } - else if(G.qual==(LR_SHIFTKEY|LR_CTRLKEY)) - Transform(TFM_TOSPHERE, CTX_NONE); - else if(G.qual==(LR_CTRLKEY|LR_ALTKEY)) - Transform(TFM_SHEAR, CTX_NONE); break; case TKEY: if(G.obedit){ @@ -1595,7 +1616,8 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt) clear_tilt(); } else if (G.qual==0) { - Transform(TFM_TILT, CTX_NONE); + initTransform(TFM_TILT, CTX_NONE); + Transform(); } } } @@ -1661,7 +1683,8 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt) break; case WKEY: if((G.qual==LR_SHIFTKEY)) { - Transform(TFM_WARP, CTX_NONE); + initTransform(TFM_WARP, CTX_NONE); + Transform(); } else if(G.qual==LR_ALTKEY) { /* if(G.obedit && G.obedit->type==OB_MESH) write_videoscape(); */ diff --git a/source/blender/src/toolbox.c b/source/blender/src/toolbox.c index e1a23e17bb5..16448c74838 100644 --- a/source/blender/src/toolbox.c +++ b/source/blender/src/toolbox.c @@ -1991,13 +1991,16 @@ static void tb_do_transform(void *arg, int event) switch(event) { case 0: /* Grab/move */ - Transform(TFM_TRANSLATION, CTX_NONE); + initTransform(TFM_TRANSLATION, CTX_NONE); + Transform(); break; case 1: /* Rotate */ - Transform(TFM_ROTATION, CTX_NONE); + initTransform(TFM_ROTATION, CTX_NONE); + Transform(); break; case 2: /* Scale */ - Transform(TFM_RESIZE,CTX_NONE); + initTransform(TFM_RESIZE,CTX_NONE); + Transform(); break; case 3: /* transform properties */ add_blockhandler(curarea, VIEW3D_HANDLER_OBJECT, UI_PNL_UNSTOW); @@ -2006,13 +2009,16 @@ static void tb_do_transform(void *arg, int event) snapmenu(); break; case 5: /* Shrink/Fatten Along Normals */ - Transform(TFM_SHRINKFATTEN, CTX_NONE); + initTransform(TFM_SHRINKFATTEN, CTX_NONE); + Transform(); break; case 6: /* Shear */ - Transform(TFM_SHEAR, CTX_NONE); + initTransform(TFM_SHEAR, CTX_NONE); + Transform(); break; case 7: /* Warp */ - Transform(TFM_WARP, CTX_NONE); + initTransform(TFM_WARP, CTX_NONE); + Transform(); break; case 8: /* proportional edit (toggle) */ if(G.scene->proportional) G.scene->proportional= 0; diff --git a/source/blender/src/transform.c b/source/blender/src/transform.c index 5288fc1110b..0219ae81a95 100755 --- a/source/blender/src/transform.c +++ b/source/blender/src/transform.c @@ -124,9 +124,6 @@ extern void helpline(float *vec); TransInfo Trans = {TFM_INIT, 0}; // enforce init on first usage int LastMode = TFM_TRANSLATION; -#define TRANS_CANCEL 2 -#define TRANS_CONFIRM 1 - /* ************************** TRANSFORMATIONS **************************** */ static void view_editmove(unsigned short event) @@ -219,20 +216,224 @@ static char *transform_to_undostr(TransInfo *t) /* ************************************************* */ -void Transform(int mode, int context) -{ - int ret_val = 0; - short pmval[2] = {0, 0}, mval[2], val; +void transformEvent(unsigned short event, short val) { float mati[3][3]; - unsigned short event; - /* constraint mode THIS IS A HACK will have to use con.mode eventually */ - char cmode = '\0'; - /* If MMB is pressed or not */ - char mmb_press = 0; + char cmode = constraintModeToChar(&Trans); + Mat3One(mati); + + if (val) { + switch (event){ + /* enforce redraw of transform when modifiers are used */ + case LEFTCTRLKEY: + case RIGHTCTRLKEY: + Trans.redraw = 1; + break; + case LEFTSHIFTKEY: + case RIGHTSHIFTKEY: + /* shift is modifier for higher resolution transform, works nice to store this mouse position */ + getmouseco_areawin(Trans.shiftmval); + Trans.flag |= T_SHIFT_MOD; + Trans.redraw = 1; + break; + + case MIDDLEMOUSE: + if ((Trans.flag & T_NO_CONSTRAINT)==0) { + /* exception for switching to dolly, or trackball, in camera view */ + if (Trans.flag & T_CAMERA) { + if (Trans.mode==TFM_TRANSLATION) + setLocalConstraint(&Trans, (CON_AXIS2), "along local Z"); + else if (Trans.mode==TFM_ROTATION) { + restoreTransObjects(&Trans); + initTransModeFlags(&Trans, TFM_TRACKBALL); + initTrackball(&Trans); + } + } + else { + Trans.flag |= T_MMB_PRESSED; + if (Trans.con.mode & CON_APPLY) { + stopConstraint(&Trans); + } + else { + initSelectConstraint(&Trans, mati); + postSelectConstraint(&Trans); + } + } + Trans.redraw = 1; + } + break; + case ESCKEY: + case RIGHTMOUSE: + Trans.state = TRANS_CANCEL; + break; + case LEFTMOUSE: + case SPACEKEY: + case PADENTER: + case RETKEY: + Trans.state = TRANS_CONFIRM; + break; + case GKEY: + restoreTransObjects(&Trans); + initTransModeFlags(&Trans, TFM_TRANSLATION); + initTranslation(&Trans); + Trans.redraw = 1; + break; + case SKEY: + restoreTransObjects(&Trans); + initTransModeFlags(&Trans, TFM_RESIZE); + initResize(&Trans); + Trans.redraw = 1; + break; + case RKEY: + if (Trans.mode == TFM_ROTATION) { + restoreTransObjects(&Trans); + initTransModeFlags(&Trans, TFM_TRACKBALL); + initTrackball(&Trans); + } + else { + restoreTransObjects(&Trans); + initTransModeFlags(&Trans, TFM_ROTATION); + initRotation(&Trans); + } + Trans.redraw = 1; + break; + case CKEY: + if (G.qual & LR_ALTKEY) { + Trans.flag ^= T_PROP_CONNECTED; + sort_trans_data_dist(&Trans); + calculatePropRatio(&Trans); + Trans.redraw= 1; + } + else { + stopConstraint(&Trans); + Trans.redraw = 1; + } + break; + case XKEY: + if ((Trans.flag & T_NO_CONSTRAINT)==0) { + if (cmode == 'X') { + if (Trans.con.mode & CON_LOCAL) { + stopConstraint(&Trans); + } + else { + if (G.qual == 0) + setLocalConstraint(&Trans, (CON_AXIS0), "along local X"); + else if (G.qual == LR_SHIFTKEY) + setLocalConstraint(&Trans, (CON_AXIS1|CON_AXIS2), "locking local X"); + } + } + else { + if (G.qual == 0) + setConstraint(&Trans, mati, (CON_AXIS0), "along global X"); + else if (G.qual == LR_SHIFTKEY) + setConstraint(&Trans, mati, (CON_AXIS1|CON_AXIS2), "locking global X"); + } + Trans.redraw = 1; + } + break; + case YKEY: + if ((Trans.flag & T_NO_CONSTRAINT)==0) { + if (cmode == 'Y') { + if (Trans.con.mode & CON_LOCAL) { + stopConstraint(&Trans); + } + else { + if (G.qual == 0) + setLocalConstraint(&Trans, (CON_AXIS1), "along local Y"); + else if (G.qual == LR_SHIFTKEY) + setLocalConstraint(&Trans, (CON_AXIS0|CON_AXIS2), "locking local Y"); + } + } + else { + if (G.qual == 0) + setConstraint(&Trans, mati, (CON_AXIS1), "along global Y"); + else if (G.qual == LR_SHIFTKEY) + setConstraint(&Trans, mati, (CON_AXIS0|CON_AXIS2), "locking global Y"); + } + Trans.redraw = 1; + } + break; + case ZKEY: + if ((Trans.flag & T_NO_CONSTRAINT)==0) { + if (cmode == 'Z') { + if (Trans.con.mode & CON_LOCAL) { + stopConstraint(&Trans); + } + else { + if (G.qual == 0) + setLocalConstraint(&Trans, (CON_AXIS2), "along local Z"); + else if (G.qual == LR_SHIFTKEY) + setLocalConstraint(&Trans, (CON_AXIS0|CON_AXIS1), "locking local Z"); + } + } + else { + if (G.qual == 0) + setConstraint(&Trans, mati, (CON_AXIS2), "along global Z"); + else if (G.qual == LR_SHIFTKEY) + setConstraint(&Trans, mati, (CON_AXIS0|CON_AXIS1), "locking global Z"); + } + Trans.redraw = 1; + } + break; + case OKEY: + if (Trans.flag & T_PROP_EDIT && G.qual==LR_SHIFTKEY) { + G.scene->prop_mode = (G.scene->prop_mode+1)%6; + calculatePropRatio(&Trans); + Trans.redraw= 1; + } + break; + case WHEELDOWNMOUSE: + case PADPLUSKEY: + if(Trans.flag & T_PROP_EDIT) { + Trans.propsize*= 1.1f; + calculatePropRatio(&Trans); + } + else view_editmove(event); + Trans.redraw= 1; + break; + case WHEELUPMOUSE: + case PADMINUS: + if(Trans.flag & T_PROP_EDIT) { + Trans.propsize*= 0.90909090f; + calculatePropRatio(&Trans); + } + else view_editmove(event); + Trans.redraw= 1; + break; + } + Trans.redraw |= handleNumInput(&(Trans.num), event); + arrows_move_cursor(event); + } + else { + switch (event){ + /* no redraw on release modifier keys! this makes sure you can assign the 'grid' still + after releasing modifer key */ + case MIDDLEMOUSE: + if ((Trans.flag & T_NO_CONSTRAINT)==0) { + Trans.flag &= ~T_MMB_PRESSED; + postSelectConstraint(&Trans); + Trans.redraw = 1; + } + break; + case LEFTMOUSE: + case RIGHTMOUSE: + /* commented out, doesn't work for actions started with menu */ + // Trans.state = TRANS_CONFIRM; + break; + case LEFTSHIFTKEY: + case RIGHTSHIFTKEY: + /* shift is modifier for higher resolution transform */ + Trans.flag &= ~T_SHIFT_MOD; + break; + } + } +} + +void initTransform(int mode, int context) { /* added initialize, for external calls to set stuff in TransInfo, like undo string */ if(Trans.mode==TFM_INIT) memset(&Trans, 0, sizeof(TransInfo)); - Mat3One(mati); + + Trans.state = TRANS_RUNNING; /* stupid PET initialisation code */ /* START */ @@ -261,16 +462,6 @@ void Transform(int mode, int context) return; } - /* CHECKING FOR CTX_SETLOCALCONST CONTEXT FLAG */ - /* EVIL, best would be to split off init, this way all the external constraint call could work like that: - initTransform(mode) - initconstraint(setup) - Transform() - */ - if (Trans.context & CTX_SETLOCALCONST) { - setLocalConstraint(&Trans, Trans.con.mode, Trans.con.text); - } - /* EVIL! posemode code can switch translation to rotate when 1 bone is selected. will be removed (ton) */ /* EVIL2: we gave as argument also texture space context bit... was cleared */ mode= Trans.mode; @@ -315,6 +506,15 @@ void Transform(int mode, int context) } initConstraint(&Trans); +} + +void Transform() +{ + float mati[3][3]; + short pmval[2] = {0, 0}, mval[2], val; + unsigned short event; + + Mat3One(mati); // Emptying event queue while( qtest() ) { @@ -323,12 +523,12 @@ void Transform(int mode, int context) Trans.redraw = 1; - while (ret_val == 0) { + while (Trans.state == TRANS_RUNNING) { getmouseco_areawin(mval); if (mval[0] != pmval[0] || mval[1] != pmval[1]) { - if (mmb_press) { + if (Trans.flag & T_MMB_PRESSED) { initSelectConstraint(&Trans, mati); } Trans.redraw = 1; @@ -349,228 +549,13 @@ void Transform(int mode, int context) while( qtest() ) { event= extern_qread(&val); - - if (val) { - switch (event){ - /* enforce redraw of transform when modifiers are used */ - case LEFTCTRLKEY: - case RIGHTCTRLKEY: - Trans.redraw = 1; - break; - case LEFTSHIFTKEY: - case RIGHTSHIFTKEY: - /* shift is modifier for higher resolution transform, works nice to store this mouse position */ - getmouseco_areawin(Trans.shiftmval); - Trans.flag |= T_SHIFT_MOD; - Trans.redraw = 1; - break; - - case MIDDLEMOUSE: - if ((Trans.flag & T_NO_CONSTRAINT)==0) { - /* exception for switching to dolly, or trackball, in camera view */ - if (Trans.flag & T_CAMERA) { - if (Trans.mode==TFM_TRANSLATION) - setLocalConstraint(&Trans, (CON_AXIS2), "along local Z"); - else if (Trans.mode==TFM_ROTATION) { - restoreTransObjects(&Trans); - initTransModeFlags(&Trans, TFM_TRACKBALL); - initTrackball(&Trans); - } - } - else { - mmb_press = 1; - if (Trans.con.mode & CON_APPLY) { - stopConstraint(&Trans); - } - else { - initSelectConstraint(&Trans, mati); - postSelectConstraint(&Trans); - } - } - Trans.redraw = 1; - } - break; - case ESCKEY: - case RIGHTMOUSE: - ret_val = TRANS_CANCEL; - break; - case LEFTMOUSE: - case SPACEKEY: - case PADENTER: - case RETKEY: - ret_val = TRANS_CONFIRM; - break; - case GKEY: - restoreTransObjects(&Trans); - initTransModeFlags(&Trans, TFM_TRANSLATION); - initTranslation(&Trans); - Trans.redraw = 1; - break; - case SKEY: - restoreTransObjects(&Trans); - initTransModeFlags(&Trans, TFM_RESIZE); - initResize(&Trans); - Trans.redraw = 1; - break; - case RKEY: - if (Trans.mode == TFM_ROTATION) { - restoreTransObjects(&Trans); - initTransModeFlags(&Trans, TFM_TRACKBALL); - initTrackball(&Trans); - } - else { - restoreTransObjects(&Trans); - initTransModeFlags(&Trans, TFM_ROTATION); - initRotation(&Trans); - } - Trans.redraw = 1; - break; - case CKEY: - if (G.qual & LR_ALTKEY) { - Trans.flag ^= T_PROP_CONNECTED; - sort_trans_data_dist(&Trans); - calculatePropRatio(&Trans); - Trans.redraw= 1; - } - else { - cmode = '\0'; - stopConstraint(&Trans); - Trans.redraw = 1; - } - break; - case XKEY: - if ((Trans.flag & T_NO_CONSTRAINT)==0) { - if (cmode == 'X') { - stopConstraint(&Trans); - cmode = '\0'; - } - else if(cmode == 'x') { - if (G.qual == 0) - setLocalConstraint(&Trans, (CON_AXIS0), "along local X"); - else if (G.qual == LR_SHIFTKEY) - setLocalConstraint(&Trans, (CON_AXIS1|CON_AXIS2), "locking local X"); - - cmode = 'X'; - } - else { - if (G.qual == 0) - setConstraint(&Trans, mati, (CON_AXIS0), "along global X"); - else if (G.qual == LR_SHIFTKEY) - setConstraint(&Trans, mati, (CON_AXIS1|CON_AXIS2), "locking global X"); - - cmode = 'x'; - } - Trans.redraw = 1; - } - break; - case YKEY: - if ((Trans.flag & T_NO_CONSTRAINT)==0) { - if (cmode == 'Y') { - stopConstraint(&Trans); - cmode = '\0'; - } - else if(cmode == 'y') { - if (G.qual == 0) - setLocalConstraint(&Trans, (CON_AXIS1), "along local Y"); - else if (G.qual == LR_SHIFTKEY) - setLocalConstraint(&Trans, (CON_AXIS0|CON_AXIS2), "locking local Y"); - - cmode = 'Y'; - } - else { - if (G.qual == 0) - setConstraint(&Trans, mati, (CON_AXIS1), "along global Y"); - else if (G.qual == LR_SHIFTKEY) - setConstraint(&Trans, mati, (CON_AXIS0|CON_AXIS2), "locking global Y"); - - cmode = 'y'; - } - Trans.redraw = 1; - } - break; - case ZKEY: - if ((Trans.flag & T_NO_CONSTRAINT)==0) { - if (cmode == 'Z') { - stopConstraint(&Trans); - cmode = '\0'; - } - else if(cmode == 'z') { - if (G.qual == 0) - setLocalConstraint(&Trans, (CON_AXIS2), "along local Z"); - else if (G.qual == LR_SHIFTKEY) - setLocalConstraint(&Trans, (CON_AXIS0|CON_AXIS1), "locking local Z"); - - cmode = 'Z'; - } - else { - if (G.qual == 0) - setConstraint(&Trans, mati, (CON_AXIS2), "along global Z"); - else if (G.qual == LR_SHIFTKEY) - setConstraint(&Trans, mati, (CON_AXIS0|CON_AXIS1), "locking global Z"); - - cmode = 'z'; - } - Trans.redraw = 1; - } - break; - case OKEY: - if (Trans.flag & T_PROP_EDIT && G.qual==LR_SHIFTKEY) { - G.scene->prop_mode = (G.scene->prop_mode+1)%6; - calculatePropRatio(&Trans); - Trans.redraw= 1; - } - break; - case WHEELDOWNMOUSE: - case PADPLUSKEY: - if(Trans.flag & T_PROP_EDIT) { - Trans.propsize*= 1.1f; - calculatePropRatio(&Trans); - } - else view_editmove(event); - Trans.redraw= 1; - break; - case WHEELUPMOUSE: - case PADMINUS: - if(Trans.flag & T_PROP_EDIT) { - Trans.propsize*= 0.90909090f; - calculatePropRatio(&Trans); - } - else view_editmove(event); - Trans.redraw= 1; - break; - } - Trans.redraw |= handleNumInput(&(Trans.num), event); - arrows_move_cursor(event); - } - else { - switch (event){ - /* no redraw on release modifier keys! this makes sure you can assign the 'grid' still - after releasing modifer key */ - case MIDDLEMOUSE: - if ((Trans.flag & T_NO_CONSTRAINT)==0) { - mmb_press = 0; - postSelectConstraint(&Trans); - Trans.redraw = 1; - } - break; - case LEFTMOUSE: - case RIGHTMOUSE: - /* commented out, doesn't work for actions started with menu */ - // ret_val = TRANS_CONFIRM; - break; - case LEFTSHIFTKEY: - case RIGHTSHIFTKEY: - /* shift is modifier for higher resolution transform */ - Trans.flag &= ~T_SHIFT_MOD; - break; - } - } + transformEvent(event, val); } } /* handle restoring objects and Undo */ - if(ret_val == TRANS_CANCEL) { + if(Trans.state == TRANS_CANCEL) { restoreTransObjects(&Trans); if(Trans.undostr) BIF_undo_push(Trans.undostr); } @@ -587,11 +572,11 @@ void Transform(int mode, int context) { char cmode='g'; - if(mode==TFM_RESIZE) cmode= 's'; - else if(mode==TFM_ROTATION) cmode= 'r'; + if(Trans.mode==TFM_RESIZE) cmode= 's'; + else if(Trans.mode==TFM_ROTATION) cmode= 'r'; /* aftertrans does displists, ipos and action channels */ /* 7 = keyflags, meaning do loc/rot/scale ipos. Not sure if I like the old method to detect what changed (ton) */ - special_aftertrans_update(cmode, 0, (short)(ret_val == TRANS_CANCEL), 7); + special_aftertrans_update(cmode, 0, (short)(Trans.state == TRANS_CANCEL), 7); if(G.obedit==NULL && G.obpose==NULL) clear_trans_object_base_flags(); @@ -605,13 +590,15 @@ void Transform(int mode, int context) void ManipulatorTransform(int mode) { - int ret_val = 0, mouse_moved = 0; + int mouse_moved = 0; short pmval[2] = {0, 0}, mval[2], val; unsigned short event; /* added initialize, for external calls to set stuff in TransInfo, like undo string */ if(Trans.mode==TFM_INIT) memset(&Trans, 0, sizeof(TransInfo)); - + + Trans.state = TRANS_RUNNING; + /* stupid PET initialisation code */ /* START */ if (Trans.propsize == 0.0f) { @@ -658,7 +645,7 @@ void ManipulatorTransform(int mode) Trans.flag |= T_USES_MANIPULATOR; Trans.redraw = 1; - while (ret_val == 0) { + while (Trans.state == TRANS_RUNNING) { getmouseco_areawin(mval); @@ -705,7 +692,7 @@ void ManipulatorTransform(int mode) case ESCKEY: case RIGHTMOUSE: - ret_val = TRANS_CANCEL; + Trans.state = TRANS_CANCEL; break; case LEFTMOUSE: if(mouse_moved==0 && val==0) break; @@ -713,7 +700,7 @@ void ManipulatorTransform(int mode) case SPACEKEY: case PADENTER: case RETKEY: - ret_val = TRANS_CONFIRM; + Trans.state = TRANS_CONFIRM; break; } if(val) { @@ -739,7 +726,7 @@ void ManipulatorTransform(int mode) } } - if(ret_val == TRANS_CANCEL) { + if(Trans.state == TRANS_CANCEL) { restoreTransObjects(&Trans); } else { @@ -757,7 +744,7 @@ void ManipulatorTransform(int mode) else if(mode==TFM_ROTATION) cmode= 'r'; /* aftertrans does displists, ipos and action channels */ /* 7 = keyflags, meaning do loc/rot/scale ipos. Not sure if I like the old method to detect what changed (ton) */ - special_aftertrans_update(cmode, 0, (short)(ret_val == TRANS_CANCEL), 7); + special_aftertrans_update(cmode, 0, (short)(Trans.state == TRANS_CANCEL), 7); if(G.obedit==NULL && G.obpose==NULL) clear_trans_object_base_flags(); diff --git a/source/blender/src/transform_constraints.c b/source/blender/src/transform_constraints.c index fbcff3e7ef8..9ffce8f3544 100755 --- a/source/blender/src/transform_constraints.c +++ b/source/blender/src/transform_constraints.c @@ -552,17 +552,15 @@ void setConstraint(TransInfo *t, float space[3][3], int mode, const char text[]) void BIF_setLocalAxisConstraint(char axis, char *text) { TransInfo *t = BIF_GetTransInfo(); - strncpy(t->con.text, text, 48); - switch (axis) { case 'X': - t->con.mode = (CON_AXIS0|CON_APPLY); + setLocalConstraint(t, CON_AXIS0, text); break; case 'Y': - t->con.mode = (CON_AXIS1|CON_APPLY); + setLocalConstraint(t, CON_AXIS1, text); break; case 'Z': - t->con.mode = (CON_AXIS2|CON_APPLY); + setLocalConstraint(t, CON_AXIS2, text); break; } } @@ -570,17 +568,15 @@ void BIF_setLocalAxisConstraint(char axis, char *text) { void BIF_setLocalLockConstraint(char axis, char *text) { TransInfo *t = BIF_GetTransInfo(); - strncpy(t->con.text, text, 48); - switch (axis) { case 'x': - t->con.mode = (CON_AXIS1|CON_AXIS2|CON_APPLY); + setLocalConstraint(t, (CON_AXIS1|CON_AXIS2), text); break; case 'y': - t->con.mode = (CON_AXIS0|CON_AXIS2|CON_APPLY); + setLocalConstraint(t, (CON_AXIS0|CON_AXIS2), text); break; case 'z': - t->con.mode = (CON_AXIS0|CON_AXIS1|CON_APPLY); + setLocalConstraint(t, (CON_AXIS0|CON_AXIS1), text); break; } } @@ -589,11 +585,11 @@ void setLocalConstraint(TransInfo *t, int mode, const char text[]) { if (t->flag & T_EDIT) { float obmat[3][3]; Mat3CpyMat4(obmat, G.obedit->obmat); - setConstraint(t, obmat, mode, text); + setConstraint(t, obmat, mode|CON_LOCAL, text); } else { if (t->total == 1) { - setConstraint(t, t->data->axismtx, mode, text); + setConstraint(t, t->data->axismtx, mode|CON_LOCAL, text); } else { strncpy(t->con.text + 1, text, 48); @@ -627,8 +623,6 @@ void BIF_setSingleAxisConstraint(float vec[3], char *text) { Crossf(space[2], vec, space[1]); Mat3Ortho(space); - Mat3Ortho(space); - Mat3CpyMat3(t->con.mtx, space); t->con.mode = (CON_AXIS0|CON_APPLY); getConstraintMatrix(t); @@ -796,6 +790,7 @@ void initSelectConstraint(TransInfo *t, float mtx[3][3]) Mat3CpyMat3(t->con.mtx, mtx); t->con.mode |= CON_APPLY; t->con.mode |= CON_SELECT; + t->con.mode &= ~CON_LOCAL; setNearestAxis(t); t->con.drawExtra = NULL; @@ -893,3 +888,22 @@ void setNearestAxis(TransInfo *t) } getConstraintMatrix(t); } + +char constraintModeToChar(TransInfo *t) { + if ((t->con.mode & CON_APPLY)==0) { + return '\0'; + } + switch (t->con.mode & (CON_AXIS0|CON_AXIS1|CON_AXIS2)) { + case (CON_AXIS0): + case (CON_AXIS1|CON_AXIS2): + return 'X'; + case (CON_AXIS1): + case (CON_AXIS0|CON_AXIS2): + return 'Y'; + case (CON_AXIS2): + case (CON_AXIS0|CON_AXIS1): + return 'Z'; + default: + return '\0'; + } +} |