1 /*----------------------------------------------------------------
2 * test.c -- Allegro-GL test program
3 *----------------------------------------------------------------
4 * Based on firstogl.c.
5 */
6
7
8 #include <allegro.h>
9
10 /* Note: Under Windows, if you include any Windows headers (e.g. GL/gl.h),
11 * you must include <winalleg.h> first. To save you working out when this
12 * occurs, `alleggl.h' handles this for you, and includes <GL/gl.h>. If
13 * you need other GL headers, include them afterwards.
14 *
15 * Also note that user programs, outside of this library distribution,
16 * should use <...> notation for `alleggl.h'.
17 */
18 #include "alleggl.h"
19
20
21 void display (void);
22
23
24 struct camera {
25 double xangle, yangle, zangle;
26 double dist;
27 };
28
29 struct camera camera = {
30 0.0, 0.0, 0.0,
31 20.0
32 };
33
34 double angle_speed = 5.0;
35 double dist_speed = 1.0;
36
37 int frames = 0;
38 volatile int secs;
39
40
41
secs_timer(void)42 void secs_timer(void)
43 {
44 secs++;
45 }
46 END_OF_FUNCTION(secs_timer);
47
48
49
set_camera_position(void)50 void set_camera_position (void)
51 {
52 glMatrixMode (GL_PROJECTION);
53 glLoadIdentity ();
54 glFrustum (-1.0, 1.0, -1.0, 1.0, 1.0, 40.0);
55 glMatrixMode (GL_MODELVIEW);
56 }
57
58
59
keyboard(void)60 void keyboard (void)
61 {
62 if (key[KEY_LEFT]) camera.yangle += angle_speed;
63 if (key[KEY_RIGHT]) camera.yangle -= angle_speed;
64
65 if (key[KEY_UP]) camera.xangle += angle_speed;
66 if (key[KEY_DOWN]) camera.xangle -= angle_speed;
67
68 if (key[KEY_PGUP]) camera.dist -= dist_speed;
69 if (key[KEY_PGDN]) camera.dist += dist_speed;
70
71 set_camera_position();
72 display();
73 }
74
display(void)75 void display (void)
76 {
77 // Clear the RGB buffer and the depth buffer
78 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
79
80 // Set the modelview matrix to be the identity matrix
81 glLoadIdentity();
82
83 //Set the camera
84 glTranslatef (0, 0, -camera.dist);
85 glRotatef (camera.xangle, 1, 0, 0);
86 glRotatef (camera.yangle, 0, 1, 0);
87 glRotatef (camera.zangle, 0, 0, 1);
88
89 // Save the camera matrix
90 glPushMatrix();
91
92 // Translate and rotate the object
93 glTranslatef(-2.5, 0.0, 0.0);
94 glRotatef(-30, 1.0, 0.0, 0.0);
95 glRotatef(30, 0.0, 1.0, 0.0);
96 glRotatef(30, 0.0, 0.0, 1.0);
97
98 glColor3f(1.0, 0.0, 1.0);
99
100 // Draw the sides of the three-sided pyramid
101 glBegin(GL_TRIANGLE_FAN);
102 glVertex3d(0, 4, 0);
103 glVertex3d(0, -4, -4);
104 glVertex3d(-4, -4, 4);
105 glVertex3d(4, -4, 4);
106 glVertex3d(0, -4, -4);
107 glEnd();
108
109 glColor3f(0.0, 1.0, 1.0);
110
111 // Draw the base of the pyramid
112 glBegin(GL_TRIANGLES);
113 glVertex3d(0, -4, -4);
114 glVertex3d(4, -4, 4);
115 glVertex3d(-4, -4, 4);
116 glEnd();
117
118 // Get the camera matrix back
119 glPopMatrix();
120
121 // Translate for the cube
122 glTranslatef(2.5, 0.0, 0.0);
123 glRotatef(45, 1.0, 0.0, 0.0);
124 glRotatef(45, 0.0, 1.0, 0.0);
125 glRotatef(45, 0.0, 0.0, 1.0);
126
127 glColor3f(0.0, 1.0, 0.0);
128
129 // Draw the sides of the cube
130 glBegin(GL_QUAD_STRIP);
131 glVertex3d(3, 3, -3);
132 glVertex3d(3, -3, -3);
133 glVertex3d(-3, 3, -3);
134 glVertex3d(-3, -3, -3);
135 glVertex3d(-3, 3, 3);
136 glVertex3d(-3, -3, 3);
137 glVertex3d(3, 3, 3);
138 glVertex3d(3, -3, 3);
139 glVertex3d(3, 3, -3);
140 glVertex3d(3, -3, -3);
141 glEnd();
142
143 glColor3f(0.0, 0.0, 1.0);
144
145 // Draw the top and bottom of the cube
146 glBegin(GL_QUADS);
147 glVertex3d(-3, -3, -3);
148 glVertex3d(3, -3, -3);
149 glVertex3d(3, -3, 3);
150 glVertex3d(-3, -3, 3);
151
152 glVertex3d(-3, 3, -3);
153 glVertex3d(-3, 3, 3);
154 glVertex3d(3, 3, 3);
155 glVertex3d(3, 3, -3);
156 glEnd();
157
158 glFlush();
159
160 allegro_gl_flip();
161
162 frames++;
163 }
164
165
166
main()167 int main ()
168 {
169 allegro_init();
170
171 install_allegro_gl();
172
173 allegro_gl_clear_settings();
174 allegro_gl_set (AGL_COLOR_DEPTH, 32);
175 allegro_gl_set (AGL_Z_DEPTH, 24);
176 allegro_gl_set (AGL_FULLSCREEN, TRUE);
177 allegro_gl_set (AGL_DOUBLEBUFFER, 1);
178 allegro_gl_set (AGL_SUGGEST, AGL_COLOR_DEPTH | AGL_Z_DEPTH
179 | AGL_DOUBLEBUFFER | AGL_FULLSCREEN);
180
181 if (set_gfx_mode(GFX_OPENGL, 640, 480, 0, 0) < 0) {
182 allegro_message ("Error setting OpenGL graphics mode:\n%s\n"
183 "Allegro GL error : %s\n",
184 allegro_error, allegro_gl_error);
185 return -1;
186 }
187
188 install_keyboard();
189 install_timer();
190
191 LOCK_FUNCTION(secs_timer);
192 LOCK_VARIABLE(secs);
193
194 glShadeModel (GL_FLAT);
195 glEnable (GL_DEPTH_TEST);
196 glCullFace (GL_BACK);
197 glEnable (GL_CULL_FACE);
198
199 install_int (secs_timer, 1000);
200
201 do {
202 keyboard();
203 } while (!key[KEY_ESC]);
204
205 set_gfx_mode (GFX_TEXT, 0, 0, 0, 0);
206
207 allegro_message("Frames: %i, Seconds: %i, FPS: %f\n",
208 frames, secs, (float)frames / (float)secs);
209
210 return 0;
211 }
212 END_OF_MAIN()
213
214