nuclear@0: #include nuclear@0: #include "opengl.h" nuclear@0: #include "game.h" nuclear@1: #include "vein.h" nuclear@1: #include "ship.h" nuclear@1: #include "camera.h" nuclear@3: #include "cockpit.h" nuclear@0: nuclear@6: static const Vector3 fog_color(0.64, 0.1, 0.1); nuclear@5: nuclear@1: static Vein *vein; nuclear@6: static Ship *ship; nuclear@1: nuclear@1: static int keystate[256]; nuclear@2: static int dbg_inside = false; nuclear@4: static bool ignore_next_motion; nuclear@1: nuclear@1: static OrbitCamera dbgcam; nuclear@1: nuclear@1: static unsigned long msec, start_time = -1; nuclear@0: nuclear@0: bool game_init() nuclear@0: { nuclear@0: glEnable(GL_DEPTH_TEST); nuclear@0: glEnable(GL_CULL_FACE); nuclear@0: nuclear@0: float lpos[] = {-1, 1, 1, 0}; nuclear@0: glLightfv(GL_LIGHT0, GL_POSITION, lpos); nuclear@0: nuclear@3: // initialize the cockpit nuclear@3: if(!cockpit_init()) { nuclear@3: return false; nuclear@3: } nuclear@3: nuclear@3: // initialize the only level nuclear@1: vein = new Vein; nuclear@3: if(!vein->init()) { nuclear@3: return false; nuclear@3: } nuclear@5: vein->set_fog_color(fog_color); nuclear@5: nuclear@6: // create the player's ship nuclear@6: ship = new Ship(vein); nuclear@6: nuclear@5: glClearColor(fog_color.x, fog_color.y, fog_color.z, 1); nuclear@1: nuclear@0: return true; nuclear@0: } nuclear@0: nuclear@0: void game_shutdown() nuclear@0: { nuclear@3: delete vein; nuclear@3: cockpit_destroy(); nuclear@0: exit(0); nuclear@0: } nuclear@0: nuclear@1: void game_update(unsigned long ms) nuclear@0: { nuclear@1: static unsigned long last_upd; nuclear@1: nuclear@0: if(start_time == 0) { nuclear@1: start_time = ms; nuclear@0: } nuclear@1: msec = ms - start_time; nuclear@1: nuclear@1: time_sec_t dt = (msec - last_upd) / 1000.0; nuclear@1: nuclear@1: // handle key input nuclear@1: if(keystate['w'] || keystate['W']) { nuclear@9: ship->accelerate(4.0 * dt); nuclear@1: } nuclear@1: if(keystate['s'] || keystate['S']) { nuclear@9: ship->accelerate(-4.0 * dt); nuclear@1: } nuclear@1: if(keystate['d'] || keystate['D']) { nuclear@9: ship->accelerate_side(4.0 * dt); nuclear@1: } nuclear@1: if(keystate['a'] || keystate['A']) { nuclear@9: ship->accelerate_side(-4.0 * dt); nuclear@1: } nuclear@1: nuclear@6: ship->update(dt); nuclear@1: nuclear@1: last_upd = msec; nuclear@0: } nuclear@0: nuclear@0: void game_draw() nuclear@0: { nuclear@0: glMatrixMode(GL_MODELVIEW); nuclear@0: nuclear@2: if(dbg_inside) { nuclear@6: load_gl_matrix(ship->get_matrix().inverse()); nuclear@3: } else { nuclear@3: dbgcam.use(); nuclear@2: } nuclear@2: nuclear@6: vein->draw(ship->get_position()); nuclear@3: nuclear@3: if(!dbg_inside) { nuclear@6: ship->dbg_draw(); nuclear@3: } else { nuclear@3: cockpit_draw(); nuclear@3: } nuclear@0: } nuclear@0: nuclear@0: void game_input_keyb(int key, int state) nuclear@0: { nuclear@0: if(state) { nuclear@0: switch(key) { nuclear@0: case 27: nuclear@0: game_shutdown(); nuclear@1: break; nuclear@0: nuclear@2: case '\b': nuclear@6: case 127: nuclear@2: dbg_inside = !dbg_inside; nuclear@3: if(dbg_inside) { nuclear@3: glutPassiveMotionFunc(game_input_mmotion); nuclear@3: glutSetCursor(GLUT_CURSOR_NONE); nuclear@4: nuclear@4: ignore_next_motion = true; nuclear@4: glutWarpPointer(win_xsz / 2, win_ysz / 2); nuclear@3: } else { nuclear@3: glutPassiveMotionFunc(0); nuclear@3: glutSetCursor(GLUT_CURSOR_INHERIT); nuclear@3: } nuclear@2: break; nuclear@2: nuclear@0: default: nuclear@0: break; nuclear@0: } nuclear@0: } nuclear@1: nuclear@1: if(key < 256) { nuclear@1: keystate[key] = state; nuclear@1: } nuclear@0: } nuclear@1: nuclear@1: static int bnstate[16]; nuclear@1: static int prev_x, prev_y; nuclear@1: nuclear@1: void game_input_mbutton(int bn, int state, int x, int y) nuclear@1: { nuclear@1: if(bn < 16) { nuclear@1: bnstate[bn] = state; nuclear@1: } nuclear@1: prev_x = x; nuclear@1: prev_y = y; nuclear@1: } nuclear@1: nuclear@8: #define EDGE_PIXELS (win_ysz / 4) nuclear@8: nuclear@1: void game_input_mmotion(int x, int y) nuclear@1: { nuclear@1: int dx = x - prev_x; nuclear@1: int dy = y - prev_y; nuclear@1: prev_x = x; nuclear@1: prev_y = y; nuclear@1: nuclear@8: if(ignore_next_motion || abs(dx) >= win_xsz / 2 - EDGE_PIXELS || nuclear@8: abs(dy) >= win_ysz / 2 - EDGE_PIXELS) { nuclear@4: ignore_next_motion = false; nuclear@3: return; nuclear@1: } nuclear@3: nuclear@3: if(dbg_inside) { nuclear@6: ship->turn((float)-dx / win_xsz, (float)-dy / win_ysz); nuclear@3: nuclear@8: if(x < EDGE_PIXELS || x >= win_xsz - EDGE_PIXELS || y < EDGE_PIXELS || y >= win_ysz - EDGE_PIXELS) { nuclear@8: glutWarpPointer(win_xsz / 2, win_ysz / 2); nuclear@8: } nuclear@3: } else { nuclear@3: if(bnstate[0]) { nuclear@3: dbgcam.input_rotate(10.0 * dx / win_xsz, 10.0 * dy / win_ysz, 0); nuclear@3: } nuclear@3: if(bnstate[2]) { nuclear@3: dbgcam.input_zoom(10.0 * dy / win_ysz); nuclear@3: } nuclear@1: } nuclear@1: }