xref: /haiku/src/tests/kits/opengl/glut/game_mode/game_mode.c (revision 22440f4105cafc95cc1d49f9bc65bb395c527d86)
1 
2 #include <stdio.h>
3 #include <string.h>
4 
5 #include <GL/glut.h>
6 
7 
8 void display(void);
9 void idle(void);
10 void reshape(int w, int h);
11 void keyboard(unsigned char key, int x, int y);
12 
13 void draw_cube(void);
14 void game_mode(char *mode);
15 void dump_game_mode(void);
16 void init(void);
17 void on_exit(void);
18 
19 float spin = 0;
20 
21 
22 void
23 draw_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 
70 void
71 display(void)
72 {
73   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
74 
75   draw_cube();
76 
77   glutSwapBuffers();
78 }
79 
80 
81 void
82 idle(void)
83 {
84 	spin += 0.5;
85 	if (spin > 360.0)
86 		spin = 0.0;
87 
88 	glutPostRedisplay();
89 }
90 
91 
92 void
93 reshape(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 
115 void
116 keyboard(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 
156 void
157 init(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 
169 void
170 on_exit(void)
171 {
172 	printf("Exit.\n");
173 }
174 
175 
176 void
177 game_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 
195 void
196 dump_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 
216 int
217 main(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