You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
150 lines
2.9 KiB
Perl
150 lines
2.9 KiB
Perl
package GLBox;
|
|
|
|
use OpenGL qw(:all);
|
|
|
|
use strict;
|
|
|
|
use TQt;
|
|
use TQt::isa qw(TQt::GLWidget);
|
|
use TQt::slots
|
|
setXRotation => ['int'],
|
|
setYRotation => ['int'],
|
|
setZRotation => ['int'];
|
|
use TQt::attributes qw(
|
|
xRot
|
|
yRot
|
|
zRot
|
|
scale
|
|
object
|
|
list
|
|
);
|
|
|
|
sub NEW {
|
|
shift->SUPER::NEW(@_);
|
|
xRot = yRot = zRot = 0.0;
|
|
scale = 1.25;
|
|
object = undef;
|
|
}
|
|
|
|
sub paintGL
|
|
{
|
|
glClear( GL_COLOR_BUFFER_BIT );
|
|
glClear( GL_DEPTH_BUFFER_BIT );
|
|
|
|
glLoadIdentity();
|
|
glTranslatef( 0.0, 0.0, -10.0 );
|
|
glScalef( scale, scale, scale );
|
|
|
|
glRotatef( xRot, 1.0, 0.0, 0.0 );
|
|
glRotatef( yRot, 0.0, 1.0, 0.0 );
|
|
glRotatef( zRot, 0.0, 0.0, 1.0 );
|
|
|
|
glCallList( object );
|
|
}
|
|
|
|
sub initializeGL
|
|
{
|
|
qglClearColor( &black ); # Let OpenGL clear to black
|
|
object = makeObject(); # Generate an OpenGL display list
|
|
glShadeModel( GL_FLAT );
|
|
glEnable( GL_DEPTH_TEST );
|
|
}
|
|
|
|
# Set up the OpenGL view port, matrix mode, etc.
|
|
|
|
sub resizeGL
|
|
{
|
|
my $w = shift;
|
|
my $h = shift;
|
|
glViewport( 0, 0, $w, $h );
|
|
glMatrixMode( GL_PROJECTION );
|
|
glLoadIdentity();
|
|
glFrustum( -1.0, 1.0, -1.0, 1.0, 5.0, 15.0 );
|
|
glMatrixMode( GL_MODELVIEW );
|
|
}
|
|
|
|
# Generate an OpenGL display list for the object to be shown, i.e. the box
|
|
|
|
sub makeObject
|
|
{
|
|
my $list = glGenLists( 1 );
|
|
|
|
glNewList( $list, GL_COMPILE );
|
|
|
|
qglColor( &darkGreen ); # Shorthand for glColor3f or glIndex
|
|
|
|
glLineWidth( 2.0 );
|
|
|
|
glBegin( GL_QUADS );
|
|
glVertex3f( 1.0, 0.5, -0.4 );
|
|
glVertex3f( 1.0, -0.5, -0.4 );
|
|
glVertex3f( -1.0, -0.5, -0.4 );
|
|
glVertex3f( -1.0, 0.5, -0.4 );
|
|
glEnd();
|
|
|
|
qglColor( &blue );
|
|
|
|
glBegin( GL_QUADS );
|
|
glVertex3f( 1.0, 0.5, 0.4 );
|
|
glVertex3f( 1.0, -0.5, 0.4 );
|
|
glVertex3f( -1.0, -0.5, 0.4 );
|
|
glVertex3f( -1.0, 0.5, 0.4 );
|
|
glEnd();
|
|
|
|
qglColor( &darkRed );
|
|
|
|
glBegin( GL_QUAD_STRIP );
|
|
glVertex3f( 1.0, 0.5, -0.4 ); glVertex3f( 1.0, 0.5, 0.4 );
|
|
glVertex3f( 1.0, -0.5, -0.4 ); glVertex3f( 1.0, -0.5, 0.4 );
|
|
qglColor( &yellow );
|
|
glVertex3f( -1.0, -0.5, -0.4 ); glVertex3f( -1.0, -0.5, 0.4 );
|
|
qglColor( &green );
|
|
glVertex3f( -1.0, 0.5, -0.4 ); glVertex3f( -1.0, 0.5, 0.4 );
|
|
qglColor( &lightGray );
|
|
glVertex3f( 1.0, 0.5, -0.4 ); glVertex3f( 1.0, 0.5, 0.4 );
|
|
glEnd();
|
|
|
|
glEndList();
|
|
|
|
return $list;
|
|
}
|
|
|
|
|
|
|
|
# Set the rotation angle of the object to \e degrees around the X axis.
|
|
|
|
sub setXRotation
|
|
{
|
|
my $deg = shift;
|
|
xRot = $deg % 360;
|
|
updateGL();
|
|
}
|
|
|
|
|
|
# Set the rotation angle of the object to \e degrees around the Y axis.
|
|
|
|
sub setYRotation
|
|
{
|
|
my $deg = shift;
|
|
yRot = $deg % 360;
|
|
updateGL();
|
|
}
|
|
|
|
|
|
# Set the rotation angle of the object to \e degrees around the Z axis.
|
|
|
|
sub setZRotation
|
|
{
|
|
my $deg = shift;
|
|
zRot = $deg % 360;
|
|
updateGL();
|
|
}
|
|
|
|
sub DESTROY
|
|
{
|
|
# makeCurrent();
|
|
glDeleteLists( object, 1 );
|
|
}
|
|
|
|
1;
|