From 1da9622c678706ccbb62739b4d41440871a9e412 Mon Sep 17 00:00:00 2001 From: Zeno Rogue Date: Sat, 6 Feb 2021 19:11:53 +0100 Subject: [PATCH] generalized VR UI placement --- graph.cpp | 25 ++------------- vr.cpp | 94 +++++++++++++++++++++++++++++++++++++++++-------------- 2 files changed, 73 insertions(+), 46 deletions(-) diff --git a/graph.cpp b/graph.cpp index cba2dda4..5d5d2a3a 100644 --- a/graph.cpp +++ b/graph.cpp @@ -5108,29 +5108,7 @@ EX void gamescreen(int _darken) { #endif #if CAP_VR - - if(vrhr::active() && vrhr::in_menu()) { - int xsi = current_display->xsize; - int ysi = current_display->ysize; - color_t col = 0x000000C0; - current_display->next_shader_flags = 0; - dynamicval m(pmodel, mdPixel); - - vrhr::in_vr_ui([&] { - glhr::color2(col); - glhr::set_depthtest(false); - vector vs; - vs.emplace_back(glhr::makevertex(0, 0, 0)); - vs.emplace_back(glhr::makevertex(xsi, 0, 0)); - vs.emplace_back(glhr::makevertex(xsi, ysi, 0)); - vs.emplace_back(glhr::makevertex(0, 0, 0)); - vs.emplace_back(glhr::makevertex(0, ysi, 0)); - vs.emplace_back(glhr::makevertex(xsi, ysi, 0)); - glhr::current_vertices = NULL; - glhr::vertices(vs); - glDrawArrays(GL_TRIANGLES, 0, 6); - }); - } + vrhr::size_and_draw_ui_box(); #endif } @@ -5200,6 +5178,7 @@ namespace sm { static const int DIALOG_STRICT_X = 32768; // do not interpret dialog clicks outside of the X region static const int EXPANSION = (1<<16); static const int HEXEDIT = (1<<17); + static const int VR_MENU = (1<<18); // always show the menu in VR } #endif diff --git a/vr.cpp b/vr.cpp index 3de44faf..1a521319 100644 --- a/vr.cpp +++ b/vr.cpp @@ -232,6 +232,44 @@ EX transmatrix hmd_mvp, hmd_pre, hmd_mv; EX transmatrix sm; +EX int ui_xmin, ui_ymin, ui_xmax, ui_ymax; + +EX reaction_t change_ui_bounds; + +EX void set_ui_bounds() { + ui_xmin = 0; + ui_ymin = 0; + ui_xmax = current_display->xsize; + ui_ymax = current_display->ysize; + if(change_ui_bounds) + change_ui_bounds(); + } + +EX void size_and_draw_ui_box() { + if(!vrhr::active()) return; + if(!vrhr::in_menu()) return; + + vrhr::set_ui_bounds(); + color_t col = 0x000000C0; + current_display->next_shader_flags = 0; + dynamicval m(pmodel, mdPixel); + + vrhr::in_vr_ui([&] { + glhr::color2(col); + glhr::set_depthtest(false); + vector vs; + vs.emplace_back(glhr::makevertex(ui_xmin, ui_ymin, 0)); + vs.emplace_back(glhr::makevertex(ui_xmax, ui_ymin, 0)); + vs.emplace_back(glhr::makevertex(ui_xmax, ui_ymax, 0)); + vs.emplace_back(glhr::makevertex(ui_xmin, ui_ymin, 0)); + vs.emplace_back(glhr::makevertex(ui_xmin, ui_ymax, 0)); + vs.emplace_back(glhr::makevertex(ui_xmax, ui_ymax, 0)); + glhr::current_vertices = NULL; + glhr::vertices(vs); + glDrawArrays(GL_TRIANGLES, 0, 6); + }); + } + vr_rendermodel *get_render_model(string name) { for(auto& m: vrdata.models) if(m->name == name) @@ -664,7 +702,7 @@ vector aads = { }; EX bool always_show_hud = false; -EX bool in_actual_menu() { return !(cmode & (sm::NORMAL | sm::DRAW)); } +EX bool in_actual_menu() { return (cmode & sm::VR_MENU) || !(cmode & (sm::NORMAL | sm::DRAW)); } EX bool in_menu() { return always_show_hud || in_actual_menu(); } vector sads = { @@ -832,26 +870,43 @@ EX ld ui_size = 2; const ld ui_size_unit = 0.001; #endif +struct vr_eye_settings { + dynamicval vx, vy; + dynamicval xmin, ymin, xmax, ymax; + + vr_eye_settings() : + vx(vid.xres, vrdata.xsize), + vy(vid.yres, vrdata.ysize), + xmin(current_display->xmin, 0), + ymin(current_display->ymin, 0), + xmax(current_display->xmax, 1), + ymax(current_display->ymax, 1) + { } + + void use(int i) { + glBindFramebuffer( GL_FRAMEBUFFER, vrdata.eyes[i]->m_nRenderFramebufferId ); + glViewport(0, 0, vrdata.xsize, vrdata.ysize ); + calcparam(); + } + + }; + EX void in_vr_ui(reaction_t what) { resetbuffer rb; if(!state) return; - int xsi = current_display->xsize; - int ysi = current_display->ysize; + int ui_xmed = (ui_xmin + ui_xmax) / 2; + int ui_ymed = (ui_ymin + ui_ymax) / 2; state = 2; for(int i=0; i<2; i++) { - dynamicval vx(vid.xres, vrdata.xsize); - dynamicval vy(vid.yres, vrdata.ysize); E4; - auto& ey = vrdata.eyes[i]; - glBindFramebuffer( GL_FRAMEBUFFER, ey->m_nRenderFramebufferId ); - glViewport(0, 0, vrdata.xsize, vrdata.ysize ); - calcparam(); + vr_eye_settings ey; + ey.use(i); glhr::set_depthtest(false); hmd_mvp = Id; - hmd_mvp = xpush(-xsi/2) * ypush(-ysi/2) * hmd_mvp; + hmd_mvp = xpush(-ui_xmed) * ypush(-ui_ymed) * hmd_mvp; transmatrix Sca = Id; Sca[0][0] *= ui_size * ui_size_unit; Sca[1][1] *= -ui_size * ui_size_unit; @@ -862,6 +917,8 @@ EX void in_vr_ui(reaction_t what) { hmd_mvp = vrdata.proj[i] * inverse(vrdata.eyepos[i]) * hmd_mvp; reset_projection(); current_display->set_all(0, 0); + current_display->xcenter = 0; + current_display->ycenter = 0; what(); } state = 1; @@ -994,13 +1051,8 @@ 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 ); - glViewport(0, 0, vrdata.xsize, vrdata.ysize ); + vr_eye_settings ey; + ey.use(i); glhr::set_depthtest(false); glhr::set_depthtest(true); glhr::set_depthwrite(false); @@ -1357,13 +1409,9 @@ EX void submit() { dynamicval ms(sightranges[geometry], 100); for(int e=0; e<2; e++) { - dynamicval vx(vid.xres, vrdata.xsize); - dynamicval vy(vid.yres, vrdata.ysize); + vr_eye_settings ey; + ey.use(e); E4; - auto& ey = vrdata.eyes[e]; - glBindFramebuffer( GL_FRAMEBUFFER, ey->m_nRenderFramebufferId ); - glViewport(0, 0, vrdata.xsize, vrdata.ysize ); - calcparam(); hmd_mvp = vrdata.proj[e] * inverse(vrdata.eyepos[e]) * sm * hmd_at * vrdata.pose_matrix[i] * sm * Id; hmd_pre = Id;