First commit of SDL_Perl-2.1.3
[sdlgit/SDL_perl.git] / test / OpenGL / tutorial / lesson05.pl
CommitLineData
8fde61e3 1#!/usr/bin/perl
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;
17use SDL::Cursor;
18
19my $arg_screen_width =640;
20my $arg_screen_height=512;
21my $arg_fullscreen=0;
22my $delay = 30;
23
24GetOptions(
25 "width:i" => \$arg_screen_width,
26 "height:i" => \$arg_screen_height,
27 "fullscreen!" => \$arg_fullscreen,
28 "delay:i" => \$delay,
29 ) or die $!;
30
31main();
32exit;
33
34
35sub main
36 {
37 my $done=0;
38
39 my $app = new SDL::App ( -title => "Jeff Molofee's GL Code Tutorial ... NeHe '99",
40 -icon => "icon.png",
41 -width => $arg_screen_width,
42 -height =>$arg_screen_height,
43 -opengl => 1,
44 );
45
46 $app->fullscreen if ($arg_fullscreen);
47
48 SDL::ShowCursor(0);
49
50 my $event = new SDL::Event;
51 $event->set(SDL_SYSWMEVENT(),SDL_IGNORE());#
52
53 InitGL($arg_screen_width, $arg_screen_height);
54
55 while ( ! $done ) {
56
57 DrawGLScene();
58
59 $app->sync();
60 $app->delay($delay);
61
62 $event->pump;
63 $event->poll;
64
65
66 if ( $event->type == SDL_QUIT() ) {
67 $done = 1;
68 }
69
70 if ( $event->type == SDL_KEYDOWN() ) {
71 if ( $event->key_sym == SDLK_ESCAPE() ) {
72 $done = 1;
73 }
74 }
75 }
76 }
77
78
79
80
81
82
83#########################################################################
84#Pretty much in original form, but 'Perlised'
85
86
87
88#/* rotation angle for the triangle. */
89my $rtri = 0.0;
90
91#/* rotation angle for the quadrilateral. */
92my $rquad = 0.0;
93
94
95sub InitGL
96 {
97 my ($Width, $Height)=@_;
98
99 glViewport(0, 0, $Width, $Height);
100 glClearColor(0.0, 0.0, 0.0, 0.0); # This Will Clear The Background Color To Black
101 glClearDepth(1.0); # Enables Clearing Of The Depth Buffer
102 glDepthFunc(GL_LESS); # The Type Of Depth Test To Do
103 glEnable(GL_DEPTH_TEST); # Enables Depth Testing
104 glShadeModel(GL_SMOOTH); # Enables Smooth Color Shading
105
106 glMatrixMode(GL_PROJECTION);
107 glLoadIdentity(); # Reset The Projection Matrix
108
109 gluPerspective(45.0, $Width/$Height, 0.1, 100.0); # Calculate The Aspect Ratio Of The Window
110
111 glMatrixMode(GL_MODELVIEW);
112 }
113
114
115
116# The main drawing function.
117sub DrawGLScene
118 {
119 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); # Clear The Screen And The Depth Buffer
120 glLoadIdentity(); # Reset The View
121
122 glTranslate(-1.5,0.0,-6.0); # Move Left 1.5 Units And Into The Screen 6.0
123
124 glRotate($rtri,0.0,1.0,0.0); # Rotate The Pyramid On The Y axis
125
126 # draw a pyramid (in smooth coloring mode)
127 glBegin(GL_POLYGON); # start drawing a pyramid
128
129 # front face of pyramid
130 glColor(1.0,0.0,0.0); # Set The Color To Red
131 glVertex(0.0, 1.0, 0.0); # Top of triangle (front)
132 glColor(0.0,1.0,0.0); # Set The Color To Green
133 glVertex(-1.0,-1.0, 1.0); # left of triangle (front)
134 glColor(0.0,0.0,1.0); # Set The Color To Blue
135 glVertex(1.0,-1.0, 1.0); # right of traingle (front)
136
137 # right face of pyramid
138 glColor(1.0,0.0,0.0); # Red
139 glVertex( 0.0, 1.0, 0.0); # Top Of Triangle (Right)
140 glColor(0.0,0.0,1.0); # Blue
141 glVertex( 1.0,-1.0, 1.0); # Left Of Triangle (Right)
142 glColor(0.0,1.0,0.0); # Green
143 glVertex( 1.0,-1.0, -1.0); # Right Of Triangle (Right)
144
145 # back face of pyramid
146 glColor(1.0,0.0,0.0); # Red
147 glVertex( 0.0, 1.0, 0.0); # Top Of Triangle (Back)
148 glColor(0.0,1.0,0.0); # Green
149 glVertex( 1.0,-1.0, -1.0); # Left Of Triangle (Back)
150 glColor(0.0,0.0,1.0); # Blue
151 glVertex(-1.0,-1.0, -1.0); # Right Of Triangle (Back)
152
153 # left face of pyramid.
154 glColor(1.0,0.0,0.0); # Red
155 glVertex( 0.0, 1.0, 0.0); # Top Of Triangle (Left)
156 glColor(0.0,0.0,1.0); # Blue
157 glVertex(-1.0,-1.0,-1.0); # Left Of Triangle (Left)
158 glColor(0.0,1.0,0.0); # Green
159 glVertex(-1.0,-1.0, 1.0); # Right Of Triangle (Left)
160
161 glEnd(); # Done Drawing The Pyramid
162
163 glLoadIdentity(); # make sure we're no longer rotated.
164 glTranslate(1.5,0.0,-7.0); # Move Right 3 Units, and back into the screen 7
165
166 glRotate($rquad,1.0,1.0,1.0); # Rotate The Cube On X, Y, and Z
167
168 # draw a cube (6 quadrilaterals)
169 glBegin(GL_QUADS); # start drawing the cube.
170
171 # top of cube
172 glColor(0.0,1.0,0.0); # Set The Color To Blue
173 glVertex( 1.0, 1.0,-1.0); # Top Right Of The Quad (Top)
174 glVertex(-1.0, 1.0,-1.0); # Top Left Of The Quad (Top)
175 glVertex(-1.0, 1.0, 1.0); # Bottom Left Of The Quad (Top)
176 glVertex( 1.0, 1.0, 1.0); # Bottom Right Of The Quad (Top)
177
178 # bottom of cube
179 glColor(1.0,0.5,0.0); # Set The Color To Orange
180 glVertex( 1.0,-1.0, 1.0); # Top Right Of The Quad (Bottom)
181 glVertex(-1.0,-1.0, 1.0); # Top Left Of The Quad (Bottom)
182 glVertex(-1.0,-1.0,-1.0); # Bottom Left Of The Quad (Bottom)
183 glVertex( 1.0,-1.0,-1.0); # Bottom Right Of The Quad (Bottom)
184
185 # front of cube
186 glColor(1.0,0.0,0.0); # Set The Color To Red
187 glVertex( 1.0, 1.0, 1.0); # Top Right Of The Quad (Front)
188 glVertex(-1.0, 1.0, 1.0); # Top Left Of The Quad (Front)
189 glVertex(-1.0,-1.0, 1.0); # Bottom Left Of The Quad (Front)
190 glVertex( 1.0,-1.0, 1.0); # Bottom Right Of The Quad (Front)
191
192 # back of cube.
193 glColor(1.0,1.0,0.0); # Set The Color To Yellow
194 glVertex( 1.0,-1.0,-1.0); # Top Right Of The Quad (Back)
195 glVertex(-1.0,-1.0,-1.0); # Top Left Of The Quad (Back)
196 glVertex(-1.0, 1.0,-1.0); # Bottom Left Of The Quad (Back)
197 glVertex( 1.0, 1.0,-1.0); # Bottom Right Of The Quad (Back)
198
199 # left of cube
200 glColor(0.0,0.0,1.0); # Blue
201 glVertex(-1.0, 1.0, 1.0); # Top Right Of The Quad (Left)
202 glVertex(-1.0, 1.0,-1.0); # Top Left Of The Quad (Left)
203 glVertex(-1.0,-1.0,-1.0); # Bottom Left Of The Quad (Left)
204 glVertex(-1.0,-1.0, 1.0); # Bottom Right Of The Quad (Left)
205
206 # Right of cube
207 glColor(1.0,0.0,1.0); # Set The Color To Violet
208 glVertex( 1.0, 1.0,-1.0); # Top Right Of The Quad (Right)
209 glVertex( 1.0, 1.0, 1.0); # Top Left Of The Quad (Right)
210 glVertex( 1.0,-1.0, 1.0); # Bottom Left Of The Quad (Right)
211 glVertex( 1.0,-1.0,-1.0); # Bottom Right Of The Quad (Right)
212 glEnd(); # Done Drawing The Cube
213
214 $rtri+=15.0; # Increase The Rotation Variable For The Triangle
215 $rquad-=15.0; # Decrease The Rotation Variable For The Quad
216
217
218 }
219
220
221
222