disable post-process framebuffer rendering while in VR
[vrfileman] / src / app.cc
index 617e6a1..f075761 100644 (file)
@@ -9,6 +9,9 @@
 #include "goatvr.h"
 #include "opt.h"
 #include "fs.h"
+#include "rtarg.h"
+#include "texture.h"
+#include "sdr.h"
 
 static void draw_scene();
 
@@ -18,14 +21,21 @@ long time_msec;
 double time_sec;
 Mat4 view_matrix;
 
-static bool should_swap;
+float cam_height = 1.65;
 
 static float cam_theta, cam_phi;
-static float cam_height = 1.65;
+static bool should_swap;
 
 static bool bnstate[16];
 static int prev_x, prev_y;
 
+static float fov = 60.0;
+
+static RenderTarget *rtarg;
+static bool rtarg_valid;
+static unsigned int post_sdr;
+
+
 bool app_init(int argc, char **argv)
 {
        if(!init_options(argc, argv, "vrfileman.conf")) {
@@ -54,6 +64,9 @@ bool app_init(int argc, char **argv)
                glEnable(GL_FRAMEBUFFER_SRGB);
        }
 
+       rtarg = new RenderTarget;
+       rtarg->create(GL_RGB16F);
+
        if(opt.vr) {
                if(goatvr_init() == -1) {
                        return false;
@@ -63,7 +76,19 @@ bool app_init(int argc, char **argv)
                goatvr_startvr();
                should_swap = goatvr_should_swap() != 0;
                cam_height = goatvr_get_eye_height();
+
+               RenderTarget::default_fbo = goatvr_get_fbo();
+       }
+
+       if(opt.srgb) {
+               add_shader_header(GL_FRAGMENT_SHADER, "#define set_pixel set_pixel_linear");
+       } else {
+               add_shader_header(GL_FRAGMENT_SHADER, "#define set_pixel set_pixel_srgb");
+       }
+       if(!(post_sdr = create_program_load("sdr/post.v.glsl", "sdr/post.p.glsl"))) {
+               return false;
        }
+       clear_shader_header(0);
 
        Mesh::use_custom_sdr_attr = false;
 
@@ -71,7 +96,7 @@ bool app_init(int argc, char **argv)
                return false;
        }
 
-       if(!init_fs()) {
+       if(!init_fs(opt.path)) {
                return false;
        }
 
@@ -83,11 +108,22 @@ void app_cleanup()
        if(opt.vr) {
                goatvr_shutdown();
        }
+       delete rtarg;
+       free_program(post_sdr);
        cleanup_backdrop();
 }
 
+static void update()
+{
+       if(!rtarg_valid) {
+               rtarg->resize(win_width, win_height);
+       }
+}
+
 void app_draw()
 {
+       update();
+
        if(opt.vr) {
                // VR mode
                goatvr_draw_start();
@@ -97,7 +133,7 @@ void app_draw()
                        goatvr_draw_eye(i);
 
                        glMatrixMode(GL_PROJECTION);
-                       glLoadMatrixf(goatvr_projection_matrix(i, 0.5, 1000.0));
+                       glLoadMatrixf(goatvr_projection_matrix(i, 0.1, 200.0));
 
                        view_matrix = goatvr_view_matrix(i);
                        view_matrix.pre_rotate_x(deg_to_rad(cam_phi));
@@ -120,6 +156,11 @@ void app_draw()
                // regular monoscopic mode
                glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
+               Mat4 mat;
+               mat.perspective(deg_to_rad(fov), win_aspect, 0.1, 200.0);
+               glMatrixMode(GL_PROJECTION);
+               glLoadMatrixf(mat[0]);
+
                view_matrix = Mat4::identity;
                view_matrix.pre_rotate_x(deg_to_rad(cam_phi));
                view_matrix.pre_rotate_y(deg_to_rad(cam_theta));
@@ -138,19 +179,47 @@ void app_draw()
 
 static void draw_scene()
 {
+       if(!opt.vr) {
+               set_render_target(rtarg);
+               glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+       }
+
        draw_backdrop();
        draw_fs();
+
+       if(!opt.vr) {
+               set_render_target(0);
+
+               glPushAttrib(GL_ENABLE_BIT);
+               glDisable(GL_DEPTH_TEST);
+
+               glUseProgram(post_sdr);
+               set_uniform_matrix4(post_sdr, "texmat", rtarg->get_texture_matrix()[0]);
+
+               bind_texture(rtarg->get_texture());
+
+               glBegin(GL_QUADS);
+               glTexCoord2f(0, 0);
+               glVertex2f(-1, -1);
+               glTexCoord2f(1, 0);
+               glVertex2f(1, -1);
+               glTexCoord2f(1, 1);
+               glVertex2f(1, 1);
+               glTexCoord2f(0, 1);
+               glVertex2f(-1, 1);
+               glEnd();
+
+               bind_texture(0);
+               glUseProgram(0);
+
+               glPopAttrib();
+       }
 }
 
 void app_reshape(int x, int y)
 {
        glViewport(0, 0, x, y);
-
-       Mat4 mat;
-       mat.perspective(deg_to_rad(50), win_aspect, 0.5, 500.0);
-
-       glMatrixMode(GL_PROJECTION);
-       glLoadMatrixf(mat[0]);
+       rtarg_valid = false;
 
        if(opt.vr) {
                goatvr_set_fb_size(x, y, 1.0);
@@ -181,6 +250,16 @@ void app_keyboard(int key, bool pressed)
                                goatvr_recenter();
                        }
                        break;
+
+               case '-':
+                       fov += 1.0;
+                       if(fov > 160.0) fov = 160.0;
+                       break;
+
+               case '=':
+                       fov -= 1.0;
+                       if(fov < 0.0) fov = 0.0;
+                       break;
                }
        }
 }