diff options
author | Ton Roosendaal <ton@blender.org> | 2005-03-08 20:29:33 +0300 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2005-03-08 20:29:33 +0300 |
commit | 8eef3cfd9c36f3e442885cf46a6ca0365efcfdeb (patch) | |
tree | 0381fe21036da144178b79c943e16893fb0ee82c /source | |
parent | 81ea38cd10d391eebce2f8629f9a93fd097e72b2 (diff) |
New transform project;
- restored 'Warp' (Shift+W). Should work like before, including type mode
and holding ctrl/shift modifiers
- added CTRL event in queue, to only redraw when you press it. looks nicer.
Diffstat (limited to 'source')
-rwxr-xr-x | source/blender/include/BIF_transform.h | 1 | ||||
-rw-r--r-- | source/blender/src/space.c | 4 | ||||
-rwxr-xr-x | source/blender/src/transform.c | 127 | ||||
-rwxr-xr-x | source/blender/src/transform.h | 4 |
4 files changed, 115 insertions, 21 deletions
diff --git a/source/blender/include/BIF_transform.h b/source/blender/include/BIF_transform.h index 415287166a4..d79753a71f8 100755 --- a/source/blender/include/BIF_transform.h +++ b/source/blender/include/BIF_transform.h @@ -45,6 +45,7 @@ #define TFM_TOSPHERE 4 #define TFM_SHEAR 5 #define TFM_LAMP_ENERGY 6 +#define TFM_WARP 7 // not sure if adding modes is the right way... context detecting could be done different (ton) #define TFM_TEX 32 diff --git a/source/blender/src/space.c b/source/blender/src/space.c index 0ec8b143353..67fa0819240 100644 --- a/source/blender/src/space.c +++ b/source/blender/src/space.c @@ -1613,7 +1613,11 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt) break; case WKEY: if((G.qual==LR_SHIFTKEY)) { +#ifdef NEWTRANSFORM + if(G.obedit) Transform(TFM_WARP); +#else transform('w'); +#endif } else if(G.qual==LR_ALTKEY) { /* if(G.obedit && G.obedit->type==OB_MESH) write_videoscape(); */ diff --git a/source/blender/src/transform.c b/source/blender/src/transform.c index df53adcaa96..fb74b90764b 100755 --- a/source/blender/src/transform.c +++ b/source/blender/src/transform.c @@ -1256,6 +1256,9 @@ void Transform(int mode) case TFM_SHEAR: initShear(&Trans); break; + case TFM_WARP: + initWarp(&Trans); + break; } // Emptying event queue @@ -1291,6 +1294,12 @@ void Transform(int mode) if(val) { switch (event){ + // enforce redraw of transform when modifiers are used + case LEFTCTRLKEY: + case RIGHTCTRLKEY: + Trans.redraw = 1; + break; + case MIDDLEMOUSE: initSelectConstraint(&Trans); Trans.redraw = 1; @@ -1461,36 +1470,116 @@ void Transform(int mode) /* ************************** WRAP *************************** */ -void initWrap(TransInfo *t) +/* warp is done fully in view space */ +void initWarp(TransInfo *t) { - float min[3], max[3], loc[3]; + float max[3], min[3]; int i; + calculateCenterCursor(t); + t->idx_max = 0; t->num.idx_max = 0; - t->transform = Wrap; - + t->transform = Warp; + t->snap[0] = 0.0f; + t->snap[1] = 5.0f; + t->snap[2] = 1.0f; + + t->fac = (float)(t->center2d[0] - t->imval[0]); + + /* we need min/max in view space */ for(i = 0; i < t->total; i++) { - VECCOPY(loc, t->data[i].iloc); - if (G.obedit) { - Mat4MulVecfl(G.obedit->obmat, loc); - } - Mat4MulVecfl(G.vd->viewmat, loc); - if (i) { - MinMax3(min, max, loc); - } + if (i) + MinMax3(min, max, t->data[i].center); else { - VECCOPY(max, loc); - VECCOPY(min, loc); + VECCOPY(max, t->data[i].center); + VECCOPY(min, t->data[i].center); } } - - - t->fac = (float)(t->center2d[0] - t->imval[0]); + Mat4MulVecfl(G.obedit->obmat, min); + Mat4MulVecfl(G.vd->viewmat, min); + Mat4MulVecfl(G.obedit->obmat, max); + Mat4MulVecfl(G.vd->viewmat, max); + + t->center[0]= (min[0]+max[0])/2.0; + t->center[1]= (min[1]+max[1])/2.0; + t->center[2]= (min[2]+max[2])/2.0; + + t->val= (max[0]-min[0])/2.0; // t->val is free variable + + Mat4Invert(G.obedit->imat, G.obedit->obmat); } -int Wrap(TransInfo *t, short mval[2]) +int Warp(TransInfo *t, short mval[2]) { + TransData *td = t->data; + float vec[3], circumfac, dist, phi0, co, si, *curs, cursor[3]; + int i; + char str[50]; + + curs= give_cursor(); + VECCOPY(cursor, curs); + Mat4MulVecfl(G.vd->viewmat, cursor); + + // amount of degrees for warp, 450 = allow to create 360 degree warp + circumfac= 450.0*(mval[1] - t->imval[1]) / (float)(curarea->winy); + circumfac+= 90.0; + + snapGrid(t, &circumfac); + applyNumInput(&t->num, &circumfac); + + /* header print for NumInput */ + if (hasNumInput(&t->num)) { + char c[20]; + + outputNumInput(&(t->num), c); + + sprintf(str, "Warp: %s", c); + } + else { + /* default header print */ + sprintf(str, "Warp: %.3f", circumfac); + } + + circumfac*= -M_PI/360.0; + + for(i = 0 ; i < t->total; i++, td++) { + if (td->flag & TD_NOACTION) + continue; + else { + /* translate point to centre, rotate in such a way that outline==distance */ + + VECCOPY(vec, td->iloc); + Mat4MulVecfl(G.obedit->obmat, vec); + Mat4MulVecfl(G.vd->viewmat, vec); + + dist= vec[0]-cursor[0]; + + phi0= (circumfac*dist/t->val); // t->val is X dimension projected boundbox + + vec[0]= (-cursor[0]); + vec[1]= (vec[1]-cursor[1]); + + co= cos(phi0); + si= sin(phi0); + td->loc[0]= co*vec[0]-si*vec[1]+cursor[0]; + td->loc[1]= si*vec[0]+co*vec[1]+cursor[1]; + td->loc[2]= vec[2]; + + Mat4MulVecfl(G.vd->viewinv, td->loc); + Mat4MulVecfl(G.obedit->imat, td->loc); + + } + } + + recalcData(t); + + headerprint(str); + + force_draw(0); + + helpline(curs); + return 1; } @@ -1509,12 +1598,12 @@ void initShear(TransInfo *t) int Shear(TransInfo *t, short mval[2]) { + TransData *td = t->data; float vec[3]; float smat[3][3], tmat[3][3], totmat[3][3], persmat[3][3], persinv[3][3]; float value; int i; char str[50]; - TransData *td = t->data; Mat3CpyMat4(persmat, G.vd->viewmat); Mat3Inv(persinv, persmat); diff --git a/source/blender/src/transform.h b/source/blender/src/transform.h index 6c380e343d5..e8e397d2b22 100755 --- a/source/blender/src/transform.h +++ b/source/blender/src/transform.h @@ -164,8 +164,8 @@ typedef struct TransInfo { void Transform(int mode); -void initWrap(TransInfo *t); -int Wrap(TransInfo *t, short mval[2]); +void initWarp(TransInfo *t); +int Warp(TransInfo *t, short mval[2]); void initShear(TransInfo *t); int Shear(TransInfo *t, short mval[2]); |