From 6e55a1104a76fe4a53d8c67806054bb8761974d7 Mon Sep 17 00:00:00 2001 From: Philippe Houdoin Date: Fri, 30 Jul 2010 12:17:11 +0000 Subject: [PATCH] Expand to dump game mode attributes, clean exit and changing game mode string anytime. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37821 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../kits/opengl/glut/game_mode/game_mode.c | 139 ++++++++++++++---- 1 file changed, 112 insertions(+), 27 deletions(-) diff --git a/src/tests/kits/opengl/glut/game_mode/game_mode.c b/src/tests/kits/opengl/glut/game_mode/game_mode.c index 8c4c1168cf..13e6e1dd12 100644 --- a/src/tests/kits/opengl/glut/game_mode/game_mode.c +++ b/src/tests/kits/opengl/glut/game_mode/game_mode.c @@ -1,10 +1,25 @@ #include +#include + #include + +void display(void); +void idle(void); +void reshape(int w, int h); +void keyboard(unsigned char key, int x, int y); + +void draw_cube(void); +void game_mode(char *mode); +void dump_game_mode(void); +void init(void); +void clean_exit(void); + float spin = 0; -static void + +void draw_cube(void) { glLoadIdentity(); @@ -52,7 +67,7 @@ draw_cube(void) } -static void +void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); @@ -63,10 +78,10 @@ display(void) } -static void +void idle(void) { - spin += 2.0; + spin += 1.0; if (spin > 360.0) spin = 0.0; @@ -74,7 +89,7 @@ idle(void) } -static void +void reshape(int w, int h) { glViewport (0, 0, (GLsizei) w, (GLsizei) h); @@ -97,52 +112,122 @@ reshape(int w, int h) } -static void +void +keyboard(unsigned char key, int x, int y) +{ + switch(key) { + case 27: + exit(0); + break; + + case 'g': + case 'G': + dump_game_mode(); + break; + + case 'e': + case 'E': { + char mode[255]; + + printf("Game mode string? "); + gets(mode); + if (!strlen(mode)) + break; + + game_mode(mode); + if (glutGameModeGet(GLUT_GAME_MODE_DISPLAY_CHANGED)) + init(); + break; + } + } +} + + +void init(void) { glutIdleFunc(idle); glutDisplayFunc(display); glutReshapeFunc(reshape); + glutKeyboardFunc(keyboard); glClearColor(0, 0, 0, 0); + glEnable(GL_DEPTH_TEST); } +void +clean_exit(void) +{ + printf("Exit.\n"); + + if (glutGameModeGet(GLUT_GAME_MODE_ACTIVE)) { + printf("glutLeaveGameMode()\n"); + glutLeaveGameMode(); + } +} + + +void +game_mode(char *mode) +{ + printf("glutGameModeString(\"%s\"): ", mode); + + glutGameModeString(mode); + + if (!glutGameModeGet(GLUT_GAME_MODE_POSSIBLE)) { + printf("*not* possible!\n"); + return; + } + + printf("possible.\nglutEnterGameMode()\n"); + glutEnterGameMode(); + + printf("glutGameModeGet(GLUT_GAME_MODE_DISPLAY_CHANGED) = %d\n", + glutGameModeGet(GLUT_GAME_MODE_DISPLAY_CHANGED)); +} + + +void +dump_game_mode() +{ + printf("glutGameModeGet():\n"); + +# define DUMP(pname) \ + printf("\t" #pname " = %d\n", glutGameModeGet(pname)); + + DUMP(GLUT_GAME_MODE_ACTIVE); + DUMP(GLUT_GAME_MODE_POSSIBLE); + DUMP(GLUT_GAME_MODE_WIDTH); + DUMP(GLUT_GAME_MODE_HEIGHT); + DUMP(GLUT_GAME_MODE_PIXEL_DEPTH); + DUMP(GLUT_GAME_MODE_REFRESH_RATE); + DUMP(GLUT_GAME_MODE_DISPLAY_CHANGED); + +# undef DUMP + + printf("\n"); +} + int main(int argc, char **argv) { glutInit(&argc, argv); - if (argc > 1) { - printf("glutGameModeString(\"%s\"): ", argv[1]); - - glutGameModeString(argv[1]); - - if (!glutGameModeGet(GLUT_GAME_MODE_POSSIBLE)) - printf("*not* possible: fallback to windowed mode.\n"); - else { - printf("possible!\nglutEnterGameMode()\n"); - glutEnterGameMode(); - - printf("glutGameModeGet(GLUT_GAME_MODE_DISPLAY_CHANGED) = %d\n", - glutGameModeGet(GLUT_GAME_MODE_DISPLAY_CHANGED)); - } - } + if (argc > 1) + game_mode(argv[1]); if (!glutGameModeGet(GLUT_GAME_MODE_ACTIVE)) { + printf("Using windowed mode.\n"); + glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutCreateWindow(argv[0]); } init(); - + atexit(clean_exit); glutMainLoop(); - if (glutGameModeGet(GLUT_GAME_MODE_ACTIVE)) { - printf("glutLeaveGameMode()\n"); - glutLeaveGameMode(); - } - return 0; }