Use enum class for VR StereoFormat
This commit is contained in:
parent
007ac68569
commit
7f51fa3ac5
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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])
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue