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:
authorTon Roosendaal <ton@blender.org>2005-04-16 16:35:42 +0400
committerTon Roosendaal <ton@blender.org>2005-04-16 16:35:42 +0400
commit097726eb50226028cdfd41da9457769ac7e48834 (patch)
treeae31cca4e40d4b4695051e5afa6b0b8a00dab8d6 /source/blender/src/transform_manipulator.c
parente7469acd16d14492cfdb70ce77001eb07bf0d48c (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.c58
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);
}
}