nuclear@0: #include nuclear@1: #include nuclear@1: #include nuclear@0: #include "opengl.h" nuclear@0: #include "game.h" nuclear@0: #include "goatvr.h" nuclear@0: nuclear@1: static void create_rtarg(int x, int y); nuclear@1: static int next_pow2(int x); nuclear@1: nuclear@1: static int win_width, win_height; nuclear@1: static unsigned int fb_tex; nuclear@1: static unsigned int fbo, fb_depth; nuclear@1: static int fb_xsz, fb_ysz; nuclear@1: static int fb_tex_xsz, fb_tex_ysz; nuclear@1: nuclear@0: bool game_init() nuclear@0: { nuclear@0: init_opengl(); nuclear@0: nuclear@0: if(vr_init() == -1) { nuclear@0: return false; nuclear@0: } nuclear@0: nuclear@0: glEnable(GL_DEPTH_TEST); nuclear@0: glEnable(GL_CULL_FACE); nuclear@1: nuclear@1: int sdk_fb_xsz = vr_getf(VR_LEYE_XRES) + vr_getf(VR_REYE_XRES); nuclear@1: int sdk_fb_ysz = std::max(vr_getf(VR_LEYE_YRES), vr_getf(VR_REYE_YRES)); nuclear@1: create_rtarg(sdk_fb_xsz, sdk_fb_ysz); nuclear@1: nuclear@1: return true; nuclear@0: } nuclear@0: nuclear@0: void game_cleanup() nuclear@0: { nuclear@0: vr_shutdown(); nuclear@0: } nuclear@0: nuclear@1: void game_update(long tm) nuclear@1: { nuclear@1: } nuclear@1: nuclear@1: void game_display() nuclear@1: { nuclear@1: } nuclear@1: nuclear@1: void game_reshape(int x, int y) nuclear@1: { nuclear@1: } nuclear@1: nuclear@0: void game_keyboard(int key, bool pressed); nuclear@0: void game_mouse_button(int bn, bool state, int x, int y); nuclear@0: void game_mouse_motion(int x, int y); nuclear@0: nuclear@1: nuclear@1: static void create_rtarg(int x, int y) nuclear@1: { nuclear@1: if(x == fb_xsz && y == fb_ysz) { nuclear@1: return; // nothing changed nuclear@1: } nuclear@1: nuclear@1: fb_xsz = x; nuclear@1: fb_ysz = y; nuclear@1: fb_tex_xsz = next_pow2(fb_xsz); nuclear@1: fb_tex_ysz = next_pow2(fb_ysz); nuclear@1: nuclear@1: if(!fbo) { nuclear@1: glGenFramebuffers(1, &fbo); nuclear@1: nuclear@1: glGenTextures(1, &fb_tex); nuclear@1: glBindTexture(GL_TEXTURE_2D, fb_tex); nuclear@1: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); nuclear@1: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); nuclear@1: nuclear@1: glGenRenderbuffers(1, &fb_depth); nuclear@1: } nuclear@1: nuclear@1: glBindFramebuffer(GL_FRAMEBUFFER, fbo); nuclear@1: nuclear@1: glBindTexture(GL_TEXTURE_2D, fb_tex); nuclear@1: glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, fb_tex_xsz, fb_tex_ysz, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); nuclear@1: glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fb_tex, 0); nuclear@1: nuclear@1: glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, fb_tex_xsz, fb_tex_ysz); nuclear@1: glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, fb_depth); nuclear@1: nuclear@1: assert(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE); nuclear@1: glBindFramebuffer(GL_FRAMEBUFFER, 0); nuclear@1: } nuclear@1: nuclear@1: static int next_pow2(int x) nuclear@1: { nuclear@1: x -= 1; nuclear@1: x |= x >> 1; nuclear@1: x |= x >> 2; nuclear@1: x |= x >> 4; nuclear@1: x |= x >> 8; nuclear@1: x |= x >> 16; nuclear@1: return x + 1; nuclear@1: }