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:
@@ -0,0 +1,78 @@
|
||||
#include <string>
|
||||
#include <openvr.h>
|
||||
#include <QMessageBox>
|
||||
#include "openvr_init.h"
|
||||
|
||||
OpenVR_Init::OpenVR_Init()
|
||||
{
|
||||
// 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 ) ) );
|
||||
}
|
||||
|
||||
// The function call and error message was the same for all version checks.
|
||||
// Specific error messages are unlikely to be necessary since both the type
|
||||
// and version are in the string and will be output.
|
||||
auto reportVersionError = []( const char* const interfaceAndVersion ) {
|
||||
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( interfaceAndVersion )
|
||||
+ std::string( " not found." ) );
|
||||
};
|
||||
|
||||
// Check whether OpenVR is too outdated
|
||||
if ( !vr::VR_IsInterfaceVersionValid( vr::IVRSystem_Version ) )
|
||||
{
|
||||
reportVersionError( vr::IVRSystem_Version );
|
||||
}
|
||||
else if ( !vr::VR_IsInterfaceVersionValid( vr::IVRSettings_Version ) )
|
||||
{
|
||||
reportVersionError( vr::IVRSettings_Version );
|
||||
}
|
||||
else if ( !vr::VR_IsInterfaceVersionValid( vr::IVROverlay_Version ) )
|
||||
{
|
||||
reportVersionError( vr::IVROverlay_Version );
|
||||
}
|
||||
else if ( !vr::VR_IsInterfaceVersionValid( vr::IVRApplications_Version ) )
|
||||
{
|
||||
reportVersionError( vr::IVRApplications_Version );
|
||||
}
|
||||
else if ( !vr::VR_IsInterfaceVersionValid( vr::IVRChaperone_Version ) )
|
||||
{
|
||||
reportVersionError( vr::IVRChaperone_Version );
|
||||
}
|
||||
else if ( !vr::VR_IsInterfaceVersionValid( vr::IVRChaperoneSetup_Version ) )
|
||||
{
|
||||
reportVersionError( vr::IVRChaperoneSetup_Version );
|
||||
}
|
||||
else if ( !vr::VR_IsInterfaceVersionValid( vr::IVRCompositor_Version ) )
|
||||
{
|
||||
reportVersionError( vr::IVRCompositor_Version );
|
||||
}
|
||||
else if ( !vr::VR_IsInterfaceVersionValid( vr::IVRNotifications_Version ) )
|
||||
{
|
||||
reportVersionError( vr::IVRNotifications_Version );
|
||||
}
|
||||
}
|
||||
|
||||
OpenVR_Init::~OpenVR_Init()
|
||||
{
|
||||
vr::VR_Shutdown();
|
||||
}
|
||||
Reference in New Issue
Block a user