xref: /haiku/src/tests/kits/opengl/glut/game_mode/game_mode.c (revision 2d189f198f3bd78c96d4a10dc7de6aa8c9843d60)
19e332eb5SPhilippe Houdoin 
29e332eb5SPhilippe Houdoin #include <stdio.h>
36e55a110SPhilippe Houdoin #include <string.h>
46e55a110SPhilippe Houdoin 
59e332eb5SPhilippe Houdoin #include <GL/glut.h>
69e332eb5SPhilippe Houdoin 
76e55a110SPhilippe Houdoin 
86e55a110SPhilippe Houdoin void display(void);
96e55a110SPhilippe Houdoin void idle(void);
106e55a110SPhilippe Houdoin void reshape(int w, int h);
116e55a110SPhilippe Houdoin void keyboard(unsigned char key, int x, int y);
126e55a110SPhilippe Houdoin 
136e55a110SPhilippe Houdoin void draw_cube(void);
146e55a110SPhilippe Houdoin void game_mode(char *mode);
156e55a110SPhilippe Houdoin void dump_game_mode(void);
166e55a110SPhilippe Houdoin void init(void);
17e70782a5SPhilippe Houdoin void on_exit(void);
186e55a110SPhilippe Houdoin 
199e332eb5SPhilippe Houdoin float spin = 0;
209e332eb5SPhilippe Houdoin 
216e55a110SPhilippe Houdoin 
226e55a110SPhilippe Houdoin void
draw_cube(void)239e332eb5SPhilippe Houdoin draw_cube(void)
249e332eb5SPhilippe Houdoin {
259e332eb5SPhilippe Houdoin   glLoadIdentity();
269e332eb5SPhilippe Houdoin 
279e332eb5SPhilippe Houdoin   /* A step backward, then spin the cube */
289e332eb5SPhilippe Houdoin   glTranslatef(0, 0, -5);
299e332eb5SPhilippe Houdoin   glRotatef(spin, 0, 0, 1);
309e332eb5SPhilippe Houdoin   glRotatef(spin, 1, 0.6, 0);
319e332eb5SPhilippe Houdoin 
329e332eb5SPhilippe Houdoin   /* We tell we want to draw quads */
339e332eb5SPhilippe Houdoin   glBegin (GL_QUADS);
349e332eb5SPhilippe Houdoin 
359e332eb5SPhilippe Houdoin   /* Every four calls to glVertex, a quad is drawn */
369e332eb5SPhilippe Houdoin   glColor3f(0, 0, 0); glVertex3f(-1, -1, -1);
379e332eb5SPhilippe Houdoin   glColor3f(0, 0, 1); glVertex3f(-1, -1,  1);
389e332eb5SPhilippe Houdoin   glColor3f(0, 1, 1); glVertex3f(-1,  1,  1);
399e332eb5SPhilippe Houdoin   glColor3f(0, 1, 0); glVertex3f(-1,  1, -1);
409e332eb5SPhilippe Houdoin 
419e332eb5SPhilippe Houdoin   glColor3f(1, 0, 0); glVertex3f( 1, -1, -1);
429e332eb5SPhilippe Houdoin   glColor3f(1, 0, 1); glVertex3f( 1, -1,  1);
439e332eb5SPhilippe Houdoin   glColor3f(1, 1, 1); glVertex3f( 1,  1,  1);
449e332eb5SPhilippe Houdoin   glColor3f(1, 1, 0); glVertex3f( 1,  1, -1);
459e332eb5SPhilippe Houdoin 
469e332eb5SPhilippe Houdoin   glColor3f(0, 0, 0); glVertex3f(-1, -1, -1);
479e332eb5SPhilippe Houdoin   glColor3f(0, 0, 1); glVertex3f(-1, -1,  1);
489e332eb5SPhilippe Houdoin   glColor3f(1, 0, 1); glVertex3f( 1, -1,  1);
499e332eb5SPhilippe Houdoin   glColor3f(1, 0, 0); glVertex3f( 1, -1, -1);
509e332eb5SPhilippe Houdoin 
519e332eb5SPhilippe Houdoin   glColor3f(0, 1, 0); glVertex3f(-1,  1, -1);
529e332eb5SPhilippe Houdoin   glColor3f(0, 1, 1); glVertex3f(-1,  1,  1);
539e332eb5SPhilippe Houdoin   glColor3f(1, 1, 1); glVertex3f( 1,  1,  1);
549e332eb5SPhilippe Houdoin   glColor3f(1, 1, 0); glVertex3f( 1,  1, -1);
559e332eb5SPhilippe Houdoin 
569e332eb5SPhilippe Houdoin   glColor3f(0, 0, 0); glVertex3f(-1, -1, -1);
579e332eb5SPhilippe Houdoin   glColor3f(0, 1, 0); glVertex3f(-1,  1, -1);
589e332eb5SPhilippe Houdoin   glColor3f(1, 1, 0); glVertex3f( 1,  1, -1);
599e332eb5SPhilippe Houdoin   glColor3f(1, 0, 0); glVertex3f( 1, -1, -1);
609e332eb5SPhilippe Houdoin 
619e332eb5SPhilippe Houdoin   glColor3f(0, 0, 1); glVertex3f(-1, -1,  1);
629e332eb5SPhilippe Houdoin   glColor3f(0, 1, 1); glVertex3f(-1,  1,  1);
639e332eb5SPhilippe Houdoin   glColor3f(1, 1, 1); glVertex3f( 1,  1,  1);
649e332eb5SPhilippe Houdoin   glColor3f(1, 0, 1); glVertex3f( 1, -1,  1);
659e332eb5SPhilippe Houdoin 
669e332eb5SPhilippe Houdoin   glEnd();
679e332eb5SPhilippe Houdoin }
689e332eb5SPhilippe Houdoin 
699e332eb5SPhilippe Houdoin 
706e55a110SPhilippe Houdoin void
display(void)719e332eb5SPhilippe Houdoin display(void)
729e332eb5SPhilippe Houdoin {
739e332eb5SPhilippe Houdoin   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
749e332eb5SPhilippe Houdoin 
759e332eb5SPhilippe Houdoin   draw_cube();
769e332eb5SPhilippe Houdoin 
779e332eb5SPhilippe Houdoin   glutSwapBuffers();
789e332eb5SPhilippe Houdoin }
799e332eb5SPhilippe Houdoin 
809e332eb5SPhilippe Houdoin 
816e55a110SPhilippe Houdoin void
idle(void)829e332eb5SPhilippe Houdoin idle(void)
839e332eb5SPhilippe Houdoin {
84e70782a5SPhilippe Houdoin 	spin += 0.5;
859e332eb5SPhilippe Houdoin 	if (spin > 360.0)
869e332eb5SPhilippe Houdoin 		spin = 0.0;
879e332eb5SPhilippe Houdoin 
889e332eb5SPhilippe Houdoin 	glutPostRedisplay();
899e332eb5SPhilippe Houdoin }
909e332eb5SPhilippe Houdoin 
919e332eb5SPhilippe Houdoin 
926e55a110SPhilippe Houdoin void
reshape(int w,int h)939e332eb5SPhilippe Houdoin reshape(int w, int h)
949e332eb5SPhilippe Houdoin {
959e332eb5SPhilippe Houdoin 	glViewport (0, 0, (GLsizei) w, (GLsizei) h);
969e332eb5SPhilippe Houdoin 	// Setup the view of the cube.
979e332eb5SPhilippe Houdoin 	glMatrixMode(GL_PROJECTION);
989e332eb5SPhilippe Houdoin 	glLoadIdentity();
999e332eb5SPhilippe Houdoin 	gluPerspective( /* field of view in degree */ 40.0,
1009e332eb5SPhilippe Houdoin 		/* aspect ratio */ 1.0,
1019e332eb5SPhilippe Houdoin 		/* Z near */ 1.0, /* Z far */ 10.0);
1029e332eb5SPhilippe Houdoin 	glMatrixMode(GL_MODELVIEW);
1039e332eb5SPhilippe Houdoin 	glLoadIdentity();
1049e332eb5SPhilippe Houdoin 	gluLookAt(0.0, 0.0, 5.0,  // eye is at (0,0,5)
1059e332eb5SPhilippe Houdoin 		0.0, 0.0, 0.0,        // center is at (0,0,0)
1069e332eb5SPhilippe Houdoin 		0.0, 1.0, 0.);        // up is in positive Y direction
1079e332eb5SPhilippe Houdoin 
1089e332eb5SPhilippe Houdoin 	// Adjust cube position to be asthetic angle.
1099e332eb5SPhilippe Houdoin 	glTranslatef(0.0, 0.0, -1.0);
1109e332eb5SPhilippe Houdoin 	glRotatef(60, 1.0, 0.0, 0.0);
1119e332eb5SPhilippe Houdoin 	glRotatef(-20, 0.0, 0.0, 1.0);
1129e332eb5SPhilippe Houdoin }
1139e332eb5SPhilippe Houdoin 
1149e332eb5SPhilippe Houdoin 
1156e55a110SPhilippe Houdoin void
keyboard(unsigned char key,int x,int y)1166e55a110SPhilippe Houdoin keyboard(unsigned char key, int x, int y)
1176e55a110SPhilippe Houdoin {
1186e55a110SPhilippe Houdoin 	switch(key) {
1196e55a110SPhilippe Houdoin 		case 27:
1206e55a110SPhilippe Houdoin 			exit(0);
1216e55a110SPhilippe Houdoin 			break;
1226e55a110SPhilippe Houdoin 
1236e55a110SPhilippe Houdoin 		case 'g':
1246e55a110SPhilippe Houdoin 		case 'G':
1256e55a110SPhilippe Houdoin 			dump_game_mode();
1266e55a110SPhilippe Houdoin 			break;
1276e55a110SPhilippe Houdoin 
1286e55a110SPhilippe Houdoin 		case 'e':
1296e55a110SPhilippe Houdoin 		case 'E': {
1306e55a110SPhilippe Houdoin 			char mode[255];
1316e55a110SPhilippe Houdoin 
1326e55a110SPhilippe Houdoin 			printf("Game mode string? ");
1336e55a110SPhilippe Houdoin 			gets(mode);
1346e55a110SPhilippe Houdoin 			if (!strlen(mode))
1356e55a110SPhilippe Houdoin 				break;
1366e55a110SPhilippe Houdoin 
1376e55a110SPhilippe Houdoin 			game_mode(mode);
1386e55a110SPhilippe Houdoin 			if (glutGameModeGet(GLUT_GAME_MODE_DISPLAY_CHANGED))
1396e55a110SPhilippe Houdoin 				init();
1406e55a110SPhilippe Houdoin 			break;
1416e55a110SPhilippe Houdoin 		}
142*2d189f19SPhilippe Houdoin 
143*2d189f19SPhilippe Houdoin 		case 'l':
144*2d189f19SPhilippe Houdoin 		case 'L': {
145*2d189f19SPhilippe Houdoin 			// return to default window
146*2d189f19SPhilippe Houdoin 			glutLeaveGameMode();
147*2d189f19SPhilippe Houdoin 			if (!glutGetWindow())
148*2d189f19SPhilippe Houdoin 				// exit if none
149*2d189f19SPhilippe Houdoin 				exit(0);
150*2d189f19SPhilippe Houdoin 			break;
151*2d189f19SPhilippe Houdoin 		}
1526e55a110SPhilippe Houdoin 	}
1536e55a110SPhilippe Houdoin }
1546e55a110SPhilippe Houdoin 
1556e55a110SPhilippe Houdoin 
1566e55a110SPhilippe Houdoin void
init(void)1579e332eb5SPhilippe Houdoin init(void)
1589e332eb5SPhilippe Houdoin {
1599e332eb5SPhilippe Houdoin 	glutIdleFunc(idle);
1609e332eb5SPhilippe Houdoin 	glutDisplayFunc(display);
1619e332eb5SPhilippe Houdoin 	glutReshapeFunc(reshape);
1626e55a110SPhilippe Houdoin 	glutKeyboardFunc(keyboard);
1639e332eb5SPhilippe Houdoin 
1649e332eb5SPhilippe Houdoin 	glClearColor(0, 0, 0, 0);
1656e55a110SPhilippe Houdoin 	glEnable(GL_DEPTH_TEST);
1669e332eb5SPhilippe Houdoin }
1679e332eb5SPhilippe Houdoin 
1689e332eb5SPhilippe Houdoin 
1696e55a110SPhilippe Houdoin void
on_exit(void)17024ca4df9SPhilippe Houdoin on_exit(void)
1716e55a110SPhilippe Houdoin {
1726e55a110SPhilippe Houdoin 	printf("Exit.\n");
1736e55a110SPhilippe Houdoin }
1746e55a110SPhilippe Houdoin 
1756e55a110SPhilippe Houdoin 
1766e55a110SPhilippe Houdoin void
game_mode(char * mode)1776e55a110SPhilippe Houdoin game_mode(char *mode)
1786e55a110SPhilippe Houdoin {
1796e55a110SPhilippe Houdoin 	glutGameModeString(mode);
1806e55a110SPhilippe Houdoin 
181e70782a5SPhilippe Houdoin 	printf("glutGameModeString(\"%s\"): ", mode);
1826e55a110SPhilippe Houdoin 	if (!glutGameModeGet(GLUT_GAME_MODE_POSSIBLE)) {
1836e55a110SPhilippe Houdoin 		printf("*not* possible!\n");
1846e55a110SPhilippe Houdoin 		return;
1856e55a110SPhilippe Houdoin 	}
1866e55a110SPhilippe Houdoin 
1876e55a110SPhilippe Houdoin 	printf("possible.\nglutEnterGameMode()\n");
1886e55a110SPhilippe Houdoin 	glutEnterGameMode();
1896e55a110SPhilippe Houdoin 
1906e55a110SPhilippe Houdoin 	printf("glutGameModeGet(GLUT_GAME_MODE_DISPLAY_CHANGED) = %d\n",
1916e55a110SPhilippe Houdoin 			glutGameModeGet(GLUT_GAME_MODE_DISPLAY_CHANGED));
1926e55a110SPhilippe Houdoin }
1936e55a110SPhilippe Houdoin 
1946e55a110SPhilippe Houdoin 
1956e55a110SPhilippe Houdoin void
dump_game_mode()1966e55a110SPhilippe Houdoin dump_game_mode()
1976e55a110SPhilippe Houdoin {
1986e55a110SPhilippe Houdoin 	printf("glutGameModeGet():\n");
1996e55a110SPhilippe Houdoin 
2006e55a110SPhilippe Houdoin #	define DUMP(pname)	\
2016e55a110SPhilippe Houdoin 	printf("\t" #pname " = %d\n", glutGameModeGet(pname));
2026e55a110SPhilippe Houdoin 
2036e55a110SPhilippe Houdoin 	DUMP(GLUT_GAME_MODE_ACTIVE);
2046e55a110SPhilippe Houdoin 	DUMP(GLUT_GAME_MODE_POSSIBLE);
2056e55a110SPhilippe Houdoin 	DUMP(GLUT_GAME_MODE_WIDTH);
2066e55a110SPhilippe Houdoin 	DUMP(GLUT_GAME_MODE_HEIGHT);
2076e55a110SPhilippe Houdoin 	DUMP(GLUT_GAME_MODE_PIXEL_DEPTH);
2086e55a110SPhilippe Houdoin 	DUMP(GLUT_GAME_MODE_REFRESH_RATE);
2096e55a110SPhilippe Houdoin 	DUMP(GLUT_GAME_MODE_DISPLAY_CHANGED);
2106e55a110SPhilippe Houdoin 
2116e55a110SPhilippe Houdoin #	undef DUMP
2126e55a110SPhilippe Houdoin 
2136e55a110SPhilippe Houdoin 	printf("\n");
2146e55a110SPhilippe Houdoin }
2156e55a110SPhilippe Houdoin 
2169e332eb5SPhilippe Houdoin int
main(int argc,char ** argv)2179e332eb5SPhilippe Houdoin main(int argc, char **argv)
2189e332eb5SPhilippe Houdoin {
2199e332eb5SPhilippe Houdoin 	glutInit(&argc, argv);
22092f5c6a2SPhilippe Houdoin 	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
2219e332eb5SPhilippe Houdoin 
2226e55a110SPhilippe Houdoin   	if (argc > 1)
2236e55a110SPhilippe Houdoin   		game_mode(argv[1]);
2249e332eb5SPhilippe Houdoin 
2259e332eb5SPhilippe Houdoin 	if (!glutGameModeGet(GLUT_GAME_MODE_ACTIVE)) {
2266e55a110SPhilippe Houdoin 		printf("Using windowed mode.\n");
2279e332eb5SPhilippe Houdoin 		glutCreateWindow(argv[0]);
2289e332eb5SPhilippe Houdoin 	}
2299e332eb5SPhilippe Houdoin 
2309e332eb5SPhilippe Houdoin 	init();
2319e332eb5SPhilippe Houdoin 
23224ca4df9SPhilippe Houdoin 	atexit(on_exit);
2339e332eb5SPhilippe Houdoin 	glutMainLoop();
2349e332eb5SPhilippe Houdoin 
2359e332eb5SPhilippe Houdoin 	return 0;
2369e332eb5SPhilippe Houdoin }
237