Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xsource/blender/include/BIF_transform.h5
-rwxr-xr-xsource/blender/include/transform.h11
-rw-r--r--source/blender/src/editarmature.c6
-rw-r--r--source/blender/src/editcurve.c9
-rw-r--r--source/blender/src/editmball.c3
-rw-r--r--source/blender/src/editmesh_add.c3
-rw-r--r--source/blender/src/editmesh_tools.c6
-rw-r--r--source/blender/src/editobject.c24
-rw-r--r--source/blender/src/editview.c15
-rw-r--r--source/blender/src/header_view3d.c108
-rw-r--r--source/blender/src/space.c69
-rw-r--r--source/blender/src/toolbox.c18
-rwxr-xr-xsource/blender/src/transform.c491
-rwxr-xr-xsource/blender/src/transform_constraints.c42
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';
+ }
+}