Refactor OpenVR init code to separate class

The OpenVR init code is currently being run in the OverlayController
constructor. Member objects that are initialized before the
OverlayController (ideally all of them) can't use OpenVR APIs before the
first line of the OverlayController constructor. Implementing the OpenVR
Init code as a class means that it is able to initialize before all the
other objects and allow them to use OpenVR APIs in their constructors.

The class has been placed in a folder called "overlaycontroller" to
signify that it should only be used by the OverlayController.

openvr_init.h uses #pragma once despite it being unofficial since it is
supported on all modern compilers.

The copy constructor, copy assignment operator, move constructor and
move assignment operator have been explicitly deleted in order to make
sure nobody tries to use the object in an unintended way, and to
document that these functions should not be automatically created.

The version error messages have been replaced with a single lambda,
since they were all identical.

The version error text should maybe tell the user to update Advanced
Settings instead of OpenVR, since Advanced Settings contains the version
strings in the binary.

No other exit functions were documented on the official docs besides
VR_Shutdown().
This commit is contained in:
Vasily
2019-01-18 23:28:17 +01:00
parent 5ee667a56b
commit d8f179fdf7
5 changed files with 132 additions and 111 deletions
+6 -109
View File
@@ -31,26 +31,13 @@ QSettings* OverlayController::_appSettings = nullptr;
OverlayController::OverlayController( bool desktopMode,
bool noSound,
QQmlEngine& qmlEngine )
: QObject(), m_desktopMode( desktopMode ), m_noSound( noSound )
: QObject(), m_desktopMode( desktopMode ), m_noSound( noSound ),
openVrInit()
{
// Loading the OpenVR Runtime
auto initError = vr::VRInitError_None;
vr::VR_Init( &initError, vr::VRApplication_Overlay );
if ( initError != vr::VRInitError_None )
{
if ( initError == vr::VRInitError_Init_HmdNotFound
|| initError == vr::VRInitError_Init_HmdNotFoundPresenceFailed )
{
QMessageBox::critical( nullptr,
"OpenVR Advanced Settings Overlay",
"Could not find HMD!" );
}
throw std::runtime_error(
std::string( "Failed to initialize OpenVR: " )
+ std::string(
vr::VR_GetVRInitErrorAsEnglishDescription( initError ) ) );
}
// Despite arguably being OpenVR init code, the call is still here because
// the TabController uses this directly. Offering it through OpenVR_Init
// might be an option, but it might scope creep OpenVR_Init which currently
// doesn't contain any member variables.
m_runtimePathUrl = QUrl::fromLocalFile( vr::VR_RuntimePath() );
LOG( INFO ) << "VR Runtime Path: " << m_runtimePathUrl.toLocalFile();
@@ -101,96 +88,6 @@ OverlayController::OverlayController( bool desktopMode,
<< alarm01SoundFile;
}
// Check whether OpenVR is too outdated
if ( !vr::VR_IsInterfaceVersionValid( vr::IVRSystem_Version ) )
{
QMessageBox::critical(
nullptr,
"OpenVR Advanced Settings Overlay",
"OpenVR version is too outdated. Please update OpenVR." );
throw std::runtime_error(
std::string( "OpenVR version is too outdated: Interface version " )
+ std::string( vr::IVRSystem_Version )
+ std::string( " not found." ) );
}
else if ( !vr::VR_IsInterfaceVersionValid( vr::IVRSettings_Version ) )
{
QMessageBox::critical(
nullptr,
"OpenVR Advanced Settings Overlay",
"OpenVR version is too outdated. Please update OpenVR." );
throw std::runtime_error(
std::string( "OpenVR version is too outdated: Interface version " )
+ std::string( vr::IVRSettings_Version )
+ std::string( " not found." ) );
}
else if ( !vr::VR_IsInterfaceVersionValid( vr::IVROverlay_Version ) )
{
QMessageBox::critical(
nullptr,
"OpenVR Advanced Settings Overlay",
"OpenVR version is too outdated. Please update OpenVR." );
throw std::runtime_error(
std::string( "OpenVR version is too outdated: Interface version " )
+ std::string( vr::IVROverlay_Version )
+ std::string( " not found." ) );
}
else if ( !vr::VR_IsInterfaceVersionValid( vr::IVRApplications_Version ) )
{
QMessageBox::critical(
nullptr,
"OpenVR Advanced Settings Overlay",
"OpenVR version is too outdated. Please update OpenVR." );
throw std::runtime_error(
std::string( "OpenVR version is too outdated: Interface version " )
+ std::string( vr::IVRApplications_Version )
+ std::string( " not found." ) );
}
else if ( !vr::VR_IsInterfaceVersionValid( vr::IVRChaperone_Version ) )
{
QMessageBox::critical(
nullptr,
"OpenVR Advanced Settings Overlay",
"OpenVR version is too outdated. Please update OpenVR." );
throw std::runtime_error(
std::string( "OpenVR version is too outdated: Interface version " )
+ std::string( vr::IVRChaperone_Version )
+ std::string( " not found." ) );
}
else if ( !vr::VR_IsInterfaceVersionValid( vr::IVRChaperoneSetup_Version ) )
{
QMessageBox::critical(
nullptr,
"OpenVR Advanced Settings Overlay",
"OpenVR version is too outdated. Please update OpenVR." );
throw std::runtime_error(
std::string( "OpenVR version is too outdated: Interface version " )
+ std::string( vr::IVRChaperoneSetup_Version )
+ std::string( " not found." ) );
}
else if ( !vr::VR_IsInterfaceVersionValid( vr::IVRCompositor_Version ) )
{
QMessageBox::critical(
nullptr,
"OpenVR Advanced Settings Overlay",
"OpenVR version is too outdated. Please update OpenVR." );
throw std::runtime_error(
std::string( "OpenVR version is too outdated: Interface version " )
+ std::string( vr::IVRCompositor_Version )
+ std::string( " not found." ) );
}
else if ( !vr::VR_IsInterfaceVersionValid( vr::IVRNotifications_Version ) )
{
QMessageBox::critical(
nullptr,
"OpenVR Advanced Settings Overlay",
"OpenVR version is too outdated. Please update OpenVR." );
throw std::runtime_error(
std::string( "OpenVR version is too outdated: Interface version " )
+ std::string( vr::IVRNotifications_Version )
+ std::string( " not found." ) );
}
QSurfaceFormat format;
// Qt's QOpenGLPaintDevice is not compatible with OpenGL versions >= 3.0
// NVIDIA does not care, but unfortunately AMD does