rev |
line source |
nuclear@0
|
1 #include <stdio.h>
|
nuclear@1
|
2 #include <assert.h>
|
nuclear@1
|
3 #include <algorithm>
|
nuclear@0
|
4 #include "opengl.h"
|
nuclear@0
|
5 #include "game.h"
|
nuclear@0
|
6 #include "goatvr.h"
|
nuclear@0
|
7
|
nuclear@1
|
8 static void create_rtarg(int x, int y);
|
nuclear@1
|
9 static int next_pow2(int x);
|
nuclear@1
|
10
|
nuclear@1
|
11 static int win_width, win_height;
|
nuclear@1
|
12 static unsigned int fb_tex;
|
nuclear@1
|
13 static unsigned int fbo, fb_depth;
|
nuclear@1
|
14 static int fb_xsz, fb_ysz;
|
nuclear@1
|
15 static int fb_tex_xsz, fb_tex_ysz;
|
nuclear@1
|
16
|
nuclear@0
|
17 bool game_init()
|
nuclear@0
|
18 {
|
nuclear@0
|
19 init_opengl();
|
nuclear@0
|
20
|
nuclear@0
|
21 if(vr_init() == -1) {
|
nuclear@0
|
22 return false;
|
nuclear@0
|
23 }
|
nuclear@0
|
24
|
nuclear@0
|
25 glEnable(GL_DEPTH_TEST);
|
nuclear@0
|
26 glEnable(GL_CULL_FACE);
|
nuclear@1
|
27
|
nuclear@1
|
28 int sdk_fb_xsz = vr_getf(VR_LEYE_XRES) + vr_getf(VR_REYE_XRES);
|
nuclear@1
|
29 int sdk_fb_ysz = std::max(vr_getf(VR_LEYE_YRES), vr_getf(VR_REYE_YRES));
|
nuclear@1
|
30 create_rtarg(sdk_fb_xsz, sdk_fb_ysz);
|
nuclear@1
|
31
|
nuclear@1
|
32 return true;
|
nuclear@0
|
33 }
|
nuclear@0
|
34
|
nuclear@0
|
35 void game_cleanup()
|
nuclear@0
|
36 {
|
nuclear@0
|
37 vr_shutdown();
|
nuclear@0
|
38 }
|
nuclear@0
|
39
|
nuclear@1
|
40 void game_update(long tm)
|
nuclear@1
|
41 {
|
nuclear@1
|
42 }
|
nuclear@1
|
43
|
nuclear@1
|
44 void game_display()
|
nuclear@1
|
45 {
|
nuclear@1
|
46 }
|
nuclear@1
|
47
|
nuclear@1
|
48 void game_reshape(int x, int y)
|
nuclear@1
|
49 {
|
nuclear@1
|
50 }
|
nuclear@1
|
51
|
nuclear@0
|
52 void game_keyboard(int key, bool pressed);
|
nuclear@0
|
53 void game_mouse_button(int bn, bool state, int x, int y);
|
nuclear@0
|
54 void game_mouse_motion(int x, int y);
|
nuclear@0
|
55
|
nuclear@1
|
56
|
nuclear@1
|
57 static void create_rtarg(int x, int y)
|
nuclear@1
|
58 {
|
nuclear@1
|
59 if(x == fb_xsz && y == fb_ysz) {
|
nuclear@1
|
60 return; // nothing changed
|
nuclear@1
|
61 }
|
nuclear@1
|
62
|
nuclear@1
|
63 fb_xsz = x;
|
nuclear@1
|
64 fb_ysz = y;
|
nuclear@1
|
65 fb_tex_xsz = next_pow2(fb_xsz);
|
nuclear@1
|
66 fb_tex_ysz = next_pow2(fb_ysz);
|
nuclear@1
|
67
|
nuclear@1
|
68 if(!fbo) {
|
nuclear@1
|
69 glGenFramebuffers(1, &fbo);
|
nuclear@1
|
70
|
nuclear@1
|
71 glGenTextures(1, &fb_tex);
|
nuclear@1
|
72 glBindTexture(GL_TEXTURE_2D, fb_tex);
|
nuclear@1
|
73 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
nuclear@1
|
74 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
nuclear@1
|
75
|
nuclear@1
|
76 glGenRenderbuffers(1, &fb_depth);
|
nuclear@1
|
77 }
|
nuclear@1
|
78
|
nuclear@1
|
79 glBindFramebuffer(GL_FRAMEBUFFER, fbo);
|
nuclear@1
|
80
|
nuclear@1
|
81 glBindTexture(GL_TEXTURE_2D, fb_tex);
|
nuclear@1
|
82 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, fb_tex_xsz, fb_tex_ysz, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
|
nuclear@1
|
83 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fb_tex, 0);
|
nuclear@1
|
84
|
nuclear@1
|
85 glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, fb_tex_xsz, fb_tex_ysz);
|
nuclear@1
|
86 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, fb_depth);
|
nuclear@1
|
87
|
nuclear@1
|
88 assert(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE);
|
nuclear@1
|
89 glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
nuclear@1
|
90 }
|
nuclear@1
|
91
|
nuclear@1
|
92 static int next_pow2(int x)
|
nuclear@1
|
93 {
|
nuclear@1
|
94 x -= 1;
|
nuclear@1
|
95 x |= x >> 1;
|
nuclear@1
|
96 x |= x >> 2;
|
nuclear@1
|
97 x |= x >> 4;
|
nuclear@1
|
98 x |= x >> 8;
|
nuclear@1
|
99 x |= x >> 16;
|
nuclear@1
|
100 return x + 1;
|
nuclear@1
|
101 }
|