First commit of SDL_Perl-2.1.3
[sdlgit/SDL_perl.git] / test / OpenGL / tutorial / lesson04.pl
CommitLineData
8fde61e3 1#!/usr/bin/perl -w
2# This code was created by Jeff Molofee '99
3# (ported to SDL by Sam Lantinga '2000)
4# (ported to Perl/SDL by Wayne Keenan '2000)
5#
6# If you've found this code useful, please let me know.
7#
8# Visit me at www.demonews.com/hosted/nehe
9
10use strict;
11use Getopt::Long;
12
13use SDL;
14use SDL::App;
15use SDL::OpenGL;
16use SDL::Event;
17
18my $arg_screen_width =640;
19my $arg_screen_height=512;
20my $arg_fullscreen=0;
21my $delay=30;
22
23GetOptions(
24 "width:i" => \$arg_screen_width,
25 "height:i" => \$arg_screen_height,
26 "fullscreen!" => \$arg_fullscreen,
27 "delay:i" => \$delay,
28 ) or die <<USAGE;
29Usage $0 -w 800 -h 600 -d 10 --fullscreen
30USAGE
31
32#/* rotation angle for the triangle. */
33my $rtri = 0.0;
34
35#/* rotation angle for the quadrilateral. */
36my $rquad = 0.0;
37
38
39main();
40exit;
41
42
43sub main
44 {
45 my $done=0;
46 my $app = new SDL::App ( -title => "Jeff Molofee's GL Code Tutorial ... NeHe '99",
47 -icon => "icon.png",
48 -width => $arg_screen_width,
49 -height =>$arg_screen_height,
50 -gl => 1,
51 );
52 $app->fullscreen() if $arg_fullscreen;
53
54 SDL::ShowCursor(0);
55
56 my $event = new SDL::Event;
57 $event->set(SDL_SYSWMEVENT,SDL_IGNORE);#
58
59
60
61 InitGL($arg_screen_width, $arg_screen_height);
62
63 while ( ! $done ) {
64
65 DrawGLScene();
66
67 $app->sync();
68 $app->delay($delay);
69
70 $event->pump;
71 $event->poll;
72
73
74 if ( $event->type == SDL_QUIT ) {
75 $done = 1;
76 }
77
78 if ( $event->type == SDL_KEYDOWN ) {
79 if ( $event->key_sym == SDLK_ESCAPE ) {
80 $done = 1;
81 }
82 }
83 }
84 }
85
86
87
88
89
90
91#########################################################################
92#Pretty much in original form, but 'Perlised'
93
94
95
96
97
98sub InitGL
99 {
100 my ($Width, $Height)=@_;
101
102 glViewport(0, 0, $Width, $Height);
103 glClearColor(0.0, 0.0, 0.0, 0.0); # This Will Clear The Background Color To Black
104 glClearDepth(1.0); # Enables Clearing Of The Depth Buffer
105 glDepthFunc(GL_LESS); # The Type Of Depth Test To Do
106 glEnable(GL_DEPTH_TEST); # Enables Depth Testing
107 glShadeModel(GL_SMOOTH); # Enables Smooth Color Shading
108
109 glMatrixMode(GL_PROJECTION);
110 glLoadIdentity(); # Reset The Projection Matrix
111
112 gluPerspective(45.0, $Width/$Height, 0.1, 100.0); # Calculate The Aspect Ratio Of The Window
113
114 glMatrixMode(GL_MODELVIEW);
115 }
116
117
118
119# The main drawing function.
120sub DrawGLScene
121 {
122 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); # Clear The Screen And The Depth Buffer
123 glLoadIdentity(); # Reset The View
124
125 glTranslate(-1.5,0.0,-6.0); # Move Left 1.5 Units And Into The Screen 6.0
126
127 glRotate($rtri,0.0,1.0,0.0); # Rotate The Triangle On The Y axis
128 # draw a triangle (in smooth coloring mode)
129 glBegin(GL_POLYGON); # start drawing a polygon
130 glColor(1.0,0.0,0.0); # Set The Color To Red
131 glVertex( 0.0, 1.0, 0.0); # Top
132 glColor(0.0,1.0,0.0); # Set The Color To Green
133 glVertex( 1.0,-1.0, 0.0); # Bottom Right
134 glColor(0.0,0.0,1.0); # Set The Color To Blue
135 glVertex(-1.0,-1.0, 0.0); # Bottom Left
136 glEnd(); # we're done with the polygon (smooth color interpolation)
137
138 glLoadIdentity(); # make sure we're no longer rotated.
139 glTranslate(1.5,0.0,-6.0); # Move Right 3 Units, and back into the screen 6.0
140
141 glRotate($rquad,1.0,0.0,0.0); # Rotate The Quad On The X axis
142 # draw a square (quadrilateral)
143 glColor(0.5,0.5,1.0); # set color to a blue shade.
144 glBegin(GL_QUADS); # start drawing a polygon (4 sided)
145 glVertex(-1.0, 1.0, 0.0); # Top Left
146 glVertex( 1.0, 1.0, 0.0); # Top Right
147 glVertex( 1.0,-1.0, 0.0); # Bottom Right
148 glVertex(-1.0,-1.0, 0.0); # Bottom Left
149 glEnd(); # done with the polygon
150
151 $rtri+=15.0; # Increase The Rotation Variable For The Triangle
152 $rquad-=15.0; # Decrease The Rotation Variable For The Quad
153
154
155 }
156
157
158
159