Added Manipulator Combo mode, with translate/rotate/scale combined. Center

remains translate though. Can be activitated as 4th CTRL hotkey cycle.
This commit is contained in:
2005-03-25 16:59:04 +00:00
parent 55af35d795
commit fe3b127e23
2 changed files with 55 additions and 25 deletions

View File

@@ -1756,12 +1756,17 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
case RIGHTCTRLKEY: case RIGHTCTRLKEY:
case LEFTCTRLKEY: case LEFTCTRLKEY:
if(v3d->twflag & V3D_USE_MANIPULATOR) { if(v3d->twflag & V3D_USE_MANIPULATOR) {
if(v3d->twtype & V3D_MANIPULATOR_TRANSLATE) if(v3d->twtype & V3D_MANIPULATOR_SCALE) {
if(v3d->twtype== V3D_MANIPULATOR_SCALE)
v3d->twtype= V3D_MANIPULATOR_TRANSLATE|V3D_MANIPULATOR_ROTATE|V3D_MANIPULATOR_SCALE;
else
v3d->twtype= V3D_MANIPULATOR_TRANSLATE;
}
else if(v3d->twtype & V3D_MANIPULATOR_TRANSLATE)
v3d->twtype= V3D_MANIPULATOR_ROTATE; v3d->twtype= V3D_MANIPULATOR_ROTATE;
else if(v3d->twtype & V3D_MANIPULATOR_ROTATE) else if(v3d->twtype & V3D_MANIPULATOR_ROTATE)
v3d->twtype= V3D_MANIPULATOR_SCALE; v3d->twtype= V3D_MANIPULATOR_SCALE;
else if(v3d->twtype & V3D_MANIPULATOR_SCALE)
v3d->twtype= V3D_MANIPULATOR_TRANSLATE;
doredraw= 1; doredraw= 1;
} }
break; break;

View File

@@ -629,6 +629,7 @@ static void draw_manipulator_rotate(float mat[][4], int moving, int drawflags)
/* prepare for screen aligned draw */ /* prepare for screen aligned draw */
VECCOPY(vec, mat[0]); VECCOPY(vec, mat[0]);
size= Normalise(vec); size= Normalise(vec);
size*= 1.0 - cywid; // fits in between translate, scale handles
glPushMatrix(); glPushMatrix();
glTranslatef(mat[3][0], mat[3][1], mat[3][2]); glTranslatef(mat[3][0], mat[3][1], mat[3][2]);
@@ -678,6 +679,9 @@ static void draw_manipulator_rotate(float mat[][4], int moving, int drawflags)
} }
else mymultmatrix(mat); else mymultmatrix(mat);
/* small tweak to scale handles between translate and scale handles */
glScalef(1.0 - cywid, 1.0 - cywid, 1.0 - cywid);
/* axes */ /* axes */
if(arcs==0) { if(arcs==0) {
if(!(G.f & G_PICKSEL)) { if(!(G.f & G_PICKSEL)) {
@@ -952,6 +956,8 @@ static void draw_manipulator_scale(float mat[][4], int moving, int drawflags)
glShadeModel(GL_SMOOTH); glShadeModel(GL_SMOOTH);
} }
/* not in combo mode */
if((drawflags & (~MAN_SCALE_C))==0) {
/* center cube, do not add to selection when shift is pressed (planar constraint) */ /* center cube, do not add to selection when shift is pressed (planar constraint) */
if( (G.f & G_PICKSEL) && (G.qual & LR_SHIFTKEY)==0) glLoadName(MAN_SCALE_C); if( (G.f & G_PICKSEL) && (G.qual & LR_SHIFTKEY)==0) glLoadName(MAN_SCALE_C);
@@ -961,6 +967,7 @@ static void draw_manipulator_scale(float mat[][4], int moving, int drawflags)
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, vec); glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, vec);
drawsolidcube(cusize); drawsolidcube(cusize);
}
/* Z cube */ /* Z cube */
glTranslatef(0.0, 0.0, 1.0+cusize/2); glTranslatef(0.0, 0.0, 1.0+cusize/2);
@@ -1436,13 +1443,23 @@ void BIF_draw_manipulator(ScrArea *sa)
if(v3d->twflag & V3D_DRAW_MANIPULATOR) { if(v3d->twflag & V3D_DRAW_MANIPULATOR) {
if(v3d->twtype & V3D_MANIPULATOR_ROTATE) { if(v3d->twtype & V3D_MANIPULATOR_ROTATE) {
int flags = drawflags;
// prevent combo to draw too many centers
if(v3d->twtype & (V3D_MANIPULATOR_TRANSLATE|V3D_MANIPULATOR_SCALE))
flags &= ~MAN_ROT_T;
if(G.moving) draw_manipulator_rotate_ghost(v3d->twmat, drawflags); if(G.moving) draw_manipulator_rotate_ghost(v3d->twmat, drawflags);
if(G.rt==4) draw_manipulator_rotate_cyl(v3d->twmat, G.moving, drawflags); if(G.rt==4) draw_manipulator_rotate_cyl(v3d->twmat, G.moving, flags);
else draw_manipulator_rotate(v3d->twmat, G.moving, drawflags); else draw_manipulator_rotate(v3d->twmat, G.moving, flags);
} }
if(v3d->twtype & V3D_MANIPULATOR_SCALE) { if(v3d->twtype & V3D_MANIPULATOR_SCALE) {
int flags= drawflags;
if(v3d->twtype & (V3D_MANIPULATOR_ROTATE|V3D_MANIPULATOR_TRANSLATE));
else flags &= MAN_SCALE_C;
if(G.moving) draw_manipulator_scale_ghost(v3d->twmat, drawflags); if(G.moving) draw_manipulator_scale_ghost(v3d->twmat, drawflags);
draw_manipulator_scale(v3d->twmat, G.moving, drawflags); draw_manipulator_scale(v3d->twmat, G.moving, flags);
} }
if(v3d->twtype & V3D_MANIPULATOR_TRANSLATE) { if(v3d->twtype & V3D_MANIPULATOR_TRANSLATE) {
if(G.moving) draw_manipulator_translate_ghost(v3d->twmat, drawflags); if(G.moving) draw_manipulator_translate_ghost(v3d->twmat, drawflags);
@@ -1479,13 +1496,13 @@ static int manipulator_selectbuf(ScrArea *sa, float hotspot)
/* do the drawing */ /* do the drawing */
if(v3d->twtype & V3D_MANIPULATOR_ROTATE) { if(v3d->twtype & V3D_MANIPULATOR_ROTATE) {
if(G.rt==4) draw_manipulator_rotate_cyl(v3d->twmat, 0, 0xFFFF); if(G.rt==4) draw_manipulator_rotate_cyl(v3d->twmat, 0, MAN_ROT_C);
else draw_manipulator_rotate(v3d->twmat, 0, 0xFFFF); else draw_manipulator_rotate(v3d->twmat, 0, MAN_ROT_C);
} }
if(v3d->twtype & V3D_MANIPULATOR_SCALE) if(v3d->twtype & V3D_MANIPULATOR_SCALE)
draw_manipulator_scale(v3d->twmat, 0, 0xFFFF); draw_manipulator_scale(v3d->twmat, 0, MAN_SCALE_C);
if(v3d->twtype & V3D_MANIPULATOR_TRANSLATE) if(v3d->twtype & V3D_MANIPULATOR_TRANSLATE)
draw_manipulator_translate(v3d->twmat, 0, 0xFFFF); draw_manipulator_translate(v3d->twmat, 0, MAN_TRANS_C);
glPopName(); glPopName();
hits= glRenderMode(GL_RENDER); hits= glRenderMode(GL_RENDER);
@@ -1498,14 +1515,22 @@ static int manipulator_selectbuf(ScrArea *sa, float hotspot)
if(hits==1) return buffer[3]; if(hits==1) return buffer[3];
else if(hits>1) { else if(hits>1) {
/* we compare the two first in buffer, but exclude centers */ GLuint mindep, minval;
int a;
if(buffer[3]==MAN_TRANS_C || buffer[3]==MAN_SCALE_C); /* we compare the hits in buffer, but value centers highest */
else if(buffer[4+3]==MAN_TRANS_C || buffer[4+3]==MAN_SCALE_C); mindep= buffer[1];
else { minval= buffer[3];
if(buffer[4+1] < buffer[1]) return buffer[4+3];
for(a=1; a<hits; a++) {
if(minval==MAN_TRANS_C || minval==MAN_SCALE_C) break;
if(buffer[4*a + 3]==MAN_TRANS_C || buffer[4*a + 3]==MAN_SCALE_C || buffer[4*a + 1] < mindep) {
mindep= buffer[4*a + 1];
minval= buffer[4*a + 3];
} }
return buffer[3]; }
return minval;
} }
return 0; return 0;
} }