Transform stuff for TEST!

- 4th rotation widget styling, activate with Scene buttons, Anim panel, "rt"
  on "4".
- drawing constraint lines replaced with widget compatible styling.
  (functionality unchanged)

Fix;
- click on center for Rotate widget didn't switch to local/normal in all
  cases
This commit is contained in:
2005-03-23 11:49:54 +00:00
parent b8983996d2
commit aab0b1535f
4 changed files with 386 additions and 141 deletions

View File

@@ -179,7 +179,7 @@ static int calc_manipulator(ScrArea *sa)
calc_tw_center(eve->co);
}
}
if(G.vd->twmode == V3D_MANIPULATOR_NORMAL) {
if(v3d->twmode == V3D_MANIPULATOR_NORMAL) {
EditFace *efa;
float vec[3];
for(efa= em->faces.first; efa; efa= efa->next) {
@@ -461,10 +461,10 @@ static void partial_donut(float radring, float radhole, int start, int end, int
/* three colors can be set;
GL_BLEND: grey for ghosting
G.moving: in transform theme color
moving: in transform theme color
else the red/green/blue
*/
static void manipulator_setcolor(char mode)
static void manipulator_setcolor(char mode, int moving)
{
float vec[4];
@@ -477,7 +477,7 @@ static void manipulator_setcolor(char mode)
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, vec);
}
}
else if(G.moving) {
else if(moving) {
if(mode > 'Z') BIF_ThemeColor(TH_TRANSFORM);
else {
BIF_GetThemeColor3fv(TH_TRANSFORM, vec);
@@ -511,29 +511,27 @@ static void manipulator_setcolor(char mode)
}
}
static int Gval= 0xFFFF; // defines drawmodus while moving...
/* viewmatrix should have been set OK, also no shademode! */
static void draw_manipulator_axes(int flagx, int flagy, int flagz)
static void draw_manipulator_axes(int moving, int flagx, int flagy, int flagz)
{
/* axes */
if(Gval & flagx) {
manipulator_setcolor('x');
if(flagx) {
manipulator_setcolor('x', moving);
glBegin(GL_LINES);
glVertex3f(0.0, 0.0, 0.0);
glVertex3f(1.0, 0.0, 0.0);
glEnd();
}
if(Gval & flagy) {
manipulator_setcolor('y');
if(flagy) {
manipulator_setcolor('y', moving);
glBegin(GL_LINES);
glVertex3f(0.0, 0.0, 0.0);
glVertex3f(0.0, 1.0, 0.0);
glEnd();
}
if(Gval & flagz) {
manipulator_setcolor('z');
if(flagz) {
manipulator_setcolor('z', moving);
glBegin(GL_LINES);
glVertex3f(0.0, 0.0, 0.0);
glVertex3f(0.0, 0.0, 1.0);
@@ -541,9 +539,8 @@ static void draw_manipulator_axes(int flagx, int flagy, int flagz)
}
}
/* only called while G.moving */
static void draw_manipulator_rotate_ghost(float mat[][4])
static void draw_manipulator_rotate_ghost(float mat[][4], int drawflags)
{
GLUquadricObj *qobj= gluNewQuadric();
float phi, vec[3], matt[4][4], cross[3];
@@ -562,7 +559,7 @@ static void draw_manipulator_rotate_ghost(float mat[][4])
glEnable(GL_BLEND);
/* Z disk */
if(Gval & MAN_ROT_Z) {
if(drawflags & MAN_ROT_Z) {
VECCOPY(vec, mat[0]); // use x axis to detect rotation
Normalise(vec);
Normalise(matt[0]);
@@ -574,7 +571,7 @@ static void draw_manipulator_rotate_ghost(float mat[][4])
}
}
/* X disk */
if(Gval & MAN_ROT_X) {
if(drawflags & MAN_ROT_X) {
VECCOPY(vec, mat[1]); // use y axis to detect rotation
Normalise(vec);
Normalise(matt[1]);
@@ -588,7 +585,7 @@ static void draw_manipulator_rotate_ghost(float mat[][4])
}
}
/* Y circle */
if(Gval & MAN_ROT_Y) {
if(drawflags & MAN_ROT_Y) {
VECCOPY(vec, mat[2]); // use z axis to detect rotation
Normalise(vec);
Normalise(matt[2]);
@@ -606,7 +603,7 @@ static void draw_manipulator_rotate_ghost(float mat[][4])
myloadmatrix(G.vd->viewmat);
}
static void draw_manipulator_rotate(float mat[][4])
static void draw_manipulator_rotate(float mat[][4], int moving, int drawflags)
{
GLUquadricObj *qobj= gluNewQuadric();
double plane[4];
@@ -618,7 +615,7 @@ static void draw_manipulator_rotate(float mat[][4])
if(G.rt==3) cusize= cywid*0.25;
/* when called while moving in mixed mode, do not draw when... */
if((Gval & MAN_ROT_C)==0) return;
if((drawflags & MAN_ROT_C)==0) return;
/* Init stuff */
glDisable(GL_DEPTH_TEST);
@@ -652,12 +649,12 @@ static void draw_manipulator_rotate(float mat[][4])
}
}
/* Screen aligned view rot circle */
if(Gval & MAN_ROT_V) {
if(drawflags & MAN_ROT_V) {
if(G.f & G_PICKSEL) glLoadName(MAN_ROT_V);
BIF_ThemeColor(TH_TRANSFORM);
drawcircball(unitmat[3], 1.2*size, unitmat);
if(G.moving) {
if(moving) {
float vec[3];
vec[0]= Trans.imval[0] - Trans.center2d[0];
vec[1]= Trans.imval[1] - Trans.center2d[1];
@@ -673,7 +670,7 @@ static void draw_manipulator_rotate(float mat[][4])
glPopMatrix();
/* apply the transform delta */
if(G.moving) {
if(moving) {
float matt[4][4];
Mat4CpyMat4(matt, mat); // to copy the parts outside of [3][3]
Mat4MulMat34(matt, Trans.mat, mat);
@@ -686,18 +683,18 @@ static void draw_manipulator_rotate(float mat[][4])
if(!(G.f & G_PICKSEL)) {
/* axis */
glBegin(GL_LINES);
if( (Gval & MAN_ROT_X) || (G.moving && (Gval & MAN_ROT_Z)) ) {
manipulator_setcolor('x');
if( (drawflags & MAN_ROT_X) || (moving && (drawflags & MAN_ROT_Z)) ) {
manipulator_setcolor('x', moving);
glVertex3f(0.0, 0.0, 0.0);
glVertex3f(1.0, 0.0, 0.0);
}
if( (Gval & MAN_ROT_Y) || (G.moving && (Gval & MAN_ROT_X)) ) {
manipulator_setcolor('y');
if( (drawflags & MAN_ROT_Y) || (moving && (drawflags & MAN_ROT_X)) ) {
manipulator_setcolor('y', moving);
glVertex3f(0.0, 0.0, 0.0);
glVertex3f(0.0, 1.0, 0.0);
}
if( (Gval & MAN_ROT_Z) || (G.moving && (Gval & MAN_ROT_Y)) ) {
manipulator_setcolor('z');
if( (drawflags & MAN_ROT_Z) || (moving && (drawflags & MAN_ROT_Y)) ) {
manipulator_setcolor('z', moving);
glVertex3f(0.0, 0.0, 0.0);
glVertex3f(0.0, 0.0, 1.0);
}
@@ -706,7 +703,7 @@ static void draw_manipulator_rotate(float mat[][4])
}
/* Trackball center */
if(Gval & MAN_ROT_T) {
if(drawflags & MAN_ROT_T) {
float smat[3][3], imat[3][3];
float offset[3];
@@ -740,29 +737,29 @@ static void draw_manipulator_rotate(float mat[][4])
glDisable(GL_LIGHTING);
}
if(arcs==0 && G.moving) {
if(arcs==0 && moving) {
if(arcs) glEnable(GL_CLIP_PLANE0);
/* Z circle */
if(Gval & MAN_ROT_Z) {
if(drawflags & MAN_ROT_Z) {
if(G.f & G_PICKSEL) glLoadName(MAN_ROT_Z);
manipulator_setcolor('z');
manipulator_setcolor('z', moving);
drawcircball(unitmat[3], 1.0, unitmat);
}
/* X circle */
if(Gval & MAN_ROT_X) {
if(drawflags & MAN_ROT_X) {
if(G.f & G_PICKSEL) glLoadName(MAN_ROT_X);
glRotatef(90.0, 0.0, 1.0, 0.0);
manipulator_setcolor('x');
manipulator_setcolor('x', moving);
drawcircball(unitmat[3], 1.0, unitmat);
glRotatef(-90.0, 0.0, 1.0, 0.0);
}
/* Y circle */
if(Gval & MAN_ROT_Y) {
if(drawflags & MAN_ROT_Y) {
if(G.f & G_PICKSEL) glLoadName(MAN_ROT_Y);
glRotatef(-90.0, 1.0, 0.0, 0.0);
manipulator_setcolor('y');
manipulator_setcolor('y', moving);
drawcircball(unitmat[3], 1.0, unitmat);
glRotatef(90.0, 1.0, 0.0, 0.0);
}
@@ -775,24 +772,24 @@ static void draw_manipulator_rotate(float mat[][4])
glEnable(GL_CLIP_PLANE0);
/* Z circle */
if(Gval & MAN_ROT_Z) {
if(drawflags & MAN_ROT_Z) {
if(G.f & G_PICKSEL) glLoadName(MAN_ROT_Z);
manipulator_setcolor('Z');
manipulator_setcolor('Z', moving);
partial_donut(cusize/3.0, 1.0, 0, 48, 8, 48);
}
/* X circle */
if(Gval & MAN_ROT_X) {
if(drawflags & MAN_ROT_X) {
if(G.f & G_PICKSEL) glLoadName(MAN_ROT_X);
glRotatef(90.0, 0.0, 1.0, 0.0);
manipulator_setcolor('X');
manipulator_setcolor('X', moving);
partial_donut(cusize/3.0, 1.0, 0, 48, 8, 48);
glRotatef(-90.0, 0.0, 1.0, 0.0);
}
/* Y circle */
if(Gval & MAN_ROT_Y) {
if(drawflags & MAN_ROT_Y) {
if(G.f & G_PICKSEL) glLoadName(MAN_ROT_Y);
glRotatef(-90.0, 1.0, 0.0, 0.0);
manipulator_setcolor('Y');
manipulator_setcolor('Y', moving);
partial_donut(cusize/3.0, 1.0, 0, 48, 8, 48);
glRotatef(90.0, 1.0, 0.0, 0.0);
}
@@ -804,10 +801,10 @@ static void draw_manipulator_rotate(float mat[][4])
glEnable(GL_LIGHTING);
/* Z handle on X axis */
if(Gval & MAN_ROT_Z) {
if(drawflags & MAN_ROT_Z) {
glPushMatrix();
if(G.f & G_PICKSEL) glLoadName(MAN_ROT_Z);
manipulator_setcolor('Z');
manipulator_setcolor('Z', moving);
if(G.rt==3) {
partial_donut(cusize, 1.0, 21, 27, 8, 48);
@@ -823,10 +820,10 @@ static void draw_manipulator_rotate(float mat[][4])
}
/* Y handle on X axis */
if(Gval & MAN_ROT_Y) {
if(drawflags & MAN_ROT_Y) {
glPushMatrix();
if(G.f & G_PICKSEL) glLoadName(MAN_ROT_Y);
manipulator_setcolor('Y');
manipulator_setcolor('Y', moving);
if(G.rt==3) {
glRotatef(90.0, 1.0, 0.0, 0.0);
@@ -846,10 +843,10 @@ static void draw_manipulator_rotate(float mat[][4])
}
/* X handle on Z axis */
if(Gval & MAN_ROT_X) {
if(drawflags & MAN_ROT_X) {
glPushMatrix();
if(G.f & G_PICKSEL) glLoadName(MAN_ROT_X);
manipulator_setcolor('X');
manipulator_setcolor('X', moving);
if(G.rt==3) {
glRotatef(-90.0, 0.0, 1.0, 0.0);
@@ -879,7 +876,7 @@ static void draw_manipulator_rotate(float mat[][4])
}
/* only called while G.moving */
static void draw_manipulator_scale_ghost(float mat[][4])
static void draw_manipulator_scale_ghost(float mat[][4], int drawflags)
{
float cywid= 0.33f*0.01f*(float)U.tw_handlesize;
float cusize= cywid*0.75;
@@ -895,24 +892,24 @@ static void draw_manipulator_scale_ghost(float mat[][4])
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
draw_manipulator_axes(MAN_SCALE_X, MAN_SCALE_Y, MAN_SCALE_Z);
draw_manipulator_axes(1, drawflags & MAN_SCALE_X, drawflags & MAN_SCALE_Y, drawflags & MAN_SCALE_Z);
vec[0]= vec[1]= vec[2]= 1.0; vec[3]= 0.3;
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, vec);
/* Z cube */
glTranslatef(0.0, 0.0, 1.0+cusize/2);
if(Gval & MAN_SCALE_Z) {
if(drawflags & MAN_SCALE_Z) {
drawsolidcube(cusize);
}
/* X cube */
glTranslatef(1.0+cusize/2, 0.0, -(1.0+cusize/2));
if(Gval & MAN_SCALE_X) {
if(drawflags & MAN_SCALE_X) {
drawsolidcube(cusize);
}
/* Y cube */
glTranslatef(-(1.0+cusize/2), 1.0+cusize/2, 0.0);
if(Gval & MAN_SCALE_Y) {
if(drawflags & MAN_SCALE_Y) {
drawsolidcube(cusize);
}
@@ -924,16 +921,16 @@ static void draw_manipulator_scale_ghost(float mat[][4])
glDisable(GL_LIGHTING);
}
static void draw_manipulator_scale(float mat[][4])
static void draw_manipulator_scale(float mat[][4], int moving, int drawflags)
{
float cywid= 0.33f*0.01f*(float)U.tw_handlesize;
float cusize= cywid*0.75;
float vec[3];
/* when called while moving in mixed mode, do not draw when... */
if((Gval & MAN_SCALE_C)==0) return;
if((drawflags & MAN_SCALE_C)==0) return;
if(G.moving) {
if(moving) {
float matt[4][4];
Mat4CpyMat4(matt, mat); // to copy the parts outside of [3][3]
@@ -947,7 +944,7 @@ static void draw_manipulator_scale(float mat[][4])
glDisable(GL_DEPTH_TEST);
draw_manipulator_axes(MAN_SCALE_X, MAN_SCALE_Y, MAN_SCALE_Z);
draw_manipulator_axes(moving, drawflags & MAN_SCALE_X, drawflags & MAN_SCALE_Y, drawflags & MAN_SCALE_Z);
/* only has to be set when not in picking */
glEnable(GL_CULL_FACE); // backface removal
@@ -967,23 +964,23 @@ static void draw_manipulator_scale(float mat[][4])
/* Z cube */
glTranslatef(0.0, 0.0, 1.0+cusize/2);
if(Gval & MAN_SCALE_Z) {
if(drawflags & MAN_SCALE_Z) {
if(G.f & G_PICKSEL) glLoadName(MAN_SCALE_Z);
manipulator_setcolor('Z');
manipulator_setcolor('Z', moving);
drawsolidcube(cusize);
}
/* X cube */
glTranslatef(1.0+cusize/2, 0.0, -(1.0+cusize/2));
if(Gval & MAN_SCALE_X) {
if(drawflags & MAN_SCALE_X) {
if(G.f & G_PICKSEL) glLoadName(MAN_SCALE_X);
manipulator_setcolor('X');
manipulator_setcolor('X', moving);
drawsolidcube(cusize);
}
/* Y cube */
glTranslatef(-(1.0+cusize/2), 1.0+cusize/2, 0.0);
if(Gval & MAN_SCALE_Y) {
if(drawflags & MAN_SCALE_Y) {
if(G.f & G_PICKSEL) glLoadName(MAN_SCALE_Y);
manipulator_setcolor('Y');
manipulator_setcolor('Y', moving);
drawsolidcube(cusize);
}
@@ -1014,8 +1011,23 @@ static void draw_cone(GLUquadricObj *qobj, float len, float width)
gluQuadricOrientation(qobj, GLU_OUTSIDE);
}
static void draw_cylinder(GLUquadricObj *qobj, float len, float width)
{
width*= 0.8; // just for beauty
gluCylinder(qobj, width, width, len, 8, 1);
gluQuadricOrientation(qobj, GLU_INSIDE);
gluDisk(qobj, 0.0, width, 8, 1);
gluQuadricOrientation(qobj, GLU_OUTSIDE);
glTranslatef(0.0, 0.0, len);
gluDisk(qobj, 0.0, width, 8, 1);
glTranslatef(0.0, 0.0, -len);
}
/* only called while G.moving */
static void draw_manipulator_translate_ghost(float mat[][4])
static void draw_manipulator_translate_ghost(float mat[][4], int drawflags)
{
GLUquadricObj *qobj = gluNewQuadric();
float vec[4];
@@ -1029,7 +1041,7 @@ static void draw_manipulator_translate_ghost(float mat[][4])
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
draw_manipulator_axes(MAN_TRANS_X, MAN_TRANS_Y, MAN_TRANS_Z);
draw_manipulator_axes(1, drawflags & MAN_TRANS_X, drawflags & MAN_TRANS_Y, drawflags & MAN_TRANS_Z);
glEnable(GL_CULL_FACE); // backface removal
glEnable(GL_LIGHTING);
@@ -1042,19 +1054,19 @@ static void draw_manipulator_translate_ghost(float mat[][4])
/* Z Cone */
glTranslatef(0.0, 0.0, 1.0 - cylen);
if(Gval & MAN_TRANS_Z) {
if(drawflags & MAN_TRANS_Z) {
draw_cone(qobj, cylen, cywid);
}
/* X Cone */
glTranslatef(1.0 - cylen, 0.0, -(1.0 - cylen));
if(Gval & MAN_TRANS_X) {
if(drawflags & MAN_TRANS_X) {
glRotatef(90.0, 0.0, 1.0, 0.0);
draw_cone(qobj, cylen, cywid);
glRotatef(-90.0, 0.0, 1.0, 0.0);
}
/* Y Cone */
glTranslatef(-(1.0 - cylen), 1.0 - cylen, 0.0);
if(Gval & MAN_TRANS_Y) {
if(drawflags & MAN_TRANS_Y) {
glRotatef(-90.0, 1.0, 0.0, 0.0);
draw_cone(qobj, cylen, cywid);
}
@@ -1067,9 +1079,7 @@ static void draw_manipulator_translate_ghost(float mat[][4])
glDisable(GL_LIGHTING);
}
static void draw_manipulator_translate(float mat[][4])
static void draw_manipulator_translate(float mat[][4], int moving, int drawflags)
{
GLUquadricObj *qobj = gluNewQuadric();
float vec[3];
@@ -1077,9 +1087,9 @@ static void draw_manipulator_translate(float mat[][4])
float cywid= 0.33f*cylen;
/* when called while moving in mixed mode, do not draw when... */
if((Gval & MAN_TRANS_C)==0) return;
if((drawflags & MAN_TRANS_C)==0) return;
if(G.moving) glTranslatef(Trans.vec[0], Trans.vec[1], Trans.vec[2]);
if(moving) glTranslatef(Trans.vec[0], Trans.vec[1], Trans.vec[2]);
mymultmatrix(mat);
@@ -1087,7 +1097,7 @@ static void draw_manipulator_translate(float mat[][4])
/* axis */
if( (G.f & G_PICKSEL)==0 ) {
draw_manipulator_axes(MAN_TRANS_X, MAN_TRANS_Y, MAN_TRANS_Z);
draw_manipulator_axes(moving, drawflags & MAN_TRANS_X, drawflags & MAN_TRANS_Y, drawflags & MAN_TRANS_Z);
/* only has to be set when not in picking */
gluQuadricDrawStyle(qobj, GLU_FILL);
@@ -1109,44 +1119,103 @@ static void draw_manipulator_translate(float mat[][4])
/* Z Cone */
glTranslatef(0.0, 0.0, 1.0 - cylen);
if(Gval & MAN_TRANS_Z) {
if(drawflags & MAN_TRANS_Z) {
if(G.f & G_PICKSEL) glLoadName(MAN_TRANS_Z);
manipulator_setcolor('Z');
manipulator_setcolor('Z', moving);
draw_cone(qobj, cylen, cywid);
}
/* X Cone */
glTranslatef(1.0 - cylen, 0.0, -(1.0 - cylen));
if(Gval & MAN_TRANS_X) {
if(drawflags & MAN_TRANS_X) {
if(G.f & G_PICKSEL) glLoadName(MAN_TRANS_X);
glRotatef(90.0, 0.0, 1.0, 0.0);
manipulator_setcolor('X');
manipulator_setcolor('X', moving);
draw_cone(qobj, cylen, cywid);
glRotatef(-90.0, 0.0, 1.0, 0.0);
}
/* Y Cone */
glTranslatef(-(1.0 - cylen), 1.0 - cylen, 0.0);
if(Gval & MAN_TRANS_Y) {
if(drawflags & MAN_TRANS_Y) {
if(G.f & G_PICKSEL) glLoadName(MAN_TRANS_Y);
glRotatef(-90.0, 1.0, 0.0, 0.0);
manipulator_setcolor('Y');
manipulator_setcolor('Y', moving);
draw_cone(qobj, cylen, cywid);
}
glDisable(GL_CULL_FACE);
glDisable(GL_LIGHTING);
gluDeleteQuadric(qobj);
myloadmatrix(G.vd->viewmat);
/* if shiftkey, center point as last, for selectbuffer */
if(G.f & G_PICKSEL) {
if(G.qual & LR_SHIFTKEY) {
glRotatef(90.0, 1.0, 0.0, 0.0);
glTranslatef(0.0, -(1.0 - cylen), 0.0);
//glLoadName(MAN_TRANS_C);
//glBegin(GL_POINTS);
//glVertex3f(0.0, 0.0, 0.0);
//glEnd();
}
if(G.zbuf) glEnable(GL_DEPTH_TEST); // shouldn't be global, tsk!
}
static void draw_manipulator_rotate_ghost_cyl(float mat[][4], int drawflags)
{
GLUquadricObj *qobj = gluNewQuadric();
float vec[3];
float cylen= 0.01f*(float)U.tw_handlesize;
float cywid= 0.33f*cylen;
/* when called while moving in mixed mode, do not draw when... */
if((drawflags & MAN_ROT_C)==0) return;
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
mymultmatrix(mat);
glDisable(GL_DEPTH_TEST);
/* axis */
draw_manipulator_axes(1, drawflags & MAN_ROT_X, drawflags & MAN_ROT_Y, drawflags & MAN_ROT_Z);
gluQuadricDrawStyle(qobj, GLU_FILL);
gluQuadricNormals(qobj, GLU_SMOOTH);
glEnable(GL_CULL_FACE); // backface removal
glEnable(GL_LIGHTING);
glShadeModel(GL_SMOOTH);
/* center sphere */
BIF_GetThemeColor3fv(TH_TRANSFORM, vec);
if(G.vd->twmode == V3D_MANIPULATOR_LOCAL) {vec[0]+= 0.25; vec[1]+=0.25; vec[2]+=0.25;}
else if(G.vd->twmode == V3D_MANIPULATOR_NORMAL) {vec[0]-= 0.2; vec[1]-=0.2; vec[2]-=0.2;}
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, vec);
gluSphere(qobj, cywid, 8, 6);
/* Z cyl */
glTranslatef(0.0, 0.0, 1.0 - cylen);
if(drawflags & MAN_ROT_Z) {
if(G.f & G_PICKSEL) glLoadName(MAN_ROT_Z);
manipulator_setcolor('Z', 1);
draw_cylinder(qobj, cylen, cywid);
}
/* X cyl */
glTranslatef(1.0 - cylen, 0.0, -(1.0 - cylen));
if(drawflags & MAN_ROT_X) {
if(G.f & G_PICKSEL) glLoadName(MAN_ROT_X);
glRotatef(90.0, 0.0, 1.0, 0.0);
manipulator_setcolor('X', 1);
draw_cylinder(qobj, cylen, cywid);
glRotatef(-90.0, 0.0, 1.0, 0.0);
}
/* Y cylinder */
glTranslatef(-(1.0 - cylen), 1.0 - cylen, 0.0);
if(drawflags & MAN_ROT_Y) {
if(G.f & G_PICKSEL) glLoadName(MAN_ROT_Y);
glRotatef(-90.0, 1.0, 0.0, 0.0);
manipulator_setcolor('Y', 1);
draw_cylinder(qobj, cylen, cywid);
}
glDisable(GL_CULL_FACE);
glDisable(GL_LIGHTING);
glDisable(GL_BLEND);
gluDeleteQuadric(qobj);
myloadmatrix(G.vd->viewmat);
@@ -1154,11 +1223,184 @@ static void draw_manipulator_translate(float mat[][4])
}
static void draw_manipulator_rotate_cyl(float mat[][4], int moving, int drawflags)
{
GLUquadricObj *qobj = gluNewQuadric();
float vec[3], size;
float cylen= 0.01f*(float)U.tw_handlesize;
float cywid= 0.33f*cylen;
/* when called while moving in mixed mode, do not draw when... */
if((drawflags & MAN_ROT_C)==0) return;
/* prepare for screen aligned draw */
VECCOPY(vec, mat[0]);
size= Normalise(vec);
glPushMatrix();
glTranslatef(mat[3][0], mat[3][1], mat[3][2]);
/* sets view screen aligned */
glRotatef( -360.0*saacos(G.vd->viewquat[0])/M_PI, G.vd->viewquat[1], G.vd->viewquat[2], G.vd->viewquat[3]);
/* Screen aligned view rot circle */
if(drawflags & MAN_ROT_V) {
float unitmat[4][4];
Mat4One(unitmat);
if(G.f & G_PICKSEL) glLoadName(MAN_ROT_V);
BIF_ThemeColor(TH_TRANSFORM);
drawcircball(unitmat[3], 1.2*size, unitmat);
if(moving) {
float vec[3];
vec[0]= Trans.imval[0] - Trans.center2d[0];
vec[1]= Trans.imval[1] - Trans.center2d[1];
vec[2]= 0.0;
Normalise(vec);
VecMulf(vec, 1.2*size);
glBegin(GL_LINES);
glVertex3f(0.0, 0.0, 0.0);
glVertex3fv(vec);
glEnd();
}
}
glPopMatrix();
mymultmatrix(mat);
glDisable(GL_DEPTH_TEST);
/* axis */
if( (G.f & G_PICKSEL)==0 ) {
draw_manipulator_axes(moving, drawflags & MAN_ROT_X, drawflags & MAN_ROT_Y, drawflags & MAN_ROT_Z);
/* only has to be set when not in picking */
gluQuadricDrawStyle(qobj, GLU_FILL);
gluQuadricNormals(qobj, GLU_SMOOTH);
glEnable(GL_CULL_FACE); // backface removal
glEnable(GL_LIGHTING);
glShadeModel(GL_SMOOTH);
}
/* center sphere, do not add to selection when shift is pressed (planar constraint) */
if( (G.f & G_PICKSEL) && (G.qual & LR_SHIFTKEY)==0) glLoadName(MAN_ROT_T);
BIF_GetThemeColor3fv(TH_TRANSFORM, vec);
if(G.vd->twmode == V3D_MANIPULATOR_LOCAL) {vec[0]+= 0.25; vec[1]+=0.25; vec[2]+=0.25;}
else if(G.vd->twmode == V3D_MANIPULATOR_NORMAL) {vec[0]-= 0.2; vec[1]-=0.2; vec[2]-=0.2;}
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, vec);
gluSphere(qobj, cywid, 8, 6);
/* Z cyl */
glTranslatef(0.0, 0.0, 1.0 - cylen);
if(drawflags & MAN_ROT_Z) {
if(G.f & G_PICKSEL) glLoadName(MAN_ROT_Z);
manipulator_setcolor('Z', moving);
draw_cylinder(qobj, cylen, cywid);
}
/* X cyl */
glTranslatef(1.0 - cylen, 0.0, -(1.0 - cylen));
if(drawflags & MAN_ROT_X) {
if(G.f & G_PICKSEL) glLoadName(MAN_ROT_X);
glRotatef(90.0, 0.0, 1.0, 0.0);
manipulator_setcolor('X', moving);
draw_cylinder(qobj, cylen, cywid);
glRotatef(-90.0, 0.0, 1.0, 0.0);
}
/* Y cylinder */
glTranslatef(-(1.0 - cylen), 1.0 - cylen, 0.0);
if(drawflags & MAN_ROT_Y) {
if(G.f & G_PICKSEL) glLoadName(MAN_ROT_Y);
glRotatef(-90.0, 1.0, 0.0, 0.0);
manipulator_setcolor('Y', moving);
draw_cylinder(qobj, cylen, cywid);
}
glDisable(GL_CULL_FACE);
glDisable(GL_LIGHTING);
gluDeleteQuadric(qobj);
myloadmatrix(G.vd->viewmat);
if(G.zbuf) glEnable(GL_DEPTH_TEST); // shouldn't be global, tsk!
}
static float manipulator_drawsize(ScrArea *sa)
{
View3D *v3d= sa->spacedata.first;
float size, vec[3], len1, len2;
/* size calculus, depending ortho/persp settings, like initgrabz() */
size= v3d->persmat[0][3]*v3d->twmat[3][0]+ v3d->persmat[1][3]*v3d->twmat[3][1]+ v3d->persmat[2][3]*v3d->twmat[3][2]+ v3d->persmat[3][3];
VECCOPY(vec, v3d->persinv[0]);
len1= Normalise(vec);
VECCOPY(vec, v3d->persinv[1]);
len2= Normalise(vec);
size*= (0.01f*(float)U.tw_size)*(len1>len2?len1:len2);
if(U.tw_flag & U_TW_ABSOLUTE) {
/* correct for relative window size */
if(sa->winx > sa->winy) size*= 1000.0f/(float)sa->winx;
else size*= 1000.0f/(float)sa->winy;
}
return size;
}
/* exported to transform_constraints.c */
/* mat, vec = default orientation and location */
/* type = transform type */
/* axis = x, y, z, c */
/* col: 0 = colored, 1 = moving, 2 = ghost */
void draw_manipulator_ext(ScrArea *sa, int type, char axis, int col, float vec[3], float mat[][3])
{
int drawflags= 0;
float mat4[4][4];
Mat4CpyMat3(mat4, mat);
VECCOPY(mat4[3], vec);
Mat4MulFloat3((float *)mat4, manipulator_drawsize(sa));
if(type==TFM_ROTATION) {
if(axis=='x') drawflags= MAN_ROT_X;
else if(axis=='y') drawflags= MAN_ROT_Y;
else if(axis=='z') drawflags= MAN_ROT_Z;
else drawflags= MAN_ROT_C;
if(col==2) draw_manipulator_rotate_ghost_cyl(mat4, drawflags);
else draw_manipulator_rotate_cyl(mat4, col, drawflags);
}
else if(type==TFM_RESIZE) {
if(axis=='x') drawflags= MAN_SCALE_X;
else if(axis=='y') drawflags= MAN_SCALE_Y;
else if(axis=='z') drawflags= MAN_SCALE_Z;
else drawflags= MAN_SCALE_C;
if(col==2) draw_manipulator_scale_ghost(mat4, drawflags);
else draw_manipulator_scale(mat4, col, drawflags);
}
else {
if(axis=='x') drawflags= MAN_TRANS_X;
else if(axis=='y') drawflags= MAN_TRANS_Y;
else if(axis=='z') drawflags= MAN_TRANS_Z;
else drawflags= MAN_TRANS_C;
if(col==2) draw_manipulator_translate_ghost(mat4, drawflags);
else draw_manipulator_translate(mat4, col, drawflags);
}
}
/* main call, does calc centers & orientation too */
/* uses global G.moving */
static int drawflags= 0xFFFF; // only for the calls below, belongs in scene...?
void BIF_draw_manipulator(ScrArea *sa)
{
View3D *v3d= sa->spacedata.first;
float len1, len2, size, vec[3];
int totsel;
if(!(v3d->twflag & V3D_USE_MANIPULATOR)) return;
@@ -1188,36 +1430,23 @@ void BIF_draw_manipulator(ScrArea *sa)
break;
}
/* size calculus, depending ortho/persp settings, like initgrabz() */
size= G.vd->persmat[0][3]*v3d->twmat[3][0]+ G.vd->persmat[1][3]*v3d->twmat[3][1]+ G.vd->persmat[2][3]*v3d->twmat[3][2]+ G.vd->persmat[3][3];
VECCOPY(vec, G.vd->persinv[0]);
len1= Normalise(vec);
VECCOPY(vec, G.vd->persinv[1]);
len2= Normalise(vec);
size*= (0.01f*(float)U.tw_size)*(len1>len2?len1:len2);
if(U.tw_flag & U_TW_ABSOLUTE) {
/* correct for relative window size */
if(sa->winx > sa->winy) size*= 1000.0f/(float)sa->winx;
else size*= 1000.0f/(float)sa->winy;
}
Mat4MulFloat3((float *)v3d->twmat, size);
Mat4MulFloat3((float *)v3d->twmat, manipulator_drawsize(sa));
}
if(v3d->twflag & V3D_DRAW_MANIPULATOR) {
if(v3d->twtype & V3D_MANIPULATOR_ROTATE) {
if(G.moving) draw_manipulator_rotate_ghost(v3d->twmat);
draw_manipulator_rotate(v3d->twmat);
if(G.moving) draw_manipulator_rotate_ghost(v3d->twmat, drawflags);
if(G.rt==4) draw_manipulator_rotate_cyl(v3d->twmat, G.moving, drawflags);
else draw_manipulator_rotate(v3d->twmat, G.moving, drawflags);
}
if(v3d->twtype & V3D_MANIPULATOR_SCALE) {
if(G.moving) draw_manipulator_scale_ghost(v3d->twmat);
draw_manipulator_scale(v3d->twmat);
if(G.moving) draw_manipulator_scale_ghost(v3d->twmat, drawflags);
draw_manipulator_scale(v3d->twmat, G.moving, drawflags);
}
if(v3d->twtype & V3D_MANIPULATOR_TRANSLATE) {
if(G.moving) draw_manipulator_translate_ghost(v3d->twmat);
draw_manipulator_translate(v3d->twmat);
if(G.moving) draw_manipulator_translate_ghost(v3d->twmat, drawflags);
draw_manipulator_translate(v3d->twmat, G.moving, drawflags);
}
}
}
@@ -1241,7 +1470,7 @@ static int manipulator_selectbuf(ScrArea *sa, float hotspot)
persp(PERSP_VIEW);
setwinmatrixview3d(&rect);
Mat4MulMat4(G.vd->persmat, G.vd->viewmat, sa->winmat);
Mat4MulMat4(v3d->persmat, v3d->viewmat, sa->winmat);
glSelectBuffer( 64, buffer);
glRenderMode(GL_SELECT);
@@ -1249,19 +1478,21 @@ static int manipulator_selectbuf(ScrArea *sa, float hotspot)
glPushName(-2);
/* do the drawing */
if(v3d->twtype & V3D_MANIPULATOR_ROTATE)
draw_manipulator_rotate(v3d->twmat);
if(v3d->twtype & V3D_MANIPULATOR_ROTATE) {
if(G.rt==4) draw_manipulator_rotate_cyl(v3d->twmat, 0, 0xFFFF);
else draw_manipulator_rotate(v3d->twmat, 0, 0xFFFF);
}
if(v3d->twtype & V3D_MANIPULATOR_SCALE)
draw_manipulator_scale(v3d->twmat);
draw_manipulator_scale(v3d->twmat, 0, 0xFFFF);
if(v3d->twtype & V3D_MANIPULATOR_TRANSLATE)
draw_manipulator_translate(v3d->twmat);
draw_manipulator_translate(v3d->twmat, 0, 0xFFFF);
glPopName();
hits= glRenderMode(GL_RENDER);
G.f &= ~G_PICKSEL;
setwinmatrixview3d(0);
Mat4MulMat4(G.vd->persmat, G.vd->viewmat, sa->winmat);
Mat4MulMat4(v3d->persmat, v3d->viewmat, sa->winmat);
persp(PERSP_WIN);
@@ -1279,6 +1510,7 @@ static int manipulator_selectbuf(ScrArea *sa, float hotspot)
return 0;
}
/* return 0; nothing happened */
int BIF_do_manipulator(ScrArea *sa)
{
View3D *v3d= sa->spacedata.first;
@@ -1287,25 +1519,24 @@ int BIF_do_manipulator(ScrArea *sa)
if(!(v3d->twflag & V3D_USE_MANIPULATOR)) return 0;
if(!(v3d->twflag & V3D_DRAW_MANIPULATOR)) return 0;
// find the hotspots (Gval is for draw). first test narrow hotspot
// warning, Gval is ugly global defining how it draws, don't set it before doing select calls!
// find the hotspots first test narrow hotspot
val= manipulator_selectbuf(sa, 0.5*(float)U.tw_hotspot);
if(val) {
short mvalo[2], mval[2];
Gval= manipulator_selectbuf(sa, 0.2*(float)U.tw_hotspot);
if(Gval) val= Gval;
else Gval= val;
// drawflags still global, for drawing call above
drawflags= manipulator_selectbuf(sa, 0.2*(float)U.tw_hotspot);
if(drawflags==0) drawflags= val;
getmouseco_areawin(mvalo);
switch(val) {
switch(drawflags) {
case MAN_TRANS_C:
ManipulatorTransform(TFM_TRANSLATION);
break;
case MAN_TRANS_X:
if(G.qual & LR_SHIFTKEY) {
Gval= MAN_TRANS_Y|MAN_TRANS_Z;
drawflags= MAN_TRANS_Y|MAN_TRANS_Z;
BIF_setDualAxisConstraint(v3d->twmat[1], v3d->twmat[2]);
}
else
@@ -1314,7 +1545,7 @@ int BIF_do_manipulator(ScrArea *sa)
break;
case MAN_TRANS_Y:
if(G.qual & LR_SHIFTKEY) {
Gval= MAN_TRANS_X|MAN_TRANS_Z;
drawflags= MAN_TRANS_X|MAN_TRANS_Z;
BIF_setDualAxisConstraint(v3d->twmat[0], v3d->twmat[2]);
}
else
@@ -1323,7 +1554,7 @@ int BIF_do_manipulator(ScrArea *sa)
break;
case MAN_TRANS_Z:
if(G.qual & LR_SHIFTKEY) {
Gval= MAN_TRANS_X|MAN_TRANS_Y;
drawflags= MAN_TRANS_X|MAN_TRANS_Y;
BIF_setDualAxisConstraint(v3d->twmat[0], v3d->twmat[1]);
}
else
@@ -1336,7 +1567,7 @@ int BIF_do_manipulator(ScrArea *sa)
break;
case MAN_SCALE_X:
if(G.qual & LR_SHIFTKEY) {
Gval= MAN_SCALE_Y|MAN_SCALE_Z;
drawflags= MAN_SCALE_Y|MAN_SCALE_Z;
BIF_setDualAxisConstraint(v3d->twmat[1], v3d->twmat[2]);
}
else
@@ -1345,7 +1576,7 @@ int BIF_do_manipulator(ScrArea *sa)
break;
case MAN_SCALE_Y:
if(G.qual & LR_SHIFTKEY) {
Gval= MAN_SCALE_X|MAN_SCALE_Z;
drawflags= MAN_SCALE_X|MAN_SCALE_Z;
BIF_setDualAxisConstraint(v3d->twmat[0], v3d->twmat[2]);
}
else
@@ -1354,7 +1585,7 @@ int BIF_do_manipulator(ScrArea *sa)
break;
case MAN_SCALE_Z:
if(G.qual & LR_SHIFTKEY) {
Gval= MAN_SCALE_X|MAN_SCALE_Y;
drawflags= MAN_SCALE_X|MAN_SCALE_Y;
BIF_setDualAxisConstraint(v3d->twmat[0], v3d->twmat[1]);
}
else
@@ -1384,7 +1615,7 @@ int BIF_do_manipulator(ScrArea *sa)
/* cycling orientation modus */
getmouseco_areawin(mval);
if(val==MAN_ROT_V || val==MAN_SCALE_C || val==MAN_TRANS_C) {
if(val==MAN_ROT_T || val==MAN_SCALE_C || val==MAN_TRANS_C) {
if(mvalo[0]==mval[0] && mvalo[1]==mval[1]) {
if(v3d->twmode==V3D_MANIPULATOR_GLOBAL)
v3d->twmode= V3D_MANIPULATOR_LOCAL;
@@ -1398,7 +1629,8 @@ int BIF_do_manipulator(ScrArea *sa)
}
}
Gval= 0xFFFF;
/* after transform, restore drawflags */
drawflags= 0xFFFF;
return val;
}