The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

=pod

=for abstract OpenGL example

=for license Artistic License 2.0 | Copyright (C) 2009,2010 by Sanko Robinson

=for author Sanko Robinson <sanko@cpan.org> - http://sankorobinson.com/

=for git $Id: gl.pl 7e88e03 2010-09-17 21:30:36Z sanko@cpan.org $

=cut

use strict;
use warnings;
use FLTK;
$|++;
my $theta     = 0.0;
my $speed     = 0.0;
my $direction = -1;
my $range     = 12;
{

    package MyGlWindow;
    our @ISA = 'FLTK::GlWindow';
    use FLTK qw[:gl];
    use OpenGL;

    sub draw {
        my ($self) = @_;
        if (!$self->valid()) {
            $self->valid(1);
            glLoadIdentity();
            glViewport(0, 0, $self->w(), $self->h());
        }
        glClearColor(0, 0, 0, 0);
        glClear(GL_COLOR_BUFFER_BIT);
        glPushMatrix();
        glRotatef($theta, 0.0, 0.0, 1.0);
        glBegin(GL_TRIANGLES);
        glColor3f(1.0, 0.0, 0.0);
        glVertex2f(0.0, 1.0);
        glColor3f(0.0, 1.0, 0.0);
        glVertex2f(0.87, -0.5);
        glColor3f(0.0, 0.0, 1.0);
        glVertex2f(-0.87, -0.5);
        glEnd();
        glPopMatrix();
        $theta += $speed;
        glsetcolor(FLTK::WHITE());
        glsetfont($self->labelfont(), $self->labelsize() * 3);
        gldrawtext("Hello, World!", -.4, 0);
    }
}
my $gl = MyGlWindow->new(100, 100, 500, 500, 'FLTK OpenGL Window');
$gl->resizable($gl);
$gl->show(1, [qw[T hi s]]);    # this actually opens the window

sub tick {
    my ($v) = @_;
    if ($speed > $range) {
        $direction = -1;
    }
    elsif ($speed < -$range) {
        $direction = 1;
    }
    $speed += (0.1 * $direction);
    $gl->redraw();
    FLTK::add_timeout(0.01, \&tick, $v);
}
FLTK::add_timeout(0.01, \&tick, $gl);
FLTK::run();
$gl->destroy();