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:
Diffstat (limited to 'source/blender/src/transform.c')
-rwxr-xr-xsource/blender/src/transform.c357
1 files changed, 264 insertions, 93 deletions
diff --git a/source/blender/src/transform.c b/source/blender/src/transform.c
index 53d55c7b772..4d540159816 100755
--- a/source/blender/src/transform.c
+++ b/source/blender/src/transform.c
@@ -60,6 +60,7 @@
#include "DNA_texture_types.h"
#include "DNA_userdef_types.h"
#include "DNA_view3d_types.h"
+#include "DNA_space_types.h"
#include "BIF_editview.h" /* arrows_move_cursor */
#include "BIF_gl.h"
@@ -71,6 +72,8 @@
#include "BIF_mywindow.h" /* warp_pointer */
#include "BIF_toolbox.h" /* notice */
#include "BIF_editmesh.h"
+#include "BIF_editsima.h"
+#include "BIF_drawimage.h" /* uvco_to_areaco_noclip */
#include "BKE_global.h"
#include "BKE_utildefines.h"
@@ -116,7 +119,7 @@ static void helpline(TransInfo *t, float *vec)
}
getmouseco_areawin(mval);
- project_float(vecrot, cent); // no overflow in extreme cases
+ projectFloatView(t, vecrot, cent); // no overflow in extreme cases
if(cent[0]!=IS_CLIPPED) {
persp(PERSP_WIN);
@@ -161,7 +164,7 @@ float InputScaleRatio(TransInfo *t, short mval[2]) {
float InputHorizontalRatio(TransInfo *t, short mval[2]) {
int y, pad;
- pad = G.vd->area->winx / 10;
+ pad = curarea->winx / 10;
if (t->flag & T_SHIFT_MOD) {
/* deal with Shift key by adding motion / 10 to motion before shift press */
@@ -170,7 +173,143 @@ float InputHorizontalRatio(TransInfo *t, short mval[2]) {
else {
y = mval[0];
}
- return (float)(y - pad) / (float)(G.vd->area->winx - 2 * pad);
+ return (float)(y - pad) / (float)(curarea->winx - 2 * pad);
+}
+
+/* ************************** SPACE DEPENDANT CODE **************************** */
+
+void setTransformViewMatrices(TransInfo *t)
+{
+ if(t->spacetype==SPACE_VIEW3D) {
+ Mat4CpyMat4(t->viewmat, G.vd->viewmat);
+ Mat4CpyMat4(t->viewinv, G.vd->viewinv);
+ Mat4CpyMat4(t->persmat, G.vd->persmat);
+ Mat4CpyMat4(t->persinv, G.vd->persinv);
+ t->persp= G.vd->persp;
+ }
+ else {
+ Mat4One(t->viewmat);
+ Mat4One(t->viewinv);
+ Mat4One(t->persmat);
+ Mat4One(t->persinv);
+ t->persp = 0; // ortho
+ }
+}
+
+void convertViewVec(TransInfo *t, float *vec, short dx, short dy)
+{
+ if (t->spacetype==SPACE_VIEW3D)
+ window_to_3d(vec, dx, dy);
+ else if(t->spacetype==SPACE_IMAGE) {
+ float divx, divy, aspx, aspy;
+
+ transform_aspect_ratio_tface_uv(&aspx, &aspy);
+
+ divx= G.v2d->mask.xmax-G.v2d->mask.xmin;
+ divy= G.v2d->mask.ymax-G.v2d->mask.ymin;
+
+ vec[0]= aspx*(G.v2d->cur.xmax-G.v2d->cur.xmin)*(dx)/divx;
+ vec[1]= aspy*(G.v2d->cur.ymax-G.v2d->cur.ymin)*(dy)/divy;
+ vec[2]= 0.0f;
+ }
+}
+
+void projectIntView(TransInfo *t, float *vec, int *adr)
+{
+ if (t->spacetype==SPACE_VIEW3D)
+ project_int(vec, adr);
+ else if(t->spacetype==SPACE_IMAGE) {
+ float aspx, aspy, v[2];
+
+ transform_aspect_ratio_tface_uv(&aspx, &aspy);
+ v[0]= vec[0]/aspx;
+ v[1]= vec[1]/aspy;
+
+ uvco_to_areaco_noclip(v, adr);
+ }
+}
+
+void projectFloatView(TransInfo *t, float *vec, float *adr)
+{
+ if (t->spacetype==SPACE_VIEW3D)
+ project_float(vec, adr);
+ else if(t->spacetype==SPACE_IMAGE) {
+ int a[2];
+
+ projectIntView(t, vec, a);
+ adr[0]= a[0];
+ adr[1]= a[1];
+ }
+}
+
+void convertVecToDisplayNum(float *vec, float *num)
+{
+ TransInfo *t= BIF_GetTransInfo();
+
+ VECCOPY(num, vec);
+
+ if ((t->spacetype==SPACE_IMAGE) && (t->mode==TFM_TRANSLATION)) {
+ float aspx, aspy;
+
+ if((G.sima->flag & SI_COORDFLOATS)==0) {
+ int width, height;
+ transform_width_height_tface_uv(&width, &height);
+
+ num[0] *= width;
+ num[1] *= height;
+ }
+
+ transform_aspect_ratio_tface_uv(&aspx, &aspy);
+ num[0] /= aspx;
+ num[1] /= aspy;
+ }
+}
+
+void convertDisplayNumToVec(float *num, float *vec)
+{
+ TransInfo *t= BIF_GetTransInfo();
+
+ VECCOPY(vec, num);
+
+ if ((t->spacetype==SPACE_IMAGE) && (t->mode==TFM_TRANSLATION)) {
+ float aspx, aspy;
+
+ if((G.sima->flag & SI_COORDFLOATS)==0) {
+ int width, height;
+ transform_width_height_tface_uv(&width, &height);
+
+ vec[0] /= width;
+ vec[1] /= height;
+ }
+
+ transform_aspect_ratio_tface_uv(&aspx, &aspy);
+ vec[0] *= aspx;
+ vec[1] *= aspy;
+ }
+}
+
+static void viewRedrawForce(TransInfo *t)
+{
+ if(t->spacetype==SPACE_VIEW3D)
+ force_draw(0);
+ else if(t->spacetype==SPACE_IMAGE) {
+ if(G.sima->lock) force_draw_plus(SPACE_VIEW3D, 0);
+ else force_draw(0);
+ }
+}
+
+static void viewRedrawPost(TransInfo *t)
+{
+ if(t->spacetype==SPACE_VIEW3D) {
+ allqueue(REDRAWBUTSOBJECT, 0);
+ allqueue(REDRAWVIEW3D, 0);
+ }
+ else if(t->spacetype==SPACE_IMAGE) {
+ allqueue(REDRAWIMAGE, 0);
+ allqueue(REDRAWVIEW3D, 0);
+ }
+
+ scrarea_queue_headredraw(curarea);
}
/* ************************** TRANSFORMATIONS **************************** */
@@ -247,11 +386,8 @@ static void view_editmove(unsigned short event)
break;
}
- if (refresh) {
- Mat4CpyMat4(Trans.viewmat, G.vd->viewmat);
- Mat4CpyMat4(Trans.viewinv, G.vd->viewinv);
- Mat4CpyMat4(Trans.persinv, G.vd->persinv);
- }
+ if (refresh)
+ setTransformViewMatrices(&Trans);
}
void checkFirstTime() {
@@ -316,7 +452,7 @@ static void transformEvent(unsigned short event, short val) {
break;
case SPACEKEY:
- if (G.qual & LR_ALTKEY) {
+ if ((Trans.spacetype==SPACE_VIEW3D) && (G.qual & LR_ALTKEY)) {
short mval[2];
getmouseco_sc(mval);
@@ -421,14 +557,14 @@ static void transformEvent(unsigned short event, short val) {
else {
if (G.qual == 0)
setUserConstraint(&Trans, (CON_AXIS0), "along %s X");
- else if (G.qual == LR_SHIFTKEY)
+ else if ((G.qual == LR_SHIFTKEY) && ((Trans.flag & T_2D_EDIT)==0))
setUserConstraint(&Trans, (CON_AXIS1|CON_AXIS2), "locking %s X");
}
}
else {
if (G.qual == 0)
setConstraint(&Trans, mati, (CON_AXIS0), "along global X");
- else if (G.qual == LR_SHIFTKEY)
+ else if ((G.qual == LR_SHIFTKEY) && ((Trans.flag & T_2D_EDIT)==0))
setConstraint(&Trans, mati, (CON_AXIS1|CON_AXIS2), "locking global X");
}
Trans.redraw = 1;
@@ -443,14 +579,14 @@ static void transformEvent(unsigned short event, short val) {
else {
if (G.qual == 0)
setUserConstraint(&Trans, (CON_AXIS1), "along %s Y");
- else if (G.qual == LR_SHIFTKEY)
+ else if ((G.qual == LR_SHIFTKEY) && ((Trans.flag & T_2D_EDIT)==0))
setUserConstraint(&Trans, (CON_AXIS0|CON_AXIS2), "locking %s Y");
}
}
else {
if (G.qual == 0)
setConstraint(&Trans, mati, (CON_AXIS1), "along global Y");
- else if (G.qual == LR_SHIFTKEY)
+ else if ((G.qual == LR_SHIFTKEY) && ((Trans.flag & T_2D_EDIT)==0))
setConstraint(&Trans, mati, (CON_AXIS0|CON_AXIS2), "locking global Y");
}
Trans.redraw = 1;
@@ -465,11 +601,11 @@ static void transformEvent(unsigned short event, short val) {
else {
if (G.qual == 0)
setUserConstraint(&Trans, (CON_AXIS2), "along %s Z");
- else if (G.qual == LR_SHIFTKEY)
+ else if ((G.qual == LR_SHIFTKEY) && ((Trans.flag & T_2D_EDIT)==0))
setUserConstraint(&Trans, (CON_AXIS0|CON_AXIS1), "locking %s Z");
}
}
- else {
+ else if ((Trans.flag & T_2D_EDIT)==0) {
if (G.qual == 0)
setConstraint(&Trans, mati, (CON_AXIS2), "along global Z");
else if (G.qual == LR_SHIFTKEY)
@@ -554,11 +690,15 @@ void initTransform(int mode, int context) {
Trans.context = context;
- calc_manipulator_stats(curarea);
- Mat3CpyMat4(Trans.spacemtx, G.vd->twmat);
-
initTrans(&Trans); // internal data, mouse, vectors
+ if(Trans.spacetype==SPACE_VIEW3D) {
+ calc_manipulator_stats(curarea);
+ Mat3CpyMat4(Trans.spacemtx, G.vd->twmat);
+ }
+ else
+ Mat3One(Trans.spacemtx);
+
initTransModeFlags(&Trans, mode); // modal settings in struct Trans
createTransData(&Trans); // make TransData structs from selection
@@ -687,9 +827,7 @@ void Transform()
special_aftertrans_update(&Trans);
/* send events out for redraws */
- allqueue(REDRAWVIEW3D, 0);
- allqueue(REDRAWBUTSOBJECT, 0);
- scrarea_queue_headredraw(curarea);
+ viewRedrawPost(&Trans);
}
/* ************************** Manipulator init and main **************************** */
@@ -848,9 +986,7 @@ void ManipulatorTransform()
special_aftertrans_update(&Trans);
/* send events out for redraws */
- allqueue(REDRAWVIEW3D, 0);
- allqueue(REDRAWBUTSOBJECT, 0);
- scrarea_queue_headredraw(curarea);
+ viewRedrawPost(&Trans);
}
/* ************************** TRANSFORMATIONS **************************** */
@@ -878,8 +1014,8 @@ void initWarp(TransInfo *t)
float center[3];
VECCOPY(center, t->data[i].center);
Mat3MulVecfl(t->data[i].mtx, center);
- Mat4MulVecfl(G.vd->viewmat, center);
- VecSubf(center, center, G.vd->viewmat[3]);
+ Mat4MulVecfl(t->viewmat, center);
+ VecSubf(center, center, t->viewmat[3]);
if (i)
MinMax3(min, max, center);
else {
@@ -921,8 +1057,8 @@ int Warp(TransInfo *t, short mval[2])
VecSubf(gcursor, gcursor, G.obedit->obmat[3]);
Mat3MulVecfl(t->data->smtx, gcursor);
}
- Mat4MulVecfl(G.vd->viewmat, cursor);
- VecSubf(cursor, cursor, G.vd->viewmat[3]);
+ Mat4MulVecfl(t->viewmat, cursor);
+ VecSubf(cursor, cursor, t->viewmat[3]);
// amount of degrees for warp, 450 = allow to create 360 degree warp
circumfac= 450.0f*(mval[1] - t->imval[1]) / (float)(curarea->winy);
@@ -955,8 +1091,8 @@ int Warp(TransInfo *t, short mval[2])
VECCOPY(vec, td->iloc);
Mat3MulVecfl(td->mtx, vec);
- Mat4MulVecfl(G.vd->viewmat, vec);
- VecSubf(vec, vec, G.vd->viewmat[3]);
+ Mat4MulVecfl(t->viewmat, vec);
+ VecSubf(vec, vec, t->viewmat[3]);
dist= vec[0]-cursor[0];
@@ -970,8 +1106,8 @@ int Warp(TransInfo *t, short mval[2])
loc[1]= co*vec[1]+cursor[1];
loc[2]= vec[2];
- Mat4MulVecfl(G.vd->viewinv, loc);
- VecSubf(loc, loc, G.vd->viewinv[3]);
+ Mat4MulVecfl(t->viewinv, loc);
+ VecSubf(loc, loc, t->viewinv[3]);
Mat3MulVecfl(td->smtx, loc);
VecSubf(loc, loc, td->iloc);
@@ -983,7 +1119,7 @@ int Warp(TransInfo *t, short mval[2])
headerprint(str);
- force_draw(0);
+ viewRedrawForce(t);
helpline(t, gcursor);
@@ -1012,7 +1148,7 @@ int Shear(TransInfo *t, short mval[2])
int i;
char str[50];
- Mat3CpyMat4(persmat, G.vd->viewmat);
+ Mat3CpyMat4(persmat, t->viewmat);
Mat3Inv(persinv, persmat);
value = -0.005f * ((float)(t->center2d[0] - mval[0]) - t->fac);
@@ -1067,7 +1203,7 @@ int Shear(TransInfo *t, short mval[2])
headerprint(str);
- force_draw(0);
+ viewRedrawForce(t);
helpline (t, t->center);
@@ -1119,7 +1255,10 @@ static void headerResize(TransInfo *t, float vec[3], char *str) {
}
}
else {
- sprintf(str, "Size X: %s Y: %s Z: %s%s %s", &tvec[0], &tvec[20], &tvec[40], t->con.text, t->proptext);
+ if (t->flag & T_2D_EDIT)
+ sprintf(str, "Size X: %s Y: %s%s %s", &tvec[0], &tvec[20], t->con.text, t->proptext);
+ else
+ sprintf(str, "Size X: %s Y: %s Z: %s%s %s", &tvec[0], &tvec[20], &tvec[40], t->con.text, t->proptext);
}
}
@@ -1162,7 +1301,7 @@ static void ElementResize(TransInfo *t, TransData *td, float mat[3][3]) {
}
/* local constraint shouldn't alter center */
- if (G.vd->around == V3D_LOCAL) {
+ if (t->around == V3D_LOCAL) {
if (t->flag & T_OBJECT) {
VECCOPY(center, td->center); // not supported in editmode yet
}
@@ -1189,7 +1328,7 @@ static void ElementResize(TransInfo *t, TransData *td, float mat[3][3]) {
Mat3ToSize(tmat, fsize);
}
- if ((G.vd->flag & V3D_ALIGN)==0) { // align mode doesn't rotate objects itself
+ if ((t->flag & T_V3D_ALIGN)==0) { // align mode doesn't rotate objects itself
/* handle ipokeys? */
if(td->tdi) {
TransDataIpokey *tdi= td->tdi;
@@ -1224,7 +1363,7 @@ static void ElementResize(TransInfo *t, TransData *td, float mat[3][3]) {
}
}
/* For individual element center, Editmode need to use iloc */
- if (t->flag & T_EDIT)
+ if (t->flag & T_POINTS)
VecSubf(vec, td->iloc, center);
else
VecSubf(vec, td->center, center);
@@ -1232,7 +1371,7 @@ static void ElementResize(TransInfo *t, TransData *td, float mat[3][3]) {
Mat3MulVecfl(tmat, vec);
VecAddf(vec, vec, center);
- if (t->flag & T_EDIT)
+ if (t->flag & T_POINTS)
VecSubf(vec, vec, td->iloc);
else
VecSubf(vec, vec, td->center);
@@ -1254,7 +1393,7 @@ static void ElementResize(TransInfo *t, TransData *td, float mat[3][3]) {
int Resize(TransInfo *t, short mval[2])
{
- TransData *td = t->data;
+ TransData *td;
float size[3], mat[3][3];
float ratio;
int i;
@@ -1292,18 +1431,29 @@ int Resize(TransInfo *t, short mval[2])
headerResize(t, size, str);
- for(i = 0 ; i < t->total; i++, td++) {
+ for(i = 0, td=t->data; i < t->total; i++, td++) {
if (td->flag & TD_NOACTION)
break;
ElementResize(t, td, mat);
}
+ /* evil hack - redo resize if cliiping needeed */
+ if (t->flag & T_CLIP_UV && clipUVTransform(t, size, 1)) {
+ SizeToMat3(size, mat);
+
+ if (t->con.applySize)
+ t->con.applySize(t, NULL, mat);
+
+ for(i = 0, td=t->data; i < t->total; i++, td++)
+ ElementResize(t, td, mat);
+ }
+
recalcData(t);
headerprint(str);
- force_draw(0);
+ viewRedrawForce(t);
if(!(t->flag & T_USES_MANIPULATOR)) helpline (t, t->center);
@@ -1387,7 +1537,7 @@ int ToSphere(TransInfo *t, short mval[2])
headerprint(str);
- force_draw(0);
+ viewRedrawForce(t);
return 1;
}
@@ -1410,7 +1560,7 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3]) {
float vec[3], totmat[3][3], smat[3][3];
float eul[3], fmat[3][3], quat[4];
- if (t->flag & T_EDIT) {
+ if (t->flag & T_POINTS) {
Mat3MulMat3(totmat, mat, td->mtx);
Mat3MulMat3(smat, td->smtx, totmat);
@@ -1434,7 +1584,7 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3]) {
/* vec now is the location where the object has to be */
VecSubf(vec, vec, td->center);
Mat3MulVecfl(td->smtx, vec);
-
+
if(td->tdi) {
TransDataIpokey *tdi= td->tdi;
add_tdi_poin(tdi->locx, tdi->oldloc, vec[0]);
@@ -1442,13 +1592,13 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3]) {
add_tdi_poin(tdi->locz, tdi->oldloc+2, vec[2]);
}
else VecAddf(td->loc, td->iloc, vec);
-
+
if(td->flag & TD_USEQUAT) {
Mat3MulSerie(fmat, td->mtx, mat, td->smtx, 0, 0, 0, 0, 0);
Mat3ToQuat(fmat, quat); // Actual transform
QuatMul(td->ext->quat, quat, td->ext->iquat);
}
- else if ((G.vd->flag & V3D_ALIGN)==0) { // align mode doesn't rotate objects itself
+ else if ((t->flag & T_V3D_ALIGN)==0) { // align mode doesn't rotate objects itself
float obmat[3][3];
/* are there ipo keys? */
@@ -1507,7 +1657,7 @@ static void applyRotation(TransInfo *t, float angle, float axis[3])
int i;
/* saving original center */
- if (G.vd->around == V3D_LOCAL) {
+ if (t->around == V3D_LOCAL) {
VECCOPY(center, t->center);
}
@@ -1519,7 +1669,7 @@ static void applyRotation(TransInfo *t, float angle, float axis[3])
break;
/* local constraint shouldn't alter center */
- if (G.vd->around == V3D_LOCAL) {
+ if (t->around == V3D_LOCAL) {
if (t->flag & T_OBJECT)
VECCOPY(t->center, td->center); // not supported in editmode yet
}
@@ -1536,7 +1686,7 @@ static void applyRotation(TransInfo *t, float angle, float axis[3])
}
/* restoring original center */
- if (G.vd->around == V3D_LOCAL) {
+ if (t->around == V3D_LOCAL) {
VECCOPY(t->center, center);
}
}
@@ -1623,7 +1773,7 @@ int Rotation(TransInfo *t, short mval[2])
headerprint(str);
- force_draw(0);
+ viewRedrawForce(t);
if(!(t->flag & T_USES_MANIPULATOR)) helpline (t, t->center);
@@ -1659,7 +1809,7 @@ static void applyTrackball(TransInfo *t, float axis1[3], float axis2[3], float a
if (td->flag & TD_NOACTION)
break;
- if (G.vd->around == V3D_LOCAL) {
+ if (t->around == V3D_LOCAL) {
if (t->flag & T_OBJECT)
VECCOPY(t->center, td->center); // not supported in editmode yet
}
@@ -1725,7 +1875,7 @@ int Trackball(TransInfo *t, short mval[2])
headerprint(str);
- force_draw(0);
+ viewRedrawForce(t);
if(!(t->flag & T_USES_MANIPULATOR)) helpline (t, t->center);
@@ -1736,33 +1886,49 @@ int Trackball(TransInfo *t, short mval[2])
void initTranslation(TransInfo *t)
{
- t->idx_max = 2;
- t->num.idx_max = 2;
- t->snap[0] = 0.0f;
- t->snap[1] = G.vd->gridview * 1.0f;
- t->snap[2] = t->snap[1] * 0.1f;
+ t->idx_max = (t->flag & T_2D_EDIT)? 1: 2;
+ t->num.idx_max = t->idx_max;
t->transform = Translation;
- /* initgrabz() defines a factor for perspective depth correction, used in window_to_3d() */
- if (G.obedit) {
- float vec[3];
-
- VECCOPY(vec, t->center);
- Mat4MulVecfl(G.obedit->obmat, vec);
- initgrabz(vec[0], vec[1], vec[2]);
+ if(t->spacetype == SPACE_VIEW3D) {
+ /* initgrabz() defines a factor for perspective depth correction, used in window_to_3d() */
+ if(G.obedit) {
+ float vec[3];
+
+ VECCOPY(vec, t->center);
+ Mat4MulVecfl(G.obedit->obmat, vec);
+ initgrabz(vec[0], vec[1], vec[2]);
+ }
+ else initgrabz(t->center[0], t->center[1], t->center[2]);
+
+ t->snap[0] = 0.0f;
+ t->snap[1] = G.vd->gridview * 1.0f;
+ t->snap[2] = t->snap[1] * 0.1f;
+ }
+ else if(t->spacetype == SPACE_IMAGE) {
+ t->snap[0] = 0.0f;
+ t->snap[1] = 0.125f;
+ t->snap[2] = 0.0625f;
+ }
+ else {
+ t->snap[0] = 0.0f;
+ t->snap[1] = t->snap[2] = 1.0f;
}
- else initgrabz(t->center[0], t->center[1], t->center[2]);
}
static void headerTranslation(TransInfo *t, float vec[3], char *str) {
char tvec[60];
+ float dvec[3];
+
+ convertVecToDisplayNum(vec, dvec);
+
if (hasNumInput(&t->num)) {
outputNumInput(&(t->num), tvec);
}
else {
- sprintf(&tvec[0], "%.4f", vec[0]);
- sprintf(&tvec[20], "%.4f", vec[1]);
- sprintf(&tvec[40], "%.4f", vec[2]);
+ sprintf(&tvec[0], "%.4f", dvec[0]);
+ sprintf(&tvec[20], "%.4f", dvec[1]);
+ sprintf(&tvec[40], "%.4f", dvec[2]);
}
if (t->con.mode & CON_APPLY) {
@@ -1778,7 +1944,10 @@ static void headerTranslation(TransInfo *t, float vec[3], char *str) {
}
}
else {
- sprintf(str, "Dx: %s Dy: %s Dz: %s%s %s", &tvec[0], &tvec[20], &tvec[40], t->con.text, t->proptext);
+ if(t->flag & T_2D_EDIT)
+ sprintf(str, "Dx: %s Dy: %s%s %s", &tvec[0], &tvec[20], t->con.text, t->proptext);
+ else
+ sprintf(str, "Dx: %s Dy: %s Dz: %s%s %s", &tvec[0], &tvec[20], &tvec[40], t->con.text, t->proptext);
}
}
@@ -1822,12 +1991,12 @@ int Translation(TransInfo *t, short mval[2])
if(t->flag & T_SHIFT_MOD) {
float dvec[3];
/* calculate the main translation and the precise one separate */
- window_to_3d(dvec, (short)(mval[0] - t->shiftmval[0]), (short)(mval[1] - t->shiftmval[1]));
+ convertViewVec(t, dvec, (short)(mval[0] - t->shiftmval[0]), (short)(mval[1] - t->shiftmval[1]));
VecMulf(dvec, 0.1f);
- window_to_3d(t->vec, (short)(t->shiftmval[0] - t->imval[0]), (short)(t->shiftmval[1] - t->imval[1]));
+ convertViewVec(t, t->vec, (short)(t->shiftmval[0] - t->imval[0]), (short)(t->shiftmval[1] - t->imval[1]));
VecAddf(t->vec, t->vec, dvec);
}
- else window_to_3d(t->vec, (short)(mval[0] - t->imval[0]), (short)(mval[1] - t->imval[1]));
+ else convertViewVec(t, t->vec, (short)(mval[0] - t->imval[0]), (short)(mval[1] - t->imval[1]));
if (t->con.mode & CON_APPLY) {
float pvec[3] = {0.0f, 0.0f, 0.0f};
@@ -1843,11 +2012,15 @@ int Translation(TransInfo *t, short mval[2])
applyTranslation(t, t->vec);
+ /* evil hack - redo translation if cliiping needeed */
+ if (t->flag & T_CLIP_UV && clipUVTransform(t, t->vec, 0))
+ applyTranslation(t, t->vec);
+
recalcData(t);
headerprint(str);
- force_draw(0);
+ viewRedrawForce(t);
return 1;
}
@@ -1880,9 +2053,9 @@ int ShrinkFatten(TransInfo *t, short mval[2])
char str[50];
TransData *td = t->data;
- window_to_3d(t->vec, (short)(mval[0] - t->imval[0]), (short)(mval[1] - t->imval[1]));
- Projf(vec, t->vec, G.vd->viewinv[1]);
- ratio = Inpf(G.vd->viewinv[1], vec) * -2.0f;
+ convertViewVec(t, t->vec, (short)(mval[0] - t->imval[0]), (short)(mval[1] - t->imval[1]));
+ Projf(vec, t->vec, t->viewinv[1]);
+ ratio = Inpf(t->viewinv[1], vec) * -2.0f;
snapGrid(t, &ratio);
@@ -1917,7 +2090,7 @@ int ShrinkFatten(TransInfo *t, short mval[2])
headerprint(str);
- force_draw(0);
+ viewRedrawForce(t);
return 1;
}
@@ -2002,7 +2175,7 @@ int Tilt(TransInfo *t, short mval[2])
headerprint(str);
- force_draw(0);
+ viewRedrawForce(t);
helpline (t, t->center);
@@ -2031,9 +2204,9 @@ int PushPull(TransInfo *t, short mval[2])
char str[50];
TransData *td = t->data;
- window_to_3d(t->vec, (short)(mval[0] - t->imval[0]), (short)(mval[1] - t->imval[1]));
- Projf(vec, t->vec, G.vd->viewinv[1]);
- distance = Inpf(G.vd->viewinv[1], vec) * 2.0f;
+ convertViewVec(t, t->vec, (short)(mval[0] - t->imval[0]), (short)(mval[1] - t->imval[1]));
+ Projf(vec, t->vec, t->viewinv[1]);
+ distance = Inpf(t->viewinv[1], vec) * 2.0f;
snapGrid(t, &distance);
@@ -2083,7 +2256,7 @@ int PushPull(TransInfo *t, short mval[2])
headerprint(str);
- force_draw(0);
+ viewRedrawForce(t);
return 1;
}
@@ -2174,7 +2347,7 @@ int Crease(TransInfo *t, short mval[2])
headerprint(str);
- force_draw(0);
+ viewRedrawForce(t);
helpline (t, t->center);
@@ -2190,14 +2363,14 @@ void Mirror(short mode)
float size[3];
int i;
- Mat3One(mati);
- Mat3CpyMat4(matview, G.vd->viewinv);
- Mat3Ortho(matview);
-
Trans.context = CTX_NO_PET;
initTrans(&Trans); // internal data, mouse, vectors
+ Mat3One(mati);
+ Mat3CpyMat4(matview, Trans.viewinv); // t->viewinv was set in initTrans
+ Mat3Ortho(matview);
+
initTransModeFlags(&Trans, TFM_MIRROR); // modal settings in struct Trans
createTransData(&Trans); // make TransData structs from selection
@@ -2277,9 +2450,7 @@ void Mirror(short mode)
postTrans(&Trans);
/* send events out for redraws */
- allqueue(REDRAWVIEW3D, 0);
- allqueue(REDRAWBUTSOBJECT, 0);
- scrarea_queue_headredraw(curarea);
+ viewRedrawPost(&Trans);
}
/* ******************** EditBone (B-bone) width scaling *************** */
@@ -2372,7 +2543,7 @@ int BoneSize(TransInfo *t, short mval[2])
headerprint(str);
- force_draw(0);
+ viewRedrawForce(t);
if(!(t->flag & T_USES_MANIPULATOR)) helpline (t, t->center);