From 90d3d82d8eb68624cfbf7e20c808baf8e9697d5a Mon Sep 17 00:00:00 2001 From: Kp Date: Sun, 9 Oct 2022 23:15:20 +0000 Subject: [PATCH] Default disable VR side-by-side for OpenGL ES VR requires glDrawBuffer, which Mesa OpenGL ES does not offer. Default VR to disabled for OpenGL ES users. Users who want to try it anyway can still set use_stereo_render=1 in the SCons environment. --- SConstruct | 12 ++++++++++++ common/include/args.h | 2 ++ common/include/ogl_init.h | 2 ++ common/main/fwd-game.h | 4 ++++ common/main/game.h | 2 ++ similar/arch/ogl/ogl.cpp | 2 +- similar/main/game.cpp | 13 +++++++++++++ similar/main/gamecntl.cpp | 2 +- similar/main/gamerend.cpp | 18 +++++++++++++++++- similar/main/inferno.cpp | 2 +- similar/main/render.cpp | 4 +++- similar/misc/args.cpp | 4 ++++ 12 files changed, 62 insertions(+), 5 deletions(-) diff --git a/SConstruct b/SConstruct index 112560b02..812954858 100644 --- a/SConstruct +++ b/SConstruct @@ -1255,6 +1255,10 @@ int main(int argc,char**argv){(void)argc;(void)argv; def _check_user_settings_ipv6(self,context,_CPPDEFINES='DXX_USE_IPv6'): self._result_check_user_setting(context, self.user_settings.ipv6, _CPPDEFINES, 'IPv6 support') + @_custom_test + def _check_user_settings_stereo_render(self,context,_CPPDEFINES='DXX_USE_STEREOSCOPIC_RENDER'): + self._result_check_user_setting(context, self.user_settings.use_stereo_render, _CPPDEFINES, 'stereoscopic rendering') + @_custom_test def _check_user_settings_udp(self,context,_CPPDEFINES='DXX_USE_UDP'): self._result_check_user_setting(context, self.user_settings.use_udp, _CPPDEFINES, 'multiplayer over UDP') @@ -3641,6 +3645,8 @@ class DXXCommon(LazyObjectConstructor): if self.raspberrypi in ('yes', 'mesa'): return True return False + def default_use_stereo_render(self): + return self.opengl and not self.opengles def selected_OGLES_LIB(self): if self.raspberrypi == 'yes': return 'brcmGLESv2' @@ -3841,6 +3847,12 @@ class DXXCommon(LazyObjectConstructor): ('show_linker_version', True, None), ), }, + { + 'variable': BoolVariable, + 'arguments': ( + ('use_stereo_render', self.default_use_stereo_render, 'enable stereoscopic rendering'), + ), + }, { 'variable': generic_variable, 'arguments': ( diff --git a/common/include/args.h b/common/include/args.h index 3968ce381..6ab404407 100644 --- a/common/include/args.h +++ b/common/include/args.h @@ -100,8 +100,10 @@ struct CArg : prohibit_void_ptr bool DbgGlGetTexLevelParamOk; bool DbgGlLuminance4Alpha4Ok; bool DbgGlRGBA2Ok; +#if DXX_USE_STEREOSCOPIC_RENDER bool OglStereo; uint8_t OglStereoView; +#endif unsigned OglSyncWait; #else bool DbgSdlHWSurface; diff --git a/common/include/ogl_init.h b/common/include/ogl_init.h index 9b6bbae3d..972cc36c9 100644 --- a/common/include/ogl_init.h +++ b/common/include/ogl_init.h @@ -66,7 +66,9 @@ void ogl_loadbmtexture_f(grs_bitmap &bm, opengl_texture_filter texfilt, bool tex void ogl_freebmtexture(grs_bitmap &bm); void ogl_start_frame(grs_canvas &); +#if DXX_USE_STEREOSCOPIC_RENDER void ogl_stereo_frame(bool left_eye, int xoff); +#endif void ogl_end_frame(void); void ogl_set_screen_mode(void); diff --git a/common/main/fwd-game.h b/common/main/fwd-game.h index 13d70de4b..b3f5d786e 100644 --- a/common/main/fwd-game.h +++ b/common/main/fwd-game.h @@ -92,6 +92,7 @@ extern int Global_missile_firing_count; extern int PaletteRedAdd, PaletteGreenAdd, PaletteBlueAdd; +#if DXX_USE_STEREOSCOPIC_RENDER // Stereo viewport formats enum class StereoFormat : uint8_t; @@ -101,6 +102,7 @@ extern int VR_eye_offset; extern int VR_sync_width; extern grs_subcanvas VR_hud_left; extern grs_subcanvas VR_hud_right; +#endif extern cockpit_mode_t last_drawn_cockpit; @@ -160,7 +162,9 @@ extern game_window *Game_wind; void game(); void init_game(); +#if DXX_USE_STEREOSCOPIC_RENDER void init_stereo(); +#endif void init_cockpit(); void PALETTE_FLASH_ADD(int dr, int dg, int db); diff --git a/common/main/game.h b/common/main/game.h index eb2dfa4fe..6326945e1 100644 --- a/common/main/game.h +++ b/common/main/game.h @@ -138,6 +138,7 @@ struct d_game_unique_state } }; +#if DXX_USE_STEREOSCOPIC_RENDER // Stereo viewport formats enum class StereoFormat : uint8_t { @@ -148,6 +149,7 @@ enum class StereoFormat : uint8_t AboveBelowSync, HighestFormat = AboveBelowSync }; +#endif } diff --git a/similar/arch/ogl/ogl.cpp b/similar/arch/ogl/ogl.cpp index 0cd4b1c98..dceff6545 100644 --- a/similar/arch/ogl/ogl.cpp +++ b/similar/arch/ogl/ogl.cpp @@ -1280,7 +1280,7 @@ void ogl_start_frame(grs_canvas &canvas) glLoadIdentity();//clear matrix } -#if !DXX_USE_OGLES +#if DXX_USE_STEREOSCOPIC_RENDER void ogl_stereo_frame(const bool left_eye, const int xoff) { const float dxoff = xoff * 2.0f / grd_curscreen->sc_canvas.cv_bitmap.bm_w; diff --git a/similar/main/game.cpp b/similar/main/game.cpp index 5bb975937..cd2dc5890 100644 --- a/similar/main/game.cpp +++ b/similar/main/game.cpp @@ -203,16 +203,20 @@ 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; +#if DXX_USE_STEREOSCOPIC_RENDER StereoFormat VR_stereo; fix VR_eye_width = F1_0; int VR_eye_offset = 0; int VR_sync_width = 20; grs_subcanvas VR_hud_left; grs_subcanvas VR_hud_right; +#endif + } namespace dsx { +#if DXX_USE_STEREOSCOPIC_RENDER void init_stereo() { #if DXX_USE_OGL @@ -243,6 +247,7 @@ void init_stereo() } #endif } +#endif //initialize the various canvases on the game screen //called every time the screen mode or cockpit changes @@ -300,6 +305,7 @@ void init_cockpit() { unsigned w = SWIDTH; unsigned h = SHEIGHT; +#if DXX_USE_STEREOSCOPIC_RENDER switch (VR_stereo) { case StereoFormat::None: @@ -323,6 +329,7 @@ void init_cockpit() w /= 2; break; } +#endif game_init_render_sub_buffers(canvas, 0, 0, w, h); } break; @@ -356,9 +363,11 @@ void init_cockpit() //selects a given cockpit (or lack of one). See types in game.h void select_cockpit(const cockpit_mode_t mode) { +#if DXX_USE_STEREOSCOPIC_RENDER // skip switching cockpit views while stereo viewport active if (VR_stereo != StereoFormat::None && mode != cockpit_mode_t::full_screen) return; +#endif if (mode != PlayerCfg.CockpitMode[1]) { //new mode PlayerCfg.CockpitMode[1]=mode; @@ -380,6 +389,7 @@ void game_init_render_sub_buffers(grs_canvas &canvas, const int x, const int y, gr_clear_canvas(canvas, 0); gr_init_sub_canvas(Screen_3d_window, canvas, x, y, w, h); +#if DXX_USE_STEREOSCOPIC_RENDER if (VR_stereo != StereoFormat::None) { // offset HUD screen rects to force out-of-screen parallax on HUD overlays @@ -429,6 +439,7 @@ void game_init_render_sub_buffers(grs_canvas &canvas, const int x, const int y, gr_init_sub_canvas(VR_hud_left, grd_curscreen->sc_canvas, l.x, l.y, l.w, l.h); gr_init_sub_canvas(VR_hud_right, grd_curscreen->sc_canvas, r.x, r.y, r.w, r.h); } +#endif } } @@ -1729,7 +1740,9 @@ game_window *game_setup() auto game_wind = window_create(grd_curscreen->sc_canvas, 0, 0, SWIDTH, SHEIGHT); reset_palette_add(); +#if DXX_USE_STEREOSCOPIC_RENDER init_stereo(); +#endif init_cockpit(); init_gauges(); netplayerinfo_on = 0; diff --git a/similar/main/gamecntl.cpp b/similar/main/gamecntl.cpp index fe0211d39..69f46bc1d 100644 --- a/similar/main/gamecntl.cpp +++ b/similar/main/gamecntl.cpp @@ -977,7 +977,7 @@ static window_event_result HandleSystemKey(int key) break; #endif -#if DXX_USE_OGL +#if DXX_USE_STEREOSCOPIC_RENDER #if 0 /* These conflict with the drop-primary and drop-secondary * keybindings. Dropping items is more common than using VR, so diff --git a/similar/main/gamerend.cpp b/similar/main/gamerend.cpp index 19f1e85e3..3d8c1d73a 100644 --- a/similar/main/gamerend.cpp +++ b/similar/main/gamerend.cpp @@ -802,13 +802,17 @@ void game_render_frame_mono(const d_robot_info_array &Robot_info, const control_ Viewer = gimobj; window_rendered_data window; +#if DXX_USE_STEREOSCOPIC_RENDER if (VR_stereo != StereoFormat::None) { render_frame(canvas, -VR_eye_width, window); render_frame(canvas, +VR_eye_width, window); } else +#endif + { render_frame(canvas, 0, window); + } wake_up_rendered_objects(*Viewer, window); show_HUD_names(Robot_info, canvas, Game_mode); @@ -840,13 +844,17 @@ void game_render_frame_mono(const d_robot_info_array &Robot_info, const control_ } #endif window_rendered_data window; +#if DXX_USE_STEREOSCOPIC_RENDER if (VR_stereo != StereoFormat::None) { render_frame(canvas, -VR_eye_width, window); render_frame(canvas, +VR_eye_width, window); } else +#endif + { render_frame(canvas, 0, window); + } } } gr_set_default_canvas(); @@ -859,13 +867,17 @@ void game_render_frame_mono(const d_robot_info_array &Robot_info, const control_ } if (!no_draw_hud) { +#if DXX_USE_STEREOSCOPIC_RENDER if (VR_stereo != StereoFormat::None) { game_draw_hud_stuff(Robot_info, VR_hud_left, Controls); game_draw_hud_stuff(Robot_info, VR_hud_right, Controls); } else +#endif + { game_draw_hud_stuff(Robot_info, Screen_3d_window, Controls); + } } #if defined(DXX_BUILD_DESCENT_II) @@ -884,8 +896,12 @@ void game_render_frame_mono(const d_robot_info_array &Robot_info, const control_ void toggle_cockpit() { - if (Rear_view || Player_dead_state != player_dead_state::no || VR_stereo != StereoFormat::None) + if (Rear_view || Player_dead_state != player_dead_state::no) return; +#if DXX_USE_STEREOSCOPIC_RENDER + if (VR_stereo != StereoFormat::None) + return; +#endif auto new_mode = cockpit_mode_t::full_screen; diff --git a/similar/main/inferno.cpp b/similar/main/inferno.cpp index 7fc364935..a13a328ea 100644 --- a/similar/main/inferno.cpp +++ b/similar/main/inferno.cpp @@ -220,7 +220,7 @@ static void print_commandline_help() VERB(" 5: Auto: if VSync is enabled and ARB_sync is supported, use mode 2, otherwise mode 0\n") \ VERB(" -gl_syncwait Wait interval (ms) for sync mode 2 (default: " DXX_STRINGIZE(OGL_SYNC_WAIT_DEFAULT) ")\n") \ VERB(" -gl_darkedges Re-enable dark edges around filtered textures (as present in earlier versions of the engine)\n") \ - DXX_if_not_defined_to_1(RELEASE, ( \ + DXX_if_defined_01(DXX_USE_STEREOSCOPIC_RENDER, ( \ VERB(" -gl_stereo Enable OpenGL stereo quad buffering, if available\n") \ VERB(" -gl_stereoview Select OpenGL stereo viewport mode (experimental; incomplete)\n") \ VERB(" 1: above/below half-height format\n") \ diff --git a/similar/main/render.cpp b/similar/main/render.cpp index d2594b067..05e0fe949 100644 --- a/similar/main/render.cpp +++ b/similar/main/render.cpp @@ -1265,10 +1265,12 @@ void render_frame(grs_canvas &canvas, fix eye_offset, window_rendered_data &wind g3_start_frame(canvas); -#if DXX_USE_OGL && !DXX_USE_OGLES +#if DXX_USE_STEREOSCOPIC_RENDER +#if DXX_USE_OGL // select stereo viewport/transform/buffer per left/right eye if (VR_stereo != StereoFormat::None && eye_offset) ogl_stereo_frame(eye_offset < 0, VR_eye_offset); +#endif #endif auto Viewer_eye = Viewer->pos; diff --git a/similar/misc/args.cpp b/similar/misc/args.cpp index 51873cdc0..ac172123e 100644 --- a/similar/misc/args.cpp +++ b/similar/misc/args.cpp @@ -153,7 +153,9 @@ static void InitGameArg() #if DXX_USE_OGL CGameArg.OglSyncMethod = OGL_SYNC_METHOD_DEFAULT; CGameArg.OglSyncWait = OGL_SYNC_WAIT_DEFAULT; +#if DXX_USE_STEREOSCOPIC_RENDER CGameArg.OglStereo = false; +#endif CGameArg.DbgGlIntensity4Ok = true; CGameArg.DbgGlLuminance4Alpha4Ok = true; CGameArg.DbgGlRGBA2Ok = true; @@ -294,10 +296,12 @@ static void ReadCmdArgs(Inilist &ini, Arglist &Args) CGameArg.OglSyncWait = arg_integer(pp, end); else if (!d_stricmp(p, "-gl_darkedges")) CGameArg.OglDarkEdges = true; +#if DXX_USE_STEREOSCOPIC_RENDER else if (!d_stricmp(p, "-gl_stereo")) CGameArg.OglStereo = true; else if (!d_stricmp(p, "-gl_stereoview")) CGameArg.OglStereoView = arg_integer(pp, end); +#endif #endif // Multiplayer Options