nuclear@2: #include nuclear@2: #include nuclear@2: #include nuclear@2: #include "game.h" nuclear@2: nuclear@2: static bool init(); nuclear@2: static void cleanup(); nuclear@2: static void handle_event(SDL_Event *ev); nuclear@2: nuclear@2: static bool done; nuclear@2: static SDL_Window *win; nuclear@2: static SDL_GLContext ctx; nuclear@2: nuclear@2: int main(int argc, char **argv) nuclear@2: { nuclear@2: if(!init()) { nuclear@2: return 1; nuclear@2: } nuclear@2: nuclear@2: while(!done) { nuclear@2: SDL_Event ev; nuclear@2: while(SDL_PollEvent(&ev)) { nuclear@2: handle_event(&ev); nuclear@2: if(done) goto end_main_loop; nuclear@2: } nuclear@2: nuclear@2: game_update(SDL_GetTicks()); nuclear@2: game_display(); nuclear@2: } nuclear@2: nuclear@2: end_main_loop: nuclear@2: cleanup(); nuclear@2: return 0; nuclear@2: } nuclear@2: nuclear@2: void exit_game() nuclear@2: { nuclear@2: done = true; nuclear@2: } nuclear@2: nuclear@2: void move_window(int x, int y) nuclear@2: { nuclear@2: SDL_SetWindowPosition(win, x, y); nuclear@2: } nuclear@2: nuclear@2: void get_window_pos(int *x, int *y) nuclear@2: { nuclear@2: SDL_GetWindowPosition(win, x, y); nuclear@2: } nuclear@2: nuclear@2: void resize_window(int x, int y) nuclear@2: { nuclear@2: SDL_SetWindowSize(win, x, y); nuclear@2: } nuclear@2: nuclear@2: void enter_fullscreen() nuclear@2: { nuclear@2: SDL_SetWindowFullscreen(win, SDL_WINDOW_FULLSCREEN_DESKTOP); nuclear@2: } nuclear@2: nuclear@2: void leave_fullscreen() nuclear@2: { nuclear@2: SDL_SetWindowFullscreen(win, 0); nuclear@2: } nuclear@2: nuclear@2: static bool init() nuclear@2: { nuclear@2: if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) == -1) { nuclear@2: fprintf(stderr, "failed to initialize SDL\n"); nuclear@2: return false; nuclear@2: } nuclear@2: nuclear@2: win = SDL_CreateWindow("vrheights", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, nuclear@2: 1280, 800, SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE); nuclear@2: if(!win) { nuclear@2: fprintf(stderr, "failed to create window\n"); nuclear@2: return false; nuclear@2: } nuclear@2: nuclear@2: if(!(ctx = SDL_GL_CreateContext(win))) { nuclear@2: fprintf(stderr, "failed to create OpenGL context\n"); nuclear@2: return false; nuclear@2: } nuclear@2: nuclear@2: if(!game_init()) { nuclear@2: return false; nuclear@2: } nuclear@2: nuclear@2: int w, h; nuclear@2: SDL_GetWindowSize(win, &w, &h); nuclear@2: game_reshape(w, h); nuclear@2: return true; nuclear@2: } nuclear@2: nuclear@2: static void cleanup() nuclear@2: { nuclear@2: game_cleanup(); nuclear@2: SDL_Quit(); nuclear@2: } nuclear@2: nuclear@2: static void handle_event(SDL_Event *ev) nuclear@2: { nuclear@2: switch(ev->type) { nuclear@2: case SDL_WINDOWEVENT: nuclear@2: if(ev->window.event == SDL_WINDOWEVENT_RESIZED) { nuclear@2: game_reshape(ev->window.data1, ev->window.data2); nuclear@2: } nuclear@2: break; nuclear@2: nuclear@2: case SDL_KEYDOWN: nuclear@2: case SDL_KEYUP: nuclear@2: game_keyboard(ev->key.keysym.sym, ev->key.state == SDL_PRESSED); nuclear@2: break; nuclear@2: nuclear@2: case SDL_MOUSEBUTTONDOWN: nuclear@2: case SDL_MOUSEBUTTONUP: nuclear@4: { nuclear@4: int bn = ev->button.button - SDL_BUTTON_LEFT; nuclear@4: game_mouse_button(bn, ev->button.state == SDL_PRESSED, ev->button.x, ev->button.y); nuclear@4: } nuclear@2: break; nuclear@2: nuclear@2: case SDL_MOUSEMOTION: nuclear@2: game_mouse_motion(ev->motion.x, ev->motion.y); nuclear@2: break; nuclear@2: nuclear@5: case SDL_QUIT: nuclear@5: exit_game(); nuclear@5: break; nuclear@5: nuclear@2: default: nuclear@2: break; nuclear@2: } nuclear@2: }