diff --git a/common/main/game.h b/common/main/game.h index dd6be4e67..c194a4906 100644 --- a/common/main/game.h +++ b/common/main/game.h @@ -191,16 +191,16 @@ extern int Global_missile_firing_count; extern int PaletteRedAdd, PaletteGreenAdd, PaletteBlueAdd; // Stereo viewport formats -enum StereoFormat : uint8_t { - STEREO_NONE=0, - STEREO_ABOVE_BELOW, - STEREO_SIDE_BY_SIDE, - STEREO_SIDE_BY_SIDE2, - STEREO_ABOVE_BELOW_SYNC, - STEREO_MAX_FORMAT +enum class StereoFormat : uint8_t { + None = 0, + AboveBelow, + SideBySideFullHeight, + SideBySideHalfHeight, + AboveBelowSync, + HighestFormat = AboveBelowSync }; -extern int VR_stereo; +extern StereoFormat VR_stereo; extern fix VR_eye_width; extern int VR_eye_offset; extern int VR_sync_width; diff --git a/similar/arch/ogl/ogl.cpp b/similar/arch/ogl/ogl.cpp index c45e5f024..bb449fe61 100644 --- a/similar/arch/ogl/ogl.cpp +++ b/similar/arch/ogl/ogl.cpp @@ -1311,10 +1311,14 @@ void ogl_stereo_frame(const int xeye, const int xoff) glGetIntegerv(GL_VIEWPORT, ogl_stereo_viewport.data()); // center unsqueezed side-by-side format switch (VR_stereo) { - case STEREO_SIDE_BY_SIDE2: + case StereoFormat::None: + case StereoFormat::AboveBelow: + case StereoFormat::SideBySideFullHeight: + break; + case StereoFormat::SideBySideHalfHeight: ogl_stereo_viewport[1] -= ogl_stereo_viewport[3]/2; // y = h/4 break; - case STEREO_ABOVE_BELOW_SYNC: + case StereoFormat::AboveBelowSync: int dy = VR_sync_width/2; ogl_stereo_viewport[3] -= dy; ogl_stereo_viewport[1] += dy; @@ -1333,19 +1337,21 @@ void ogl_stereo_frame(const int xeye, const int xoff) std::array ogl_stereo_viewport; glGetIntegerv(GL_VIEWPORT, ogl_stereo_viewport.data()); switch (VR_stereo) { + case StereoFormat::None: + break; // center unsqueezed side-by-side format - case STEREO_SIDE_BY_SIDE2: + case StereoFormat::SideBySideHalfHeight: ogl_stereo_viewport[1] -= ogl_stereo_viewport[3]/2; // y = h/4 DXX_BOOST_FALLTHROUGH; // half-width viewports for side-by-side format - case STEREO_SIDE_BY_SIDE: + case StereoFormat::SideBySideFullHeight: ogl_stereo_viewport[0] += ogl_stereo_viewport[2]; // x = w/2 break; // half-height viewports for above/below format - case STEREO_ABOVE_BELOW_SYNC: - case STEREO_ABOVE_BELOW: + case StereoFormat::AboveBelowSync: + case StereoFormat::AboveBelow: ogl_stereo_viewport[1] -= ogl_stereo_viewport[3]; // y = h/2 - if (VR_stereo == STEREO_ABOVE_BELOW_SYNC) + if (VR_stereo == StereoFormat::AboveBelowSync) ogl_stereo_viewport[3] -= VR_sync_width/2; break; } diff --git a/similar/main/game.cpp b/similar/main/game.cpp index 1c09ac80c..7813be8c2 100644 --- a/similar/main/game.cpp +++ b/similar/main/game.cpp @@ -185,7 +185,7 @@ constexpr screen_mode initial_small_game_screen_mode{320, 200}; constexpr screen_mode initial_large_game_screen_mode{1024, 768}; screen_mode Game_screen_mode = initial_large_game_screen_mode; -int VR_stereo = false; +StereoFormat VR_stereo; fix VR_eye_width = F1_0; int VR_eye_offset = 0; int VR_sync_width = 20; @@ -200,19 +200,19 @@ void init_stereo() #if DXX_USE_OGL // init stereo options if (CGameArg.OglStereo || CGameArg.OglStereoView) { - if (!VR_stereo && !VR_eye_offset) - VR_stereo = (CGameArg.OglStereoView) ? CGameArg.OglStereoView % STEREO_MAX_FORMAT : STEREO_ABOVE_BELOW; + if (VR_stereo == StereoFormat::None && !VR_eye_offset) + VR_stereo = (CGameArg.OglStereoView) ? static_cast(CGameArg.OglStereoView % (static_cast(StereoFormat::HighestFormat) + 1)) : StereoFormat::AboveBelow; constexpr int half_width_eye_offset = -6; constexpr int full_width_eye_offset = -12; switch (VR_stereo) { - case STEREO_NONE: - case STEREO_ABOVE_BELOW: - case STEREO_ABOVE_BELOW_SYNC: + case StereoFormat::None: + case StereoFormat::AboveBelow: + case StereoFormat::AboveBelowSync: VR_eye_offset = full_width_eye_offset; break; - case STEREO_SIDE_BY_SIDE: - case STEREO_SIDE_BY_SIDE2: + case StereoFormat::SideBySideFullHeight: + case StereoFormat::SideBySideHalfHeight: VR_eye_offset = half_width_eye_offset; break; } @@ -221,7 +221,7 @@ void init_stereo() PlayerCfg.CockpitMode[1] = CM_FULL_SCREEN; } else { - VR_stereo = false; + VR_stereo = StereoFormat::None; } #endif } @@ -279,22 +279,22 @@ void init_cockpit() unsigned h = SHEIGHT; switch (VR_stereo) { - case STEREO_NONE: + case StereoFormat::None: /* Preserve width */ /* Preserve height */ break; - case STEREO_ABOVE_BELOW: - case STEREO_ABOVE_BELOW_SYNC: + case StereoFormat::AboveBelow: + case StereoFormat::AboveBelowSync: /* Preserve width */ /* Change height */ h /= 2; break; - case STEREO_SIDE_BY_SIDE2: + case StereoFormat::SideBySideHalfHeight: /* Change width */ /* Change height */ h /= 2; DXX_BOOST_FALLTHROUGH; - case STEREO_SIDE_BY_SIDE: + case StereoFormat::SideBySideFullHeight: /* Change width */ /* Preserve height */ w /= 2; @@ -334,7 +334,7 @@ void init_cockpit() void select_cockpit(cockpit_mode_t mode) { // skip switching cockpit views while stereo viewport active - if (VR_stereo && mode != CM_FULL_SCREEN) + if (VR_stereo != StereoFormat::None && mode != CM_FULL_SCREEN) return; if (mode != PlayerCfg.CockpitMode[1]) { //new mode @@ -357,28 +357,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); - if (VR_stereo) { + if (VR_stereo != StereoFormat::None) + { // 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); - gr_init_sub_canvas(VR_hud_right, grd_curscreen->sc_canvas, x, y, w-dx, h); - break; - case STEREO_ABOVE_BELOW: + case StereoFormat::None: + break; + case StereoFormat::AboveBelow: 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: + case StereoFormat::AboveBelowSync: 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: + case StereoFormat::SideBySideFullHeight: 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: + case StereoFormat::SideBySideHalfHeight: 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 e79008e1e..601e5f334 100644 --- a/similar/main/gamecntl.cpp +++ b/similar/main/gamecntl.cpp @@ -999,7 +999,7 @@ static window_event_result HandleSystemKey(int key) break; case KEY_SHIFTED + KEY_F8: case KEY_SHIFTED + KEY_ALTED + KEY_F8: - ++VR_stereo %= STEREO_MAX_FORMAT; + VR_stereo = static_cast((static_cast(VR_stereo) + 1) % (static_cast(StereoFormat::HighestFormat) + 1)); init_stereo(); reset_cockpit(); break; diff --git a/similar/main/gamerend.cpp b/similar/main/gamerend.cpp index c14403f8e..e21096c85 100644 --- a/similar/main/gamerend.cpp +++ b/similar/main/gamerend.cpp @@ -802,7 +802,8 @@ void game_render_frame_mono(const control_info &Controls) Viewer = gimobj; window_rendered_data window; - if (VR_stereo) { + if (VR_stereo != StereoFormat::None) + { render_frame(*grd_curcanv, -VR_eye_width, window); render_frame(*grd_curcanv, +VR_eye_width, window); } @@ -839,7 +840,8 @@ void game_render_frame_mono(const control_info &Controls) } #endif window_rendered_data window; - if (VR_stereo) { + if (VR_stereo != StereoFormat::None) + { render_frame(*grd_curcanv, -VR_eye_width, window); render_frame(*grd_curcanv, +VR_eye_width, window); } @@ -864,7 +866,8 @@ void game_render_frame_mono(const control_info &Controls) gr_set_current_canvas(Screen_3d_window); if (!no_draw_hud) { - if (VR_stereo) { + if (VR_stereo != StereoFormat::None) + { game_draw_hud_stuff(VR_hud_left, Controls); game_draw_hud_stuff(VR_hud_right, Controls); } @@ -888,7 +891,7 @@ void toggle_cockpit() { enum cockpit_mode_t new_mode=CM_FULL_SCREEN; - if (Rear_view || Player_dead_state != player_dead_state::no || VR_stereo) + if (Rear_view || Player_dead_state != player_dead_state::no || VR_stereo != StereoFormat::None) return; switch (PlayerCfg.CockpitMode[1]) diff --git a/similar/main/render.cpp b/similar/main/render.cpp index 90103a488..2154c3d71 100644 --- a/similar/main/render.cpp +++ b/similar/main/render.cpp @@ -1215,7 +1215,7 @@ void render_frame(grs_canvas &canvas, fix eye_offset, window_rendered_data &wind #if DXX_USE_OGL // select stereo viewport/transform/buffer per left/right eye - if (VR_stereo) + if (VR_stereo != StereoFormat::None) ogl_stereo_frame(eye_offset, VR_eye_offset); #endif diff --git a/similar/misc/args.cpp b/similar/misc/args.cpp index 251e42f35..d7eeacf62 100644 --- a/similar/misc/args.cpp +++ b/similar/misc/args.cpp @@ -154,7 +154,6 @@ static void InitGameArg() CGameArg.OglSyncMethod = OGL_SYNC_METHOD_DEFAULT; CGameArg.OglSyncWait = OGL_SYNC_WAIT_DEFAULT; CGameArg.OglStereo = false; - CGameArg.OglStereoView = STEREO_NONE; CGameArg.DbgGlIntensity4Ok = true; CGameArg.DbgGlLuminance4Alpha4Ok = true; CGameArg.DbgGlRGBA2Ok = true;