From 23bbe7dde8105a6120ed965e8a5f81f088733b4f Mon Sep 17 00:00:00 2001 From: Dave Milici Date: Wed, 17 Mar 2021 18:01:03 -0700 Subject: [PATCH] Offset HUD screen rects for out-of-screen stereo parallax on HUD overlays. Used 1x VR_eye_offset to track image shift adjustments via OGL frustum planes instead of 2x VR_eye_offset used in Descent 1.5 image shift adjustments. Without any HUD rect offset, HUD overlays would appear to match the zero-parallax view plane instead of appearing in an out-of-screen parallax view plane. --- similar/main/game.cpp | 23 +++++++++++++---------- similar/main/gamecntl.cpp | 12 +++++++++--- similar/main/gamerend.cpp | 7 ++----- 3 files changed, 24 insertions(+), 18 deletions(-) diff --git a/similar/main/game.cpp b/similar/main/game.cpp index 73069ca23..1a444898e 100644 --- a/similar/main/game.cpp +++ b/similar/main/game.cpp @@ -217,7 +217,6 @@ void init_stereo() VR_eye_width = (F1_0 * 7) / 10; // Descent 1.5 defaults VR_eye_offset = (VR_half_width) ? -6 : -12; PlayerCfg.CockpitMode[1] = CM_FULL_SCREEN; - reset_cockpit(); } else { VR_stereo = VR_half_width = VR_half_height = false; @@ -331,23 +330,27 @@ void game_init_render_sub_buffers( int x, int y, int w, int h ) gr_clear_canvas(*grd_curcanv, 0); gr_init_sub_canvas(Screen_3d_window, grd_curscreen->sc_canvas, x, y, w, h); - switch (VR_stereo) { + if (VR_stereo) { + // offset HUD screen rects to force out-of-screen parallax on HUD overlays + int dx = (VR_eye_offset < 0) ? -VR_eye_offset : 0; + switch (VR_stereo) { case STEREO_NONE: - gr_init_sub_canvas(VR_hud_left, grd_curscreen->sc_canvas, x, y, w, h); - gr_init_sub_canvas(VR_hud_right, grd_curscreen->sc_canvas, x, y, w, h); + gr_init_sub_canvas(VR_hud_left, grd_curscreen->sc_canvas, x+dx, y, w-dx, h); + gr_init_sub_canvas(VR_hud_right, grd_curscreen->sc_canvas, x, y, w-dx, h); break; case STEREO_ABOVE_BELOW: - gr_init_sub_canvas(VR_hud_left, grd_curscreen->sc_canvas, x, y, w, h); - gr_init_sub_canvas(VR_hud_right, grd_curscreen->sc_canvas, x, y+h, w, h); + gr_init_sub_canvas(VR_hud_left, grd_curscreen->sc_canvas, x+dx, y, w-dx, h); + gr_init_sub_canvas(VR_hud_right, grd_curscreen->sc_canvas, x, y+h, w-dx, h); break; case STEREO_SIDE_BY_SIDE: - gr_init_sub_canvas(VR_hud_left, grd_curscreen->sc_canvas, x, y, w, h); - gr_init_sub_canvas(VR_hud_right, grd_curscreen->sc_canvas, x+w, y, w, h); + gr_init_sub_canvas(VR_hud_left, grd_curscreen->sc_canvas, x+dx, y, w-dx, h); + gr_init_sub_canvas(VR_hud_right, grd_curscreen->sc_canvas, x+w, y, w-dx, h); break; case STEREO_SIDE_BY_SIDE2: - gr_init_sub_canvas(VR_hud_left, grd_curscreen->sc_canvas, x, y+h/2, w, h); - gr_init_sub_canvas(VR_hud_right, grd_curscreen->sc_canvas, x+w, y+h/2, w, h); + gr_init_sub_canvas(VR_hud_left, grd_curscreen->sc_canvas, x+dx, y+h/2, w-dx, h); + gr_init_sub_canvas(VR_hud_right, grd_curscreen->sc_canvas, x+w, y+h/2, w-dx, h); break; + } } } diff --git a/similar/main/gamecntl.cpp b/similar/main/gamecntl.cpp index 03ca62fc9..500a3400b 100644 --- a/similar/main/gamecntl.cpp +++ b/similar/main/gamecntl.cpp @@ -912,28 +912,34 @@ static window_event_result HandleSystemKey(int key) break; #endif -#ifdef DXX_USE_OGL +#if DXX_USE_OGL case KEY_SHIFTED + KEY_F5: VR_eye_offset -= 1; + reset_cockpit(); break; case KEY_SHIFTED + KEY_F6: VR_eye_offset += 1; + reset_cockpit(); break; case KEY_SHIFTED + KEY_ALTED + KEY_F5: VR_eye_width -= (F1_0/10); //*= 10/11; + reset_cockpit(); break; case KEY_SHIFTED + KEY_ALTED + KEY_F6: VR_eye_width += (F1_0/10); //*= 11/10; + reset_cockpit(); break; case KEY_SHIFTED + KEY_F7: case KEY_SHIFTED + KEY_ALTED + KEY_F7: VR_eye_width = F1_0; VR_eye_offset = 0; + reset_cockpit(); break; case KEY_SHIFTED + KEY_F8: case KEY_SHIFTED + KEY_ALTED + KEY_F8: - ++VR_stereo %= STEREO_MAX_FORMAT; - init_stereo(); + ++VR_stereo %= STEREO_MAX_FORMAT; + init_stereo(); + reset_cockpit(); break; #endif diff --git a/similar/main/gamerend.cpp b/similar/main/gamerend.cpp index 236718747..3aa015268 100644 --- a/similar/main/gamerend.cpp +++ b/similar/main/gamerend.cpp @@ -778,7 +778,7 @@ int BigWindowSwitch=0; //render a frame for the game void game_render_frame_mono(const control_info &Controls) { - int no_draw_hud = 0; //VR_stereo; + int no_draw_hud = 0; gr_set_current_canvas(Screen_3d_window); #if defined(DXX_BUILD_DESCENT_II) @@ -869,14 +869,11 @@ void game_render_frame_mono(const control_info &Controls) gr_set_current_canvas(Screen_3d_window); if (!no_draw_hud) { if (VR_stereo) { -// gr_set_current_canvas(VR_hud_left); game_draw_hud_stuff(VR_hud_left, Controls); -// gr_set_current_canvas(VR_hud_right); game_draw_hud_stuff(VR_hud_right, Controls); -// gr_set_default_canvas(); } else - game_draw_hud_stuff(*grd_curcanv, Controls); + game_draw_hud_stuff(*grd_curcanv, Controls); } #if defined(DXX_BUILD_DESCENT_II)