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.
This commit is contained in:
parent
dac2fa22d7
commit
90d3d82d8e
12
SConstruct
12
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': (
|
||||
|
|
|
@ -100,8 +100,10 @@ struct CArg : prohibit_void_ptr<CArg>
|
|||
bool DbgGlGetTexLevelParamOk;
|
||||
bool DbgGlLuminance4Alpha4Ok;
|
||||
bool DbgGlRGBA2Ok;
|
||||
#if DXX_USE_STEREOSCOPIC_RENDER
|
||||
bool OglStereo;
|
||||
uint8_t OglStereoView;
|
||||
#endif
|
||||
unsigned OglSyncWait;
|
||||
#else
|
||||
bool DbgSdlHWSurface;
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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<game_window>(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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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 <n> 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 <n> Select OpenGL stereo viewport mode (experimental; incomplete)\n") \
|
||||
VERB(" 1: above/below half-height format\n") \
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue