conworlds

annotate src/sdl/main_sdl.cc @ 21:2da585428507

added both glut and sdl2 versions just for fun...
author John Tsiombikas <nuclear@member.fsf.org>
date Wed, 27 Aug 2014 04:16:22 +0300
parents
children
rev   line source
nuclear@21 1 #ifdef USE_SDL
nuclear@21 2
nuclear@21 3 #include <stdio.h>
nuclear@21 4 #include <stdlib.h>
nuclear@21 5 #include <SDL2/SDL.h>
nuclear@21 6 #include "opengl.h"
nuclear@21 7 #include "game.h"
nuclear@21 8 #include "gameopt.h"
nuclear@21 9 #include "vr/vr.h"
nuclear@21 10
nuclear@21 11 #define ANYPOS SDL_WINDOWPOS_UNDEFINED
nuclear@21 12
nuclear@21 13 static bool init();
nuclear@21 14 static void cleanup();
nuclear@21 15 static void handle_event(SDL_Event *ev);
nuclear@21 16
nuclear@21 17 static SDL_Window *win;
nuclear@21 18 static SDL_GLContext ctx;
nuclear@21 19
nuclear@21 20 int main(int argc, char **argv)
nuclear@21 21 {
nuclear@21 22 if(!parse_args(argc, argv)) {
nuclear@21 23 return 1;
nuclear@21 24 }
nuclear@21 25
nuclear@21 26 SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER);
nuclear@21 27
nuclear@21 28 unsigned int flags = SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE;
nuclear@21 29 if(!(win = SDL_CreateWindow("oculus test", ANYPOS, ANYPOS, 1024, 600, flags))) {
nuclear@21 30 fprintf(stderr, "failed to create window\n");
nuclear@21 31 return 1;
nuclear@21 32 }
nuclear@21 33
nuclear@21 34 SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1);
nuclear@21 35 SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 4);
nuclear@21 36
nuclear@21 37 if(!(ctx = SDL_GL_CreateContext(win))) {
nuclear@21 38 fprintf(stderr, "failed to create OpenGL context\n");
nuclear@21 39 return 1;
nuclear@21 40 }
nuclear@21 41
nuclear@21 42 if(!init()) {
nuclear@21 43 return 1;
nuclear@21 44 }
nuclear@21 45 atexit(cleanup);
nuclear@21 46
nuclear@21 47 int xsz, ysz;
nuclear@21 48 SDL_GetWindowSize(win, &xsz, &ysz);
nuclear@21 49 game_reshape(xsz, ysz);
nuclear@21 50
nuclear@21 51 for(;;) {
nuclear@21 52 SDL_Event ev;
nuclear@21 53
nuclear@21 54 while(SDL_PollEvent(&ev)) {
nuclear@21 55 handle_event(&ev);
nuclear@21 56 }
nuclear@21 57
nuclear@21 58 unsigned int msec = SDL_GetTicks();
nuclear@21 59
nuclear@21 60 game_update(msec);
nuclear@21 61 game_render();
nuclear@21 62 }
nuclear@21 63
nuclear@21 64 return 0;
nuclear@21 65 }
nuclear@21 66
nuclear@21 67 static bool init()
nuclear@21 68 {
nuclear@21 69 glewInit();
nuclear@21 70
nuclear@21 71 if(!game_init()) {
nuclear@21 72 return false;
nuclear@21 73 }
nuclear@21 74
nuclear@21 75 if(opt.vr) {
nuclear@21 76 int win_xsz = vr_get_opti(VR_OPT_DISPLAY_WIDTH);
nuclear@21 77 int win_ysz = vr_get_opti(VR_OPT_DISPLAY_HEIGHT);
nuclear@21 78 if(win_xsz && win_ysz) {
nuclear@21 79 SDL_SetWindowSize(win, win_xsz, win_ysz);
nuclear@21 80 }
nuclear@21 81 }
nuclear@21 82 return true;
nuclear@21 83 }
nuclear@21 84
nuclear@21 85 static void cleanup()
nuclear@21 86 {
nuclear@21 87 game_cleanup();
nuclear@21 88 }
nuclear@21 89
nuclear@21 90 static void handle_event(SDL_Event *ev)
nuclear@21 91 {
nuclear@21 92 static bool fullscr;
nuclear@21 93 static int prev_xpos, prev_ypos;
nuclear@21 94 static int prev_xsz, prev_ysz;
nuclear@21 95
nuclear@21 96 switch(ev->type) {
nuclear@21 97 case SDL_KEYDOWN:
nuclear@21 98 case SDL_KEYUP:
nuclear@21 99 if(ev->key.keysym.sym == 'f' && ev->key.state == SDL_PRESSED) {
nuclear@21 100 fullscr = !fullscr;
nuclear@21 101 if(fullscr) {
nuclear@21 102 int xoffs, yoffs;
nuclear@21 103
nuclear@21 104 SDL_GetWindowPosition(win, &prev_xpos, &prev_ypos);
nuclear@21 105 SDL_GetWindowSize(win, &prev_xsz, &prev_ysz);
nuclear@21 106
nuclear@21 107 xoffs = vr_get_opti(VR_OPT_WIN_XOFFS);
nuclear@21 108 yoffs = vr_get_opti(VR_OPT_WIN_YOFFS);
nuclear@21 109 if(xoffs || yoffs) {
nuclear@21 110 printf("repositioning: %d,%d\n", xoffs, yoffs);
nuclear@21 111 SDL_SetWindowPosition(win, xoffs, yoffs);
nuclear@21 112 }
nuclear@21 113 SDL_SetWindowFullscreen(win, SDL_WINDOW_FULLSCREEN_DESKTOP);
nuclear@21 114 } else {
nuclear@21 115 SDL_SetWindowFullscreen(win, 0);
nuclear@21 116 /*SDL_SetWindowPosition(win, prev_xpos, prev_ypos);
nuclear@21 117 SDL_SetWindowSize(win, prev_xsz, prev_ysz);*/
nuclear@21 118 }
nuclear@21 119 break;
nuclear@21 120 }
nuclear@21 121
nuclear@21 122 game_keyboard(ev->key.keysym.sym, ev->key.state == SDL_PRESSED);
nuclear@21 123 break;
nuclear@21 124
nuclear@21 125 case SDL_MOUSEBUTTONDOWN:
nuclear@21 126 case SDL_MOUSEBUTTONUP:
nuclear@21 127 game_mouse(ev->button.button - SDL_BUTTON_LEFT, ev->button.state == SDL_PRESSED,
nuclear@21 128 ev->button.x, ev->button.y);
nuclear@21 129 break;
nuclear@21 130
nuclear@21 131 case SDL_MOUSEWHEEL:
nuclear@21 132 game_mwheel(ev->wheel.y);
nuclear@21 133 break;
nuclear@21 134
nuclear@21 135 case SDL_MOUSEMOTION:
nuclear@21 136 game_motion(ev->motion.x, ev->motion.y);
nuclear@21 137 break;
nuclear@21 138
nuclear@21 139 case SDL_WINDOWEVENT:
nuclear@21 140 switch(ev->window.event) {
nuclear@21 141 case SDL_WINDOWEVENT_RESIZED:
nuclear@21 142 game_reshape(ev->window.data1, ev->window.data2);
nuclear@21 143 break;
nuclear@21 144
nuclear@21 145 default:
nuclear@21 146 break;
nuclear@21 147 }
nuclear@21 148
nuclear@21 149 default:
nuclear@21 150 break;
nuclear@21 151 }
nuclear@21 152 }
nuclear@21 153
nuclear@21 154 #endif // USE_SDL