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_TQUADS ); 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_TQUADS ); 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_TQUAD_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;