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
|