From 9dfa4516ed23490baeae82bb2a21469c2e429252 Mon Sep 17 00:00:00 2001 From: Zeno Rogue Date: Wed, 30 Dec 2020 14:55:14 +0100 Subject: [PATCH] vr:: implemented eCompScreen::single --- shaders.cpp | 35 +++++++++++++++-------------------- vr.cpp | 39 ++++++++++++++++++++------------------- 2 files changed, 35 insertions(+), 39 deletions(-) diff --git a/shaders.cpp b/shaders.cpp index fa5f7d84..74a22610 100644 --- a/shaders.cpp +++ b/shaders.cpp @@ -552,40 +552,35 @@ void display_data::set_projection(int ed, ld shift) { bool u_alpha = false; - if(shader_flags & SF_PIXELS) { + auto use_mv = [cd] { #if CAP_VR if(vrhr::rendering_eye()) { glhr::projection_multiply(glhr::tmtogl_transpose(vrhr::hmd_mvp)); glhr::id_modelview(); } - else - #endif - ortho(cd->xsize/2, -cd->ysize/2); + else { + glhr::projection_multiply(glhr::frustum(cd->tanfov, cd->tanfov * cd->ysize / cd->xsize)); + glhr::projection_multiply(glhr::tmtogl_transpose(vrhr::hmd_mv)); + } + #endif + }; + + if(shader_flags & SF_PIXELS) { + if(vrhr::rendering()) use_mv(); + else ortho(cd->xsize/2, -cd->ysize/2); } else if(shader_flags & SF_BOX) { - #if CAP_VR - if(vrhr::rendering_eye()) { - glhr::projection_multiply(glhr::tmtogl_transpose(vrhr::hmd_mvp)); - glhr::id_modelview(); - } - else - #endif - ortho(cd->xsize/current_display->radius/2, -cd->ysize/current_display->radius/2); + if(vrhr::rendering()) use_mv(); + else ortho(cd->xsize/current_display->radius/2, -cd->ysize/current_display->radius/2); } else if(shader_flags & SF_ODSBOX) { ortho(M_PI, M_PI); glhr::fog_max(1/sightranges[geometry], darkena(backcolor, 0, 0xFF)); } else if(shader_flags & SF_PERS3) { - #if CAP_VR - if(vrhr::rendering_eye()) { - glhr::projection_multiply(glhr::tmtogl_transpose(vrhr::hmd_mvp)); - } - #else - if(0) {} - #endif + if(vrhr::rendering()) use_mv(); else { - glhr::projection_multiply(glhr::frustum(current_display->tanfov, current_display->tanfov * cd->ysize / cd->xsize)); + glhr::projection_multiply(glhr::frustum(cd->tanfov, cd->tanfov * cd->ysize / cd->xsize)); glhr::projection_multiply(glhr::scale(1, -1, -1)); if(nisot::local_perspective_used()) { if(prod) { diff --git a/vr.cpp b/vr.cpp index ad842a46..c018c79c 100644 --- a/vr.cpp +++ b/vr.cpp @@ -60,8 +60,8 @@ vector > eyes_desc = { /* not implemented */ vector > comp_desc = { {"none", "Do not display anything on the computer screen."}, - {"reference", "Display the view from the reference point."}, - {"single", "(not implemented)"}, // "Display a single monocular image."}, + {"reference", "Display the standard HyperRogue view from the reference point."}, + {"single", "Display a a single monocular image from the headset."}, {"eyes", "Display a copy of the VR display."}, }; @@ -829,9 +829,6 @@ EX void render() { for(int i=0; i<3; i++) { - dynamicval vx(vid.xres, vrdata.xsize); - dynamicval vy(vid.yres, vrdata.ysize); - if(1) { make_actual_view(); shiftmatrix Tv = cview(); @@ -874,6 +871,9 @@ EX void render() { if(i != 2) { + dynamicval vx(vid.xres, vrdata.xsize); + dynamicval vy(vid.yres, vrdata.ysize); + auto& ey = vrdata.eyes[i]; glBindFramebuffer( GL_FRAMEBUFFER, ey->m_nRenderFramebufferId ); @@ -887,27 +887,28 @@ EX void render() { calcparam(); drawqueue(); } + + if(i == 2) { + rb.reset(); + calcparam(); + current_display->set_viewport(0); + calcparam(); + current_display->next_shader_flags = 0; + current_display->set_all(0, 0); + + if(cscr == eCompScreen::single) { + state = 4; + drawqueue(); + } + + } } } - rb.reset(); - - calcparam(); - current_display->set_viewport(0); - calcparam(); - current_display->next_shader_flags = 0; - current_display->set_all(0, 0); - if(cscr == eCompScreen::eyes) draw_eyes(); - if(cscr == eCompScreen::single) { - /* todo */ - state = 4; - drawqueue(); - } - if(cscr == eCompScreen::reference) { state = 3; drawqueue();