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:
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user