- type TAxis=(ax,ay,az);
- T3DCoordinates=array[TAxis] of GLdouble;
- procedure TGLObject.Project(var Value : T3DCoordinates);
- var ModelView : TMatrixDblArray;
- Projection : TMatrixDblArray;
- ViewPort : TViewPortArray;
- wX,wY,wZ : GLdouble;
- begin
- glGetDoublev(GL_MODELVIEW_MATRIX, @modelView[0]);
- glGetDoublev(GL_PROJECTION_MATRIX, @projection[0]);
- glGetIntegerv(GL_VIEWPORT, @ViewPort[0]);
- gluProject(FTranslation[ax], FTranslation[ay], FTranslation[az],
- ModelView, Projection, ViewPort,
- Value[ax], Value[ay], Value[az]);
- end;
- procedure TGLObject.UnProject(var Value:T3DCoordinates);
- var ModelView : TMatrixDblArray;
- Projection : TMatrixDblArray;
- ViewPort : TViewPortArray;
- wX,wY,wZ : GLdouble;
- begin
- glGetDoublev(GL_MODELVIEW_MATRIX, @modelView[0]);
- glGetDoublev(GL_PROJECTION_MATRIX, @projection[0]);
- glGetIntegerv(GL_VIEWPORT, @ViewPort[0]);
- gluUnProject(Value[ax], ViewPort[3]-Value[ay], Value[az],
- ModelView, Projection, ViewPort,
- Value[ax], Value[ay], Value[az]);
- end;
- { --------------------- }
- procedure TGLCross.SetLeft(const Value: Integer);
- var Coord : T3DCoordinates;
- begin
- if Value<>FLeft then
- begin
- Project(Coord);
- Coord[ax]:=Value;
- UnProject(Coord);
- FTranslation[ax]:=FTranslation[ax]+Coord[ax];
- FLeft:=Value;
- end;
- end;
- procedure TGLCross.Paint;
- begin
- glColor4f(GetRValue(FColor)/255,GetGValue(FColor)/255,GetBValue(FColor)/255,FAlpha);
- glRotatef(FRotation[ax], 1.0, 0.0, 0.0);
- glRotatef(FRotation[ay], 0.0, 1.0, 0.0);
- glRotatef(FRotation[az], 0.0, 0.0, 1.0);
- glTranslatef(FTranslation[ax], FTranslation[ay], FTranslation[az]);
- glBegin(GL_LINE_STRIP);
- glVertex3f(-1.0, 0.0, 1.0);
- glVertex3f( 0.0, 1.0, 1.0);
- glEnd;
- glBegin(GL_LINE_STRIP);
- glVertex3f( 0.0, 0.0, 1.0);
- glVertex3f(-1.0, 1.0, 1.0);
- glEnd;
- end;