nuclear@0: #include nuclear@0: #include nuclear@0: #include nuclear@0: #ifdef __APPLE__ nuclear@0: #include nuclear@0: #else nuclear@0: #include nuclear@0: #endif nuclear@0: #include "game.h" nuclear@0: #include "opt.h" nuclear@0: nuclear@0: static void display(); nuclear@0: static void idle(); nuclear@0: static void reshape(int x, int y); nuclear@0: static void keydown(unsigned char key, int x, int y); nuclear@0: static void keyup(unsigned char key, int x, int y); nuclear@0: static void mouse(int bn, int st, int x, int y); nuclear@0: static void motion(int x, int y); nuclear@0: static void update_modifiers(); nuclear@0: nuclear@0: static unsigned int start_time; nuclear@0: nuclear@0: int main(int argc, char **argv) nuclear@0: { nuclear@0: glutInit(&argc, argv); nuclear@0: if(!init_options(argc, argv)) { nuclear@0: return 1; nuclear@0: } nuclear@0: glutInitWindowSize(opt.xres, opt.yres); nuclear@0: glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE | GLUT_MULTISAMPLE); nuclear@0: glutCreateWindow("umonster"); nuclear@0: nuclear@0: if(opt.fullscreen) { nuclear@0: set_fullscreen(true); nuclear@0: } nuclear@0: nuclear@0: glutDisplayFunc(display); nuclear@0: glutIdleFunc(idle); nuclear@0: glutReshapeFunc(reshape); nuclear@0: glutKeyboardFunc(keydown); nuclear@0: glutKeyboardUpFunc(keyup); nuclear@0: glutMouseFunc(mouse); nuclear@0: glutMotionFunc(motion); nuclear@0: glutPassiveMotionFunc(motion); nuclear@0: nuclear@0: if(!game_init()) { nuclear@0: return 1; nuclear@0: } nuclear@0: atexit(game_cleanup); nuclear@0: nuclear@0: start_time = glutGet(GLUT_ELAPSED_TIME); nuclear@0: glutMainLoop(); nuclear@0: return 0; nuclear@0: } nuclear@0: nuclear@0: void set_fullscreen(bool fs) nuclear@0: { nuclear@0: if(fs) { nuclear@0: glutFullScreen(); nuclear@0: } else { nuclear@0: glutReshapeWindow(opt.xres, opt.yres); nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: void redisplay() nuclear@0: { nuclear@0: glutPostRedisplay(); nuclear@0: } nuclear@0: nuclear@0: void quit() nuclear@0: { nuclear@0: exit(0); nuclear@0: } nuclear@0: nuclear@0: void draw_teapot() nuclear@0: { nuclear@0: glFrontFace(GL_CW); nuclear@0: glutSolidTeapot(1.0); nuclear@0: glFrontFace(GL_CCW); nuclear@0: } nuclear@0: nuclear@0: static void display() nuclear@0: { nuclear@0: unsigned int msec = glutGet(GLUT_ELAPSED_TIME) - start_time; nuclear@0: game_update(msec); nuclear@0: nuclear@0: game_display(); nuclear@0: nuclear@0: glutSwapBuffers(); nuclear@0: assert(glGetError() == GL_NO_ERROR); nuclear@0: } nuclear@0: nuclear@0: static void idle() nuclear@0: { nuclear@0: glutPostRedisplay(); nuclear@0: } nuclear@0: nuclear@0: static void reshape(int x, int y) nuclear@0: { nuclear@0: win_width = x; nuclear@0: win_height = y; nuclear@0: game_reshape(x, y); nuclear@0: } nuclear@0: nuclear@0: static void keydown(unsigned char key, int x, int y) nuclear@0: { nuclear@0: update_modifiers(); nuclear@0: game_keyboard(key, true); nuclear@0: } nuclear@0: nuclear@0: static void keyup(unsigned char key, int x, int y) nuclear@0: { nuclear@0: update_modifiers(); nuclear@0: game_keyboard(key, false); nuclear@0: } nuclear@0: nuclear@0: static void mouse(int bn, int st, int x, int y) nuclear@0: { nuclear@0: update_modifiers(); nuclear@0: game_mbutton(bn - GLUT_LEFT_BUTTON, st == GLUT_DOWN, x, y); nuclear@0: } nuclear@0: nuclear@0: static void motion(int x, int y) nuclear@0: { nuclear@0: game_mmotion(x, y); nuclear@0: } nuclear@0: nuclear@0: static void update_modifiers() nuclear@0: { nuclear@0: static unsigned int prev_mod; nuclear@0: unsigned int mod = glutGetModifiers(); nuclear@0: unsigned int delta = mod ^ prev_mod; nuclear@0: nuclear@0: if(delta & GLUT_ACTIVE_SHIFT) { nuclear@0: bool press = (mod & GLUT_ACTIVE_SHIFT) != 0; nuclear@0: game_modifier_key(MOD_SHIFT, press); nuclear@0: } nuclear@0: if(delta & GLUT_ACTIVE_CTRL) { nuclear@0: bool press = (mod & GLUT_ACTIVE_CTRL) != 0; nuclear@0: game_modifier_key(MOD_CTL, press); nuclear@0: } nuclear@0: if(delta & GLUT_ACTIVE_ALT) { nuclear@0: bool press = (mod & GLUT_ACTIVE_ALT) != 0; nuclear@0: game_modifier_key(MOD_ALT, press); nuclear@0: } nuclear@0: nuclear@0: prev_mod = mod; nuclear@0: }