a1dad7be36010bce993819213991eba7b5d669c2
[vrtris] / src / game.c
1 #include <assert.h>
2 #include <goatvr.h>
3 #include <cgmath/cgmath.h>
4 #include "opengl.h"
5 #include "game.h"
6 #include "screen.h"
7 #include "osd.h"
8 #include "opt.h"
9
10 #define DEFSCR  "game"
11
12 static void calc_framerate(void);
13 static void print_framerate(void);
14
15 static int should_swap;
16 static unsigned long framerate;
17
18 int game_init(int argc, char **argv)
19 {
20         if(init_opengl() == -1) {
21                 return -1;
22         }
23
24         if(init_options(argc, argv, "vrtris.conf") == -1) {
25                 return -1;
26         }
27
28         if(init_screens() == -1) {
29                 return -1;
30         }
31
32         if(opt.flags & OPT_VR) {
33                 if(goatvr_init() == -1) {
34                         return -1;
35                 }
36                 goatvr_set_origin_mode(GOATVR_HEAD);
37
38                 goatvr_startvr();
39                 should_swap = goatvr_should_swap();
40         }
41
42         glEnable(GL_DEPTH_TEST);
43         glEnable(GL_CULL_FACE);
44         glEnable(GL_LIGHTING);
45         glEnable(GL_LIGHT0);
46
47         return 0;
48 }
49
50 void game_cleanup()
51 {
52         if(opt.flags & OPT_VR) {
53                 goatvr_shutdown();
54         }
55         cleanup_screens();
56 }
57
58 static void update(float dt)
59 {
60         int num_vr_sticks;
61
62         if((num_vr_sticks = goatvr_num_sticks()) > 0) {
63                 float p[2];
64                 goatvr_stick_pos(0, p);
65                 /* TODO */
66         }
67
68         screen->update(dt);
69 }
70
71 void game_display(void)
72 {
73         static long prev_msec;
74         int i;
75         float dt = (float)(time_msec - prev_msec) / 1000.0f;
76         prev_msec = time_msec;
77
78         update(dt);
79
80         if(opt.flags & OPT_VR) {
81                 goatvr_draw_start();
82                 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
83
84                 for(i=0; i<2; i++) {
85                         /* for each eye */
86                         goatvr_draw_eye(i);
87
88                         cgm_mcopy(proj_matrix, goatvr_projection_matrix(i, 0.5, 500.0));
89                         glMatrixMode(GL_PROJECTION);
90                         glLoadMatrixf(proj_matrix);
91
92                         cgm_mcopy(view_matrix, goatvr_view_matrix(i));
93                         glMatrixMode(GL_MODELVIEW);
94                         glLoadMatrixf(view_matrix);
95
96                         screen->draw();
97                         print_framerate();
98                         draw_osd();
99                 }
100
101                 goatvr_draw_done();
102
103                 if(should_swap) {
104                         game_swap_buffers();
105                 }
106
107         } else {
108                 /* non-VR mode */
109                 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
110
111                 cgm_mperspective(proj_matrix, cgm_deg_to_rad(40.0), win_aspect, 0.5, 500.0);
112                 glMatrixMode(GL_PROJECTION);
113                 glLoadMatrixf(proj_matrix);
114
115                 cgm_midentity(view_matrix);
116                 glMatrixMode(GL_MODELVIEW);
117                 glLoadMatrixf(view_matrix);
118
119                 screen->draw();
120                 print_framerate();
121                 draw_osd();
122
123                 game_swap_buffers();
124         }
125
126         assert(glGetError() == GL_NO_ERROR);
127
128         calc_framerate();
129 }
130
131 void game_reshape(int x, int y)
132 {
133         glViewport(0, 0, x, y);
134         goatvr_set_fb_size(x, y, 1.0f);
135
136         reshape_screens(x, y);
137 }
138
139 void game_keyboard(int key, int pressed)
140 {
141         unsigned int mod = game_get_modifiers();
142
143         if(pressed) {
144                 switch(key) {
145                 case 27:
146                         game_quit();
147                         return;
148
149                 case '\n':
150                 case '\r':
151                         if(mod & MOD_ALT) {
152                                 game_toggle_fullscreen();
153                                 return;
154                         }
155                         break;
156
157                 default:
158                         break;
159                 }
160         }
161
162         screen->keyboard(key, pressed);
163 }
164
165 void game_mouse_button(int bn, int pressed, int x, int y)
166 {
167         screen->mouse(bn, pressed, x, y);
168 }
169
170 void game_mouse_motion(int x, int y)
171 {
172         screen->motion(x, y);
173 }
174
175 void game_mouse_wheel(int dir)
176 {
177         screen->wheel(dir);
178 }
179
180
181 void game_gamepad_axis(int axis, float val)
182 {
183 }
184
185 void game_gamepad_button(int bn, int pressed)
186 {
187 }
188
189 static void calc_framerate(void)
190 {
191         static unsigned long nframes;
192         static long prev_upd;
193
194         long elapsed = time_msec - prev_upd;
195         if(elapsed >= 1000) {
196                 framerate = nframes * 10000 / elapsed;
197                 nframes = 1;
198                 prev_upd = time_msec;
199         } else {
200                 ++nframes;
201         }
202 }
203
204 static void print_framerate(void)
205 {
206         print_text(9 * win_width / 10, 20, 1, 1, 0, "fps: %d.%d", framerate / 10, framerate % 10);
207 }