X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Fmain.c;fp=src%2Fmain.c;h=e96732fee471b1a46799d2fc52f99cb108f36947;hb=d5f45e3128c537f272615cf76242e1dfebccdee7;hp=5d6cc821e4d53ddaa2e6ab1b5049ad9702c3b4fc;hpb=dd7ce87b0ad2b8a1b4758bcc9354e993b71c8599;p=raydungeon diff --git a/src/main.c b/src/main.c index 5d6cc82..e96732f 100644 --- a/src/main.c +++ b/src/main.c @@ -5,13 +5,31 @@ #include "game.h" static void idle(void); +static void reshape(int x, int y); static void keydown(unsigned char key, int x, int y); static void keyup(unsigned char key, int x, int y); static void skeydown(int key, int x, int y); static void skeyup(int key, int x, int y); static void mouse(int bn, int st, int x, int y); +static void motion(int x, int y); static int translate_skey(int key); +static int warping; + +#if defined(__unix__) || defined(unix) +#include +static Display *xdpy; +static Window xwin; + +static void (*glx_swap_interval_ext)(); +static void (*glx_swap_interval_sgi)(); +#endif +#ifdef _WIN32 +#include +static PROC wgl_swap_interval_ext; +#endif + + int main(int argc, char **argv) { @@ -22,15 +40,30 @@ int main(int argc, char **argv) glutDisplayFunc(game_display); glutIdleFunc(idle); - glutReshapeFunc(game_reshape); + glutReshapeFunc(reshape); glutKeyboardFunc(keydown); glutKeyboardUpFunc(keyup); glutSpecialFunc(skeydown); glutSpecialUpFunc(skeyup); glutMouseFunc(mouse); - glutMotionFunc(game_motion); + glutMotionFunc(motion); + glutPassiveMotionFunc(motion); + +#if defined(__unix__) || defined(unix) + xdpy = glXGetCurrentDisplay(); + xwin = glXGetCurrentDrawable(); + + if(!(glx_swap_interval_ext = glXGetProcAddress((unsigned char*)"glXSwapIntervalEXT"))) { + glx_swap_interval_sgi = glXGetProcAddress((unsigned char*)"glXSwapIntervalSGI"); + } +#endif +#ifdef _WIN32 + wgl_swap_interval_ext = wglGetProcAddress("wglSwapIntervalEXT"); +#endif - if(game_init() == -1) { + game_reshape(glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT)); + + if(game_init(argc, argv) == -1) { return 1; } atexit(game_shutdown); @@ -38,6 +71,11 @@ int main(int argc, char **argv) return 0; } +long game_getmsec(void) +{ + return glutGet(GLUT_ELAPSED_TIME); +} + void game_swap_buffers(void) { glutSwapBuffers(); @@ -49,14 +87,102 @@ void game_quit(void) exit(0); } +void game_resize(int x, int y) +{ + if(x == win_width && y == win_height) return; + + glutReshapeWindow(x, y); +} + +void game_fullscreen(int fs) +{ + static int prev_w, prev_h; + static int prev_grab; + + if(fs == -1) { + fs = !fullscr; + } + + if(fs == fullscr) return; + + if(fs) { + prev_w = glutGet(GLUT_WINDOW_WIDTH); + prev_h = glutGet(GLUT_WINDOW_HEIGHT); + prev_grab = mouse_grabbed; + game_grabmouse(1); + glutFullScreen(); + } else { + glutReshapeWindow(prev_w, prev_h); + if(!prev_grab) { + game_grabmouse(0); + } + } + fullscr = fs; +} + +void game_grabmouse(int grab) +{ + static int prev_x, prev_y; + + if(grab == -1) { + grab = !mouse_grabbed; + } + + if(grab == mouse_grabbed) return; + + if(grab) { + warping = 1; + prev_x = mouse_x; + prev_y = mouse_y; + glutWarpPointer(win_width / 2, win_height / 2); + glutSetCursor(GLUT_CURSOR_NONE); + } else { + warping = 1; + glutWarpPointer(prev_x, prev_y); + glutSetCursor(GLUT_CURSOR_INHERIT); + } + mouse_grabbed = grab; +} + +#if defined(__unix__) || defined(unix) +void game_vsync(int vsync) +{ + vsync = vsync ? 1 : 0; + if(glx_swap_interval_ext) { + glx_swap_interval_ext(xdpy, xwin, vsync); + } else if(glx_swap_interval_sgi) { + glx_swap_interval_sgi(vsync); + } +} +#endif +#ifdef WIN32 +void game_vsync(int vsync) +{ + if(wgl_swap_interval_ext) { + wgl_swap_interval_ext(vsync ? 1 : 0); + } +} +#endif + + static void idle(void) { glutPostRedisplay(); } +static void reshape(int x, int y) +{ + if(fullscr) { + warping = 1; + glutWarpPointer(x / 2, y / 2); + } + game_reshape(x, y); +} + static void keydown(unsigned char key, int x, int y) { + modkeys = glutGetModifiers(); game_keyboard(key, 1); } @@ -67,8 +193,9 @@ static void keyup(unsigned char key, int x, int y) static void skeydown(int key, int x, int y) { - int k = translate_skey(key); - if(k >= 0) { + int k; + modkeys = glutGetModifiers(); + if((k = translate_skey(key)) >= 0) { game_keyboard(k, 1); } } @@ -83,9 +210,27 @@ static void skeyup(int key, int x, int y) static void mouse(int bn, int st, int x, int y) { + modkeys = glutGetModifiers(); game_mouse(bn - GLUT_LEFT_BUTTON, st == GLUT_DOWN, x, y); } +static void motion(int x, int y) +{ + if(mouse_grabbed) { + if(!warping) { + game_motion(x, y); + warping = 1; + glutWarpPointer(win_width / 2, win_height / 2); + } else { + warping = 0; + mouse_x = x; + mouse_y = y; + } + } else { + game_motion(x, y); + } +} + static int translate_skey(int key) { switch(key) { @@ -109,7 +254,7 @@ static int translate_skey(int key) return GKEY_INS; default: if(key >= GLUT_KEY_F1 && key <= GLUT_KEY_F12) { - return key - (GLUT_KEY_F1 + GKEY_F1); + return key - GLUT_KEY_F1 + GKEY_F1; } }