Commit | Line | Data |
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 | |
10 | use strict; |
11 | use Getopt::Long; |
12 | |
13 | use SDL; |
14 | use SDL::App; |
15 | use SDL::OpenGL; |
16 | use SDL::Event; |
17 | use SDL::Cursor; |
18 | |
19 | my $arg_screen_width =640; |
20 | my $arg_screen_height=512; |
21 | my $arg_fullscreen=0; |
22 | my $delay = 30; |
23 | |
24 | GetOptions( |
25 | "width:i" => \$arg_screen_width, |
26 | "height:i" => \$arg_screen_height, |
27 | "fullscreen!" => \$arg_fullscreen, |
28 | "delay:i" => \$delay, |
29 | ) or die $!; |
30 | |
31 | main(); |
32 | exit; |
33 | |
34 | |
35 | sub 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. */ |
89 | my $rtri = 0.0; |
90 | |
91 | #/* rotation angle for the quadrilateral. */ |
92 | my $rquad = 0.0; |
93 | |
94 | |
95 | sub 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. |
117 | sub 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 | |