1
2#include <stdio.h>
3#include <string.h>
4
5#include <GL/glut.h>
6
7
8void display(void);
9void idle(void);
10void reshape(int w, int h);
11void keyboard(unsigned char key, int x, int y);
12
13void draw_cube(void);
14void game_mode(char *mode);
15void dump_game_mode(void);
16void init(void);
17void on_exit(void);
18
19float spin = 0;
20
21
22void
23draw_cube(void)
24{
25  glLoadIdentity();
26
27  /* A step backward, then spin the cube */
28  glTranslatef(0, 0, -5);
29  glRotatef(spin, 0, 0, 1);
30  glRotatef(spin, 1, 0.6, 0);
31
32  /* We tell we want to draw quads */
33  glBegin (GL_QUADS);
34
35  /* Every four calls to glVertex, a quad is drawn */
36  glColor3f(0, 0, 0); glVertex3f(-1, -1, -1);
37  glColor3f(0, 0, 1); glVertex3f(-1, -1,  1);
38  glColor3f(0, 1, 1); glVertex3f(-1,  1,  1);
39  glColor3f(0, 1, 0); glVertex3f(-1,  1, -1);
40
41  glColor3f(1, 0, 0); glVertex3f( 1, -1, -1);
42  glColor3f(1, 0, 1); glVertex3f( 1, -1,  1);
43  glColor3f(1, 1, 1); glVertex3f( 1,  1,  1);
44  glColor3f(1, 1, 0); glVertex3f( 1,  1, -1);
45
46  glColor3f(0, 0, 0); glVertex3f(-1, -1, -1);
47  glColor3f(0, 0, 1); glVertex3f(-1, -1,  1);
48  glColor3f(1, 0, 1); glVertex3f( 1, -1,  1);
49  glColor3f(1, 0, 0); glVertex3f( 1, -1, -1);
50
51  glColor3f(0, 1, 0); glVertex3f(-1,  1, -1);
52  glColor3f(0, 1, 1); glVertex3f(-1,  1,  1);
53  glColor3f(1, 1, 1); glVertex3f( 1,  1,  1);
54  glColor3f(1, 1, 0); glVertex3f( 1,  1, -1);
55
56  glColor3f(0, 0, 0); glVertex3f(-1, -1, -1);
57  glColor3f(0, 1, 0); glVertex3f(-1,  1, -1);
58  glColor3f(1, 1, 0); glVertex3f( 1,  1, -1);
59  glColor3f(1, 0, 0); glVertex3f( 1, -1, -1);
60
61  glColor3f(0, 0, 1); glVertex3f(-1, -1,  1);
62  glColor3f(0, 1, 1); glVertex3f(-1,  1,  1);
63  glColor3f(1, 1, 1); glVertex3f( 1,  1,  1);
64  glColor3f(1, 0, 1); glVertex3f( 1, -1,  1);
65
66  glEnd();
67}
68
69
70void
71display(void)
72{
73  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
74
75  draw_cube();
76
77  glutSwapBuffers();
78}
79
80
81void
82idle(void)
83{
84	spin += 0.5;
85	if (spin > 360.0)
86		spin = 0.0;
87
88	glutPostRedisplay();
89}
90
91
92void
93reshape(int w, int h)
94{
95	glViewport (0, 0, (GLsizei) w, (GLsizei) h);
96	// Setup the view of the cube.
97	glMatrixMode(GL_PROJECTION);
98	glLoadIdentity();
99	gluPerspective( /* field of view in degree */ 40.0,
100		/* aspect ratio */ 1.0,
101		/* Z near */ 1.0, /* Z far */ 10.0);
102	glMatrixMode(GL_MODELVIEW);
103	glLoadIdentity();
104	gluLookAt(0.0, 0.0, 5.0,  // eye is at (0,0,5)
105		0.0, 0.0, 0.0,        // center is at (0,0,0)
106		0.0, 1.0, 0.);        // up is in positive Y direction
107
108	// Adjust cube position to be asthetic angle.
109	glTranslatef(0.0, 0.0, -1.0);
110	glRotatef(60, 1.0, 0.0, 0.0);
111	glRotatef(-20, 0.0, 0.0, 1.0);
112}
113
114
115void
116keyboard(unsigned char key, int x, int y)
117{
118	switch(key) {
119		case 27:
120			exit(0);
121			break;
122
123		case 'g':
124		case 'G':
125			dump_game_mode();
126			break;
127
128		case 'e':
129		case 'E': {
130			char mode[255];
131
132			printf("Game mode string? ");
133			gets(mode);
134			if (!strlen(mode))
135				break;
136
137			game_mode(mode);
138			if (glutGameModeGet(GLUT_GAME_MODE_DISPLAY_CHANGED))
139				init();
140			break;
141		}
142
143		case 'l':
144		case 'L': {
145			// return to default window
146			glutLeaveGameMode();
147			if (!glutGetWindow())
148				// exit if none
149				exit(0);
150			break;
151		}
152	}
153}
154
155
156void
157init(void)
158{
159	glutIdleFunc(idle);
160	glutDisplayFunc(display);
161	glutReshapeFunc(reshape);
162	glutKeyboardFunc(keyboard);
163
164	glClearColor(0, 0, 0, 0);
165	glEnable(GL_DEPTH_TEST);
166}
167
168
169void
170on_exit(void)
171{
172	printf("Exit.\n");
173}
174
175
176void
177game_mode(char *mode)
178{
179	glutGameModeString(mode);
180
181	printf("glutGameModeString(\"%s\"): ", mode);
182	if (!glutGameModeGet(GLUT_GAME_MODE_POSSIBLE)) {
183		printf("*not* possible!\n");
184		return;
185	}
186
187	printf("possible.\nglutEnterGameMode()\n");
188	glutEnterGameMode();
189
190	printf("glutGameModeGet(GLUT_GAME_MODE_DISPLAY_CHANGED) = %d\n",
191			glutGameModeGet(GLUT_GAME_MODE_DISPLAY_CHANGED));
192}
193
194
195void
196dump_game_mode()
197{
198	printf("glutGameModeGet():\n");
199
200#	define DUMP(pname)	\
201	printf("\t" #pname " = %d\n", glutGameModeGet(pname));
202
203	DUMP(GLUT_GAME_MODE_ACTIVE);
204	DUMP(GLUT_GAME_MODE_POSSIBLE);
205	DUMP(GLUT_GAME_MODE_WIDTH);
206	DUMP(GLUT_GAME_MODE_HEIGHT);
207	DUMP(GLUT_GAME_MODE_PIXEL_DEPTH);
208	DUMP(GLUT_GAME_MODE_REFRESH_RATE);
209	DUMP(GLUT_GAME_MODE_DISPLAY_CHANGED);
210
211#	undef DUMP
212
213	printf("\n");
214}
215
216int
217main(int argc, char **argv)
218{
219	glutInit(&argc, argv);
220	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
221
222  	if (argc > 1)
223  		game_mode(argv[1]);
224
225	if (!glutGameModeGet(GLUT_GAME_MODE_ACTIVE)) {
226		printf("Using windowed mode.\n");
227		glutCreateWindow(argv[0]);
228	}
229
230	init();
231
232	atexit(on_exit);
233	glutMainLoop();
234
235	return 0;
236}
237