#!/usr/local/bin/perl
#
# double
#
# This program demonstrates double buffering for
# flicker-free animation.
# Adapted from "double", chapter 1, listing 1-3,
# page 17, OpenGL Programming Guide
BEGIN{ unshift(@INC,"../blib"); } # in case OpenGL is built but not installed
BEGIN{ unshift(@INC,"../blib/arch"); } # 5.002 gamma needs this
BEGIN{ unshift(@INC,"../blib/lib"); } # 5.002 gamma needs this
use OpenGL;
$spin = 0.0;
sub myReshape {
# glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho (-50.0, 50.0, -50.0,50.0,-1.0,1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity ();
}
sub display{
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
glRotatef($spin, 0.0, 0.0, 1.0);
($x,$y) = glpXQueryPointer;
glRectf(-25.0, -25.0, 25+$x/10, 25+$y/10);
glPopMatrix();
glFlush();
glXSwapBuffers;
}
$increment=2.0;
sub spinDisplay {
$spin = $spin + $increment;
if ($spin > 360.0) {
$spin = $spin - 360.0;
}
display();
}
glpOpenWindow(attributes=>[GLX_RGBA,GLX_DOUBLEBUFFER]);
glClearColor(0,0,0,1);
glColor3f (1.0, 1.0, 1.0);
glShadeModel (GL_FLAT);
myReshape();
$cb{&ConfigureNotify} = sub { local($e,$w,$h)=@_;glViewport(0,0,$w,$h);
# print "viewport $w,$h\n";
};
$cb{&KeyPress} = sub { # print "@_[1] ",ord(@_[1])," keypress @_\n";
local($ss); &$ss(@_[1]) if ($ss=$kcb{@_[1]}); };
$kcb{'q'} = $kcb{'Q'} = $kcb{"\033"} = sub{ print "Good-Bye\n"; exit 0;};
sub setincrement{$increment = $_[0];}
foreach $i (0..9){
$kcb{"$i"}=\&setincrement;
}
#print "cn=",&ConfigureNotify,"\n";
#print "kn=",KeyPress,"\n";
while(1) {
spinDisplay();
while($p=XPending) {
#print $p,"\n";
@e=&glpXNextEvent;
#print("e=@e\n");
&$s(@e) if($s=$cb{$e[0]});
#print "doncb\n" if ($s);
}
}