From 704c942545bbbdd227da60bdf64da74ed3fab6c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaakko=20Ker=C3=A4nen?= Date: Wed, 20 Nov 2013 12:16:47 +0200 Subject: [PATCH] Stereo 3D: Only use a stereo GL format if necessary Whenever the VR mode changes, the canvas GL format is checked for possible changes. --- doomsday/client/include/render/vr.h | 17 +++++++++-------- doomsday/client/src/render/vr.cpp | 9 ++++++++- doomsday/client/src/ui/clientwindow.cpp | 11 ++++++++--- 3 files changed, 25 insertions(+), 12 deletions(-) diff --git a/doomsday/client/include/render/vr.h b/doomsday/client/include/render/vr.h index 4b1c0355ba..a5f2b72e60 100644 --- a/doomsday/client/include/render/vr.h +++ b/doomsday/client/include/render/vr.h @@ -80,14 +80,15 @@ void releaseViewPosition(); bool viewPositionHeld(); // Console variables -Stereo3DMode mode(); /// Currently active Stereo3DMode index -float riftFovX(); /// Horizontal field of view in Oculus Rift in degrees -float riftLatency(); /// Estimated head-motion->photons latency, in seconds - -extern float ipd; /// Interpupillary distance in meters -extern float playerHeight; /// Human player's real world height in meters -extern float dominantEye; /// Kludge for aim-down-weapon-sight modes -extern byte swapEyes; /// When true, inverts stereoscopic effect +Stereo3DMode mode(); ///< Currently active Stereo3DMode index +bool modeNeedsStereoGLFormat(Stereo3DMode mode); +float riftFovX(); ///< Horizontal field of view in Oculus Rift in degrees +float riftLatency(); ///< Estimated head-motion->photons latency, in seconds + +extern float ipd; ///< Interpupillary distance in meters +extern float playerHeight; ///< Human player's real world height in meters +extern float dominantEye; ///< Kludge for aim-down-weapon-sight modes +extern byte swapEyes; ///< When true, inverts stereoscopic effect // Variables below are global, but not user visible // diff --git a/doomsday/client/src/render/vr.cpp b/doomsday/client/src/render/vr.cpp index d60a5fca9e..6a32c69c53 100644 --- a/doomsday/client/src/render/vr.cpp +++ b/doomsday/client/src/render/vr.cpp @@ -80,6 +80,11 @@ VR::Stereo3DMode VR::mode() return (VR::Stereo3DMode)vrMode; } +bool VR::modeNeedsStereoGLFormat(VR::Stereo3DMode mode) +{ + return mode == VR::MODE_QUAD_BUFFERED; +} + static float vrRiftFovX = 114.8; float VR::riftFovX() /// Horizontal field of view in degrees { @@ -134,7 +139,9 @@ static void vrModeChanged() if(ClientWindow::hasMain()) { // The logical UI size may need to be changed. - ClientWindow::main().updateRootSize(); + ClientWindow &win = ClientWindow::main(); + win.updateRootSize(); + win.updateCanvasFormat(); // possibly changes pixel format } if (VR::mode() == VR::MODE_OCULUS_RIFT) { if(Con_GetFloat("rend-camera-fov") != vrRiftFovX) diff --git a/doomsday/client/src/ui/clientwindow.cpp b/doomsday/client/src/ui/clientwindow.cpp index 956b56149f..1ff0e7098d 100644 --- a/doomsday/client/src/ui/clientwindow.cpp +++ b/doomsday/client/src/ui/clientwindow.cpp @@ -242,8 +242,6 @@ DENG2_OBSERVES(App, GameChange) switch(newMode) { case Busy: - //busy->renderTransitionFrame(); - game->hide(); game->disable(); gameUI->hide(); @@ -258,6 +256,7 @@ DENG2_OBSERVES(App, GameChange) default: busy->hide(); busy->disable(); + game->show(); game->enable(); gameUI->show(); @@ -669,7 +668,13 @@ bool ClientWindow::setDefaultGLFormat() // static fmt.setDepthBufferSize(16); fmt.setStencilBufferSize(8); fmt.setDoubleBuffer(true); - fmt.setStereo(true); + + if(VR::modeNeedsStereoGLFormat(VR::mode())) + { + // Only use a stereo format for modes that require it. + LOG_MSG("Using a stereoscopic format"); + fmt.setStereo(true); + } if(CommandLine_Exists("-novsync") || !Con_GetByte("vid-vsync")) {