diff options
author | Ton Roosendaal <ton@blender.org> | 2005-04-16 16:35:42 +0400 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2005-04-16 16:35:42 +0400 |
commit | 097726eb50226028cdfd41da9457769ac7e48834 (patch) | |
tree | ae31cca4e40d4b4695051e5afa6b0b8a00dab8d6 /source/blender/src/transform_manipulator.c | |
parent | e7469acd16d14492cfdb70ce77001eb07bf0d48c (diff) |
For the manipulator freaks; rotate widget with 'arcs' now displays the
transparant grey (ghosted) rotation where mouse click started.
Diffstat (limited to 'source/blender/src/transform_manipulator.c')
-rw-r--r-- | source/blender/src/transform_manipulator.c | 58 |
1 files changed, 52 insertions, 6 deletions
diff --git a/source/blender/src/transform_manipulator.c b/source/blender/src/transform_manipulator.c index 1572f0a30e1..ac4311bb216 100644 --- a/source/blender/src/transform_manipulator.c +++ b/source/blender/src/transform_manipulator.c @@ -598,7 +598,8 @@ static void draw_manipulator_axes(int colcode, int flagx, int flagy, int flagz) static void draw_manipulator_rotate_ghost(float mat[][4], int drawflags) { GLUquadricObj *qobj= gluNewQuadric(); - float size, phi, vec[3], matt[4][4], cross[3]; + float size, phi, startphi, vec[3], svec[3], matt[4][4], cross[3], tmat[3][3]; + int arcs= (G.rt==2 || G.rt==6); glDisable(GL_DEPTH_TEST); gluQuadricDrawStyle(qobj, GLU_FILL); @@ -613,7 +614,6 @@ static void draw_manipulator_rotate_ghost(float mat[][4], int drawflags) /* Screen aligned view rot circle */ if(drawflags & MAN_ROT_V) { - float startphi; /* prepare for screen aligned draw */ glPushMatrix(); @@ -635,12 +635,38 @@ static void draw_manipulator_rotate_ghost(float mat[][4], int drawflags) glPopMatrix(); } - + else if(arcs) { + float imat[3][3], ivmat[3][3]; + /* try to get the start rotation */ + + svec[0]= (float)(Trans.con.imval[0] - Trans.center2d[0]); + svec[1]= (float)(Trans.con.imval[1] - Trans.center2d[1]); + svec[2]= 0.0f; + + /* screen aligned vec transform back to manipulator space */ + Mat3CpyMat4(ivmat, G.vd->viewinv); + Mat3CpyMat4(tmat, mat); + Mat3Inv(imat, tmat); + Mat3MulMat3(tmat, imat, ivmat); + + Mat3MulVecfl(tmat, svec); // tmat is used further on + Normalise(svec); + } mymultmatrix(mat); // aligns with original widget /* Z disk */ if(drawflags & MAN_ROT_Z) { + if(arcs) { + /* correct for squeezed arc */ + svec[0]+= tmat[2][0]; + svec[1]+= tmat[2][1]; + Normalise(svec); + + startphi= atan2(svec[0], svec[1]); + } + else startphi= 0.5*M_PI; + VECCOPY(vec, mat[0]); // use x axis to detect rotation Normalise(vec); Normalise(matt[0]); @@ -648,11 +674,21 @@ static void draw_manipulator_rotate_ghost(float mat[][4], int drawflags) if(phi!=0.0) { Crossf(cross, vec, matt[0]); // results in z vector if(Inpf(cross, mat[2]) > 0.0) phi= -phi; - gluPartialDisk(qobj, 0.0, 1.0, 32, 1, 90.0, 180.0*phi/M_PI); + gluPartialDisk(qobj, 0.0, 1.0, 32, 1, 180.0*startphi/M_PI, 180.0*(phi)/M_PI); } } /* X disk */ if(drawflags & MAN_ROT_X) { + if(arcs) { + /* correct for squeezed arc */ + svec[1]+= tmat[2][1]; + svec[2]+= tmat[2][2]; + Normalise(svec); + + startphi= M_PI + atan2(svec[2], -svec[1]); + } + else startphi= 0.0; + VECCOPY(vec, mat[1]); // use y axis to detect rotation Normalise(vec); Normalise(matt[1]); @@ -661,12 +697,22 @@ static void draw_manipulator_rotate_ghost(float mat[][4], int drawflags) Crossf(cross, vec, matt[1]); // results in x vector if(Inpf(cross, mat[0]) > 0.0) phi= -phi; glRotatef(90.0, 0.0, 1.0, 0.0); - gluPartialDisk(qobj, 0.0, 1.0, 32, 1, 0.0, 180.0*phi/M_PI); + gluPartialDisk(qobj, 0.0, 1.0, 32, 1, 180.0*startphi/M_PI, 180.0*phi/M_PI); glRotatef(-90.0, 0.0, 1.0, 0.0); } } /* Y circle */ if(drawflags & MAN_ROT_Y) { + if(arcs) { + /* correct for squeezed arc */ + svec[0]+= tmat[2][0]; + svec[2]+= tmat[2][2]; + Normalise(svec); + + startphi= M_PI + atan2(-svec[0], svec[2]); + } + else startphi= M_PI; + VECCOPY(vec, mat[2]); // use z axis to detect rotation Normalise(vec); Normalise(matt[2]); @@ -675,7 +721,7 @@ static void draw_manipulator_rotate_ghost(float mat[][4], int drawflags) Crossf(cross, vec, matt[2]); // results in y vector if(Inpf(cross, mat[1]) > 0.0) phi= -phi; glRotatef(-90.0, 1.0, 0.0, 0.0); - gluPartialDisk(qobj, 0.0, 1.0, 32, 1, 180.0, 180.0*phi/M_PI); + gluPartialDisk(qobj, 0.0, 1.0, 32, 1, 180.0*startphi/M_PI, 180.0*phi/M_PI); glRotatef(90.0, 1.0, 0.0, 0.0); } } |