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
path: root/source
diff options
context:
space:
mode:
authorTon Roosendaal <ton@blender.org>2005-03-08 20:29:33 +0300
committerTon Roosendaal <ton@blender.org>2005-03-08 20:29:33 +0300
commit8eef3cfd9c36f3e442885cf46a6ca0365efcfdeb (patch)
tree0381fe21036da144178b79c943e16893fb0ee82c /source
parent81ea38cd10d391eebce2f8629f9a93fd097e72b2 (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-xsource/blender/include/BIF_transform.h1
-rw-r--r--source/blender/src/space.c4
-rwxr-xr-xsource/blender/src/transform.c127
-rwxr-xr-xsource/blender/src/transform.h4
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]);