7 static void idle(void);
8 static void reshape(int x, int y);
9 static void keydown(unsigned char key, int x, int y);
10 static void keyup(unsigned char key, int x, int y);
11 static void skeydown(int key, int x, int y);
12 static void skeyup(int key, int x, int y);
13 static void mouse(int bn, int st, int x, int y);
14 static void motion(int x, int y);
15 static int translate_skey(int key);
19 #if defined(__unix__) || defined(unix)
24 static void (*glx_swap_interval_ext)();
25 static void (*glx_swap_interval_sgi)();
29 static PROC wgl_swap_interval_ext;
34 int main(int argc, char **argv)
36 glutInit(&argc, argv);
37 glutInitWindowSize(1280, 800);
38 glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
39 glutCreateWindow("raydungeon");
41 glutDisplayFunc(game_display);
43 glutReshapeFunc(reshape);
44 glutKeyboardFunc(keydown);
45 glutKeyboardUpFunc(keyup);
46 glutSpecialFunc(skeydown);
47 glutSpecialUpFunc(skeyup);
49 glutMotionFunc(motion);
50 glutPassiveMotionFunc(motion);
52 #if defined(__unix__) || defined(unix)
53 xdpy = glXGetCurrentDisplay();
54 xwin = glXGetCurrentDrawable();
56 if(!(glx_swap_interval_ext = glXGetProcAddress((unsigned char*)"glXSwapIntervalEXT"))) {
57 glx_swap_interval_sgi = glXGetProcAddress((unsigned char*)"glXSwapIntervalSGI");
61 wgl_swap_interval_ext = wglGetProcAddress("wglSwapIntervalEXT");
64 game_reshape(glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT));
66 if(game_init(argc, argv) == -1) {
69 atexit(game_shutdown);
74 long game_getmsec(void)
76 return glutGet(GLUT_ELAPSED_TIME);
79 void game_swap_buffers(void)
82 assert(glGetError() == GL_NO_ERROR);
90 void game_resize(int x, int y)
92 if(x == win_width && y == win_height) return;
94 glutReshapeWindow(x, y);
97 void game_fullscreen(int fs)
99 static int prev_w, prev_h;
100 static int prev_grab;
106 if(fs == fullscr) return;
109 prev_w = glutGet(GLUT_WINDOW_WIDTH);
110 prev_h = glutGet(GLUT_WINDOW_HEIGHT);
111 prev_grab = mouse_grabbed;
115 glutReshapeWindow(prev_w, prev_h);
123 void game_grabmouse(int grab)
125 static int prev_x, prev_y;
128 grab = !mouse_grabbed;
131 if(grab == mouse_grabbed) return;
137 glutWarpPointer(win_width / 2, win_height / 2);
138 glutSetCursor(GLUT_CURSOR_NONE);
141 glutWarpPointer(prev_x, prev_y);
142 glutSetCursor(GLUT_CURSOR_INHERIT);
144 mouse_grabbed = grab;
147 #if defined(__unix__) || defined(unix)
148 void game_vsync(int vsync)
150 vsync = vsync ? 1 : 0;
151 if(glx_swap_interval_ext) {
152 glx_swap_interval_ext(xdpy, xwin, vsync);
153 } else if(glx_swap_interval_sgi) {
154 glx_swap_interval_sgi(vsync);
159 void game_vsync(int vsync)
161 if(wgl_swap_interval_ext) {
162 wgl_swap_interval_ext(vsync ? 1 : 0);
169 static void idle(void)
174 static void reshape(int x, int y)
178 glutWarpPointer(x / 2, y / 2);
183 static void keydown(unsigned char key, int x, int y)
185 modkeys = glutGetModifiers();
186 game_keyboard(key, 1);
189 static void keyup(unsigned char key, int x, int y)
191 game_keyboard(key, 0);
194 static void skeydown(int key, int x, int y)
197 modkeys = glutGetModifiers();
198 if((k = translate_skey(key)) >= 0) {
203 static void skeyup(int key, int x, int y)
205 int k = translate_skey(key);
211 static void mouse(int bn, int st, int x, int y)
213 modkeys = glutGetModifiers();
214 game_mouse(bn - GLUT_LEFT_BUTTON, st == GLUT_DOWN, x, y);
217 static void motion(int x, int y)
223 glutWarpPointer(win_width / 2, win_height / 2);
234 static int translate_skey(int key)
245 case GLUT_KEY_PAGE_UP:
247 case GLUT_KEY_PAGE_DOWN:
253 case GLUT_KEY_INSERT:
256 if(key >= GLUT_KEY_F1 && key <= GLUT_KEY_F12) {
257 return key - GLUT_KEY_F1 + GKEY_F1;