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.
libtqt-perl/PerlTQt/examples/opengl/box/GLBox.pm

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;