The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -w
# This code was created by Jeff Molofee '99
# (ported to SDL by Sam Lantinga '2000)
# (ported to Perl/SDL by Wayne Keenan '2000)
#
# If you've found this code useful, please let me know.
#
# Visit me at www.demonews.com/hosted/nehe 

use strict;
use Getopt::Long;

use SDL;
use SDL::App;
use SDL::OpenGL;
use SDL::Event;

my $arg_screen_width =640;
my $arg_screen_height=512;
my $arg_fullscreen=0;
my $delay=30;

GetOptions(
	   "width:i"        => \$arg_screen_width,
	   "height:i"       => \$arg_screen_height,
	   "fullscreen!"    => \$arg_fullscreen,
	   "delay:i"	    => \$delay,
	  ) or die <<USAGE;
Usage $0 -w 800 -h 600 -d 10 --fullscreen 
USAGE

#/* rotation angle for the triangle. */
my $rtri = 0.0;

#/* rotation angle for the quadrilateral. */
my $rquad = 0.0;


main();
exit;


sub main
  {  
   my $done=0;
   my $app = new SDL::App ( -title => "Jeff Molofee's GL Code Tutorial ... NeHe '99", 
			    -icon => "icon.png",
			    -width => $arg_screen_width,
			    -height =>$arg_screen_height,
			    -gl => 1,
			  );
   $app->fullscreen() if $arg_fullscreen;
   
   SDL::ShowCursor(0);   
   
   my $event = new SDL::Event;
   $event->set(SDL_SYSWMEVENT,SDL_IGNORE);#
   


   InitGL($arg_screen_width, $arg_screen_height);

   while ( ! $done ) {

    DrawGLScene();

    $app->sync();
    $app->delay($delay);
   
    $event->pump;
    $event->poll;
    
    
    if ( $event->type == SDL_QUIT ) {
     $done = 1;
    }

    if ( $event->type == SDL_KEYDOWN ) {
     if ( $event->key_sym == SDLK_ESCAPE ) {
      $done = 1;
     }
    }
   }
  }






#########################################################################
#Pretty much in original form, but 'Perlised' 





sub InitGL
  {
   my ($Width, $Height)=@_;

   glViewport(0, 0, $Width, $Height);
   glClearColor(0.0, 0.0, 0.0, 0.0);				# This Will Clear The Background Color To Black
   glClearDepth(1.0);						# Enables Clearing Of The Depth Buffer
   glDepthFunc(GL_LESS);					# The Type Of Depth Test To Do
   glEnable(GL_DEPTH_TEST);					# Enables Depth Testing
   glShadeModel(GL_SMOOTH);					# Enables Smooth Color Shading
   
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();						# Reset The Projection Matrix
   
   gluPerspective(45.0, $Width/$Height, 0.1, 100.0);		# Calculate The Aspect Ratio Of The Window
   
   glMatrixMode(GL_MODELVIEW);
  }



# The main drawing function.
sub DrawGLScene
  {
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);		# Clear The Screen And The Depth Buffer
   glLoadIdentity();						# Reset The View
   
   glTranslate(-1.5,0.0,-6.0);		# Move Left 1.5 Units And Into The Screen 6.0
	
  glRotate($rtri,0.0,1.0,0.0);		# Rotate The Triangle On The Y axis 
  # draw a triangle (in smooth coloring mode)
  glBegin(GL_POLYGON);				# start drawing a polygon
  glColor(1.0,0.0,0.0);			# Set The Color To Red
  glVertex( 0.0, 1.0, 0.0);		# Top
  glColor(0.0,1.0,0.0);			# Set The Color To Green
  glVertex( 1.0,-1.0, 0.0);		# Bottom Right
  glColor(0.0,0.0,1.0);			# Set The Color To Blue
  glVertex(-1.0,-1.0, 0.0);		# Bottom Left	
  glEnd();					# we're done with the polygon (smooth color interpolation)

  glLoadIdentity();				# make sure we're no longer rotated.
  glTranslate(1.5,0.0,-6.0);		# Move Right 3 Units, and back into the screen 6.0
	
  glRotate($rquad,1.0,0.0,0.0);		# Rotate The Quad On The X axis 
  # draw a square (quadrilateral)
  glColor(0.5,0.5,1.0);			# set color to a blue shade.
  glBegin(GL_QUADS);				# start drawing a polygon (4 sided)
  glVertex(-1.0, 1.0, 0.0);		# Top Left
  glVertex( 1.0, 1.0, 0.0);		# Top Right
  glVertex( 1.0,-1.0, 0.0);		# Bottom Right
  glVertex(-1.0,-1.0, 0.0);		# Bottom Left	
  glEnd();					# done with the polygon

  $rtri+=15.0;					# Increase The Rotation Variable For The Triangle
  $rquad-=15.0;					# Decrease The Rotation Variable For The Quad 
 
   
  }