X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=vrfileman;a=blobdiff_plain;f=src%2Fapp.cc;fp=src%2Fapp.cc;h=b3049bc885dae3a4b6a23403214c7b7105c63e67;hp=08f6e8adb146cdfb00bb49b0d74d6c66648d4162;hb=7c59a70219aa7bcf80291f41903a9e6fc9b6e073;hpb=5e07bfd4d034dc3d974c8db008c6446e62838d39 diff --git a/src/app.cc b/src/app.cc index 08f6e8a..b3049bc 100644 --- a/src/app.cc +++ b/src/app.cc @@ -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(); @@ -28,6 +31,11 @@ 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")) { @@ -56,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; @@ -67,6 +78,16 @@ bool app_init(int argc, char **argv) cam_height = goatvr_get_eye_height(); } + 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; if(!init_backdrop()) { @@ -85,11 +106,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(); @@ -145,13 +177,43 @@ void app_draw() static void draw_scene() { + set_render_target(rtarg); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + draw_backdrop(); draw_fs(); + + 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); + rtarg_valid = false; if(opt.vr) { goatvr_set_fb_size(x, y, 1.0);