8 static void idle(void);
9 static void reshape(int x, int y);
10 static void keydown(unsigned char key, int x, int y);
11 static void keyup(unsigned char key, int x, int y);
12 static void skeydown(int key, int x, int y);
13 static void skeyup(int key, int x, int y);
14 static void mouse(int bn, int st, int x, int y);
15 static void motion(int x, int y);
16 static int translate_skey(int key);
20 #if defined(__unix__) || defined(unix)
25 static void (*glx_swap_interval_ext)();
26 static void (*glx_swap_interval_sgi)();
30 static PROC wgl_swap_interval_ext;
35 int main(int argc, char **argv)
37 glutInit(&argc, argv);
38 glutInitWindowSize(1280, 720);
39 glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
40 glutCreateWindow("raydungeon");
42 glutDisplayFunc(game_display);
44 glutReshapeFunc(reshape);
45 glutKeyboardFunc(keydown);
46 glutKeyboardUpFunc(keyup);
47 glutSpecialFunc(skeydown);
48 glutSpecialUpFunc(skeyup);
50 glutMotionFunc(motion);
51 glutPassiveMotionFunc(motion);
53 if(init_opengl() == -1) {
57 #if defined(__unix__) || defined(unix)
58 xdpy = glXGetCurrentDisplay();
59 xwin = glXGetCurrentDrawable();
61 if(!(glx_swap_interval_ext = glXGetProcAddress((unsigned char*)"glXSwapIntervalEXT"))) {
62 glx_swap_interval_sgi = glXGetProcAddress((unsigned char*)"glXSwapIntervalSGI");
66 wgl_swap_interval_ext = wglGetProcAddress("wglSwapIntervalEXT");
69 game_reshape(glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT));
71 if(game_init(argc, argv) == -1) {
74 atexit(game_shutdown);
79 long game_getmsec(void)
81 return glutGet(GLUT_ELAPSED_TIME);
84 void game_swap_buffers(void)
87 assert(glGetError() == GL_NO_ERROR);
95 void game_resize(int x, int y)
97 if(x == win_width && y == win_height) return;
99 glutReshapeWindow(x, y);
102 void game_fullscreen(int fs)
104 static int prev_w, prev_h;
105 static int prev_grab;
111 if(fs == fullscr) return;
114 prev_w = glutGet(GLUT_WINDOW_WIDTH);
115 prev_h = glutGet(GLUT_WINDOW_HEIGHT);
116 prev_grab = mouse_grabbed;
120 glutReshapeWindow(prev_w, prev_h);
128 void game_grabmouse(int grab)
130 static int prev_x, prev_y;
133 grab = !mouse_grabbed;
136 if(grab == mouse_grabbed) return;
142 glutWarpPointer(win_width / 2, win_height / 2);
143 glutSetCursor(GLUT_CURSOR_NONE);
146 glutWarpPointer(prev_x, prev_y);
147 glutSetCursor(GLUT_CURSOR_INHERIT);
149 mouse_grabbed = grab;
152 #if defined(__unix__) || defined(unix)
153 void game_vsync(int vsync)
155 vsync = vsync ? 1 : 0;
156 if(glx_swap_interval_ext) {
157 glx_swap_interval_ext(xdpy, xwin, vsync);
158 } else if(glx_swap_interval_sgi) {
159 glx_swap_interval_sgi(vsync);
164 void game_vsync(int vsync)
166 if(wgl_swap_interval_ext) {
167 wgl_swap_interval_ext(vsync ? 1 : 0);
174 static void idle(void)
179 static void reshape(int x, int y)
183 glutWarpPointer(x / 2, y / 2);
188 static void keydown(unsigned char key, int x, int y)
190 modkeys = glutGetModifiers();
191 game_keyboard(key, 1);
194 static void keyup(unsigned char key, int x, int y)
196 game_keyboard(key, 0);
199 static void skeydown(int key, int x, int y)
202 modkeys = glutGetModifiers();
203 if((k = translate_skey(key)) >= 0) {
208 static void skeyup(int key, int x, int y)
210 int k = translate_skey(key);
216 static void mouse(int bn, int st, int x, int y)
218 modkeys = glutGetModifiers();
219 game_mouse(bn - GLUT_LEFT_BUTTON, st == GLUT_DOWN, x, y);
222 static void motion(int x, int y)
228 glutWarpPointer(win_width / 2, win_height / 2);
239 static int translate_skey(int key)
250 case GLUT_KEY_PAGE_UP:
252 case GLUT_KEY_PAGE_DOWN:
258 case GLUT_KEY_INSERT:
261 if(key >= GLUT_KEY_F1 && key <= GLUT_KEY_F12) {
262 return key - GLUT_KEY_F1 + GKEY_F1;