Use enum class for VR StereoFormat

This commit is contained in:
Kp 2021-09-12 16:20:52 +00:00
parent 007ac68569
commit 7f51fa3ac5
7 changed files with 53 additions and 46 deletions

View file

@ -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;

View file

@ -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<GLint, 4> 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;
}

View file

@ -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<StereoFormat>(CGameArg.OglStereoView % (static_cast<unsigned>(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;

View file

@ -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<StereoFormat>((static_cast<unsigned>(VR_stereo) + 1) % (static_cast<unsigned>(StereoFormat::HighestFormat) + 1));
init_stereo();
reset_cockpit();
break;

View file

@ -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])

View file

@ -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

View file

@ -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;