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