From e4adbdccaf8075261fef758964d5fa6b1735878b Mon Sep 17 00:00:00 2001 From: Dave Milici Date: Sat, 27 Mar 2021 14:18:11 -0700 Subject: [PATCH 1/2] Add above/below option sync blank interval for external sync doubler. --- common/main/game.h | 2 ++ similar/arch/ogl/ogl.cpp | 16 +++++++++++++++- similar/main/game.cpp | 8 ++++++++ similar/main/inferno.cpp | 1 + 4 files changed, 26 insertions(+), 1 deletion(-) diff --git a/common/main/game.h b/common/main/game.h index 73adeb1ce..8f19e3cf2 100644 --- a/common/main/game.h +++ b/common/main/game.h @@ -196,6 +196,7 @@ enum StereoFormat : uint8_t { STEREO_ABOVE_BELOW, STEREO_SIDE_BY_SIDE, STEREO_SIDE_BY_SIDE2, + STEREO_ABOVE_BELOW_SYNC, STEREO_MAX_FORMAT }; @@ -204,6 +205,7 @@ extern bool VR_half_width; extern bool VR_half_height; extern fix VR_eye_width; extern int VR_eye_offset; +extern int VR_sync_width; extern grs_canvas VR_hud_left; extern grs_canvas VR_hud_right; } diff --git a/similar/arch/ogl/ogl.cpp b/similar/arch/ogl/ogl.cpp index c066f2395..6aa198d9d 100644 --- a/similar/arch/ogl/ogl.cpp +++ b/similar/arch/ogl/ogl.cpp @@ -1303,8 +1303,16 @@ void ogl_stereo_frame(int xeye, int xoff) else { glGetIntegerv(GL_VIEWPORT, ogl_stereo_viewport.data()); // center unsqueezed side-by-side format - if (VR_stereo == STEREO_SIDE_BY_SIDE2) + switch (VR_stereo) { + case STEREO_SIDE_BY_SIDE2: ogl_stereo_viewport[1] -= ogl_stereo_viewport[3]/2; // y = h/4 + break; + case STEREO_ABOVE_BELOW_SYNC: + int dy = VR_sync_width/2; + ogl_stereo_viewport[3] -= dy; + ogl_stereo_viewport[1] += dy; + break; + } glViewport(ogl_stereo_viewport[0], ogl_stereo_viewport[1], ogl_stereo_viewport[2], ogl_stereo_viewport[3]); } // rightward image shift adjustment for left eye offset @@ -1332,6 +1340,12 @@ void ogl_stereo_frame(int xeye, int xoff) case STEREO_ABOVE_BELOW: ogl_stereo_viewport[1] -= ogl_stereo_viewport[3]; // y = h/2 break; + case STEREO_ABOVE_BELOW_SYNC: + int dy = VR_sync_width/2; + ogl_stereo_viewport[3] -= dy; + ogl_stereo_viewport[1] -= dy; + ogl_stereo_viewport[1] -= ogl_stereo_viewport[3]; // y = h/2 + break; } glViewport(ogl_stereo_viewport[0], ogl_stereo_viewport[1], ogl_stereo_viewport[2], ogl_stereo_viewport[3]); } diff --git a/similar/main/game.cpp b/similar/main/game.cpp index 1a444898e..3063441b5 100644 --- a/similar/main/game.cpp +++ b/similar/main/game.cpp @@ -191,6 +191,7 @@ bool VR_half_width = false; bool VR_half_height = false; fix VR_eye_width = F1_0; int VR_eye_offset = 0; +int VR_sync_width = 20; grs_canvas VR_hud_left; grs_canvas VR_hud_right; } @@ -208,6 +209,7 @@ void init_stereo() case STEREO_NONE: VR_half_width = VR_half_height = false; break; case STEREO_ABOVE_BELOW: + case STEREO_ABOVE_BELOW_SYNC: VR_half_width = false; VR_half_height = true; break; case STEREO_SIDE_BY_SIDE: VR_half_width = true; VR_half_height = false; break; @@ -216,6 +218,7 @@ void init_stereo() } VR_eye_width = (F1_0 * 7) / 10; // Descent 1.5 defaults VR_eye_offset = (VR_half_width) ? -6 : -12; + VR_sync_width = (20 * SHEIGHT) / 480; PlayerCfg.CockpitMode[1] = CM_FULL_SCREEN; } else { @@ -333,6 +336,7 @@ void game_init_render_sub_buffers( int x, int y, int w, int h ) 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; + int dy = VR_sync_width / 2; switch (VR_stereo) { case STEREO_NONE: gr_init_sub_canvas(VR_hud_left, grd_curscreen->sc_canvas, x+dx, y, w-dx, h); @@ -342,6 +346,10 @@ void game_init_render_sub_buffers( int x, int y, int w, int 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_ABOVE_BELOW_SYNC: + gr_init_sub_canvas(VR_hud_left, grd_curscreen->sc_canvas, x+dx, y, w-dx, h-dy); + gr_init_sub_canvas(VR_hud_right, grd_curscreen->sc_canvas, x, y+h+dy, w-dx, h-dy); + break; case STEREO_SIDE_BY_SIDE: 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); diff --git a/similar/main/inferno.cpp b/similar/main/inferno.cpp index c98e4bdfa..8b6c424ab 100644 --- a/similar/main/inferno.cpp +++ b/similar/main/inferno.cpp @@ -210,6 +210,7 @@ static void print_commandline_help() VERB(" 1: above/below half-height format\n") \ VERB(" 2: side/by/side half-width format\n") \ VERB(" 3: side/by/side half-size format, normal aspect ratio\n") \ + VERB(" 4: above/below format with external sync blank interval\n") \ ) \ DXX_if_defined_01(DXX_USE_UDP, ( \ VERB("\n Multiplayer:\n\n") \ From fe8a21763c84e775e7bfec968ab102e96cababe6 Mon Sep 17 00:00:00 2001 From: Dave Milici Date: Mon, 29 Mar 2021 20:10:37 -0700 Subject: [PATCH 2/2] Hack to keep stereo formats remaining fullscreen. When player gets killed, the screen inexplicably switches to another viewport format to show explosion POV and then switches to cockpit viewport, which is not compatible with stereo formats. Unable to locate where exactly cockpit gets switched on player dead state, so hack is in place to keep stereo formats fullscreen. --- similar/main/game.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/similar/main/game.cpp b/similar/main/game.cpp index 3063441b5..967d10af1 100644 --- a/similar/main/game.cpp +++ b/similar/main/game.cpp @@ -252,6 +252,10 @@ void init_cockpit() } #endif + // Hack to keep stereo formats remaining fullscreen + if (VR_stereo && PlayerCfg.CockpitMode[1] != CM_FULL_SCREEN) + PlayerCfg.CockpitMode[1] = CM_FULL_SCREEN; + gr_set_default_canvas(); switch( PlayerCfg.CockpitMode[1] ) {