diff --git a/plugins/openvr/src/OpenVrDisplayPlugin.cpp b/plugins/openvr/src/OpenVrDisplayPlugin.cpp index 11ef222172..11d941dcd0 100644 --- a/plugins/openvr/src/OpenVrDisplayPlugin.cpp +++ b/plugins/openvr/src/OpenVrDisplayPlugin.cpp @@ -671,8 +671,6 @@ void OpenVrDisplayPlugin::postPreview() { PoseData nextRender, nextSim; nextRender.frameIndex = presentCount(); - _hmdActivityLevel = _system->GetTrackedDeviceActivityLevel(vr::k_unTrackedDeviceIndex_Hmd); - if (!_threadedSubmit) { vr::VRCompositor()->WaitGetPoses(nextRender.vrPoses, vr::k_unMaxTrackedDeviceCount, nextSim.vrPoses, vr::k_unMaxTrackedDeviceCount); @@ -692,7 +690,7 @@ void OpenVrDisplayPlugin::postPreview() { } bool OpenVrDisplayPlugin::isHmdMounted() const { - return _hmdActivityLevel == vr::k_EDeviceActivityLevel_UserInteraction; + return isHeadInHeadset(); } void OpenVrDisplayPlugin::updatePresentPose() { diff --git a/plugins/openvr/src/OpenVrDisplayPlugin.h b/plugins/openvr/src/OpenVrDisplayPlugin.h index 5585957031..265f328920 100644 --- a/plugins/openvr/src/OpenVrDisplayPlugin.h +++ b/plugins/openvr/src/OpenVrDisplayPlugin.h @@ -37,6 +37,7 @@ class OpenVrDisplayPlugin : public HmdDisplayPlugin { public: bool isSupported() const override; const QString getName() const override; + bool getSupportsAutoSwitch() override final { return true; } glm::mat4 getEyeProjection(Eye eye, const glm::mat4& baseProjection) const override; glm::mat4 getCullingProjection(const glm::mat4& baseProjection) const override; @@ -78,7 +79,6 @@ protected: private: vr::IVRSystem* _system { nullptr }; - std::atomic _hmdActivityLevel { vr::k_EDeviceActivityLevel_Unknown }; std::atomic _keyboardSupressionCount{ 0 }; vr::HmdMatrix34_t _lastGoodHMDPose; diff --git a/plugins/openvr/src/OpenVrHelpers.cpp b/plugins/openvr/src/OpenVrHelpers.cpp index 9a57413f95..108431a8ac 100644 --- a/plugins/openvr/src/OpenVrHelpers.cpp +++ b/plugins/openvr/src/OpenVrHelpers.cpp @@ -37,6 +37,11 @@ static int refCount { 0 }; static Mutex mutex; static vr::IVRSystem* activeHmd { nullptr }; static bool _openVrQuitRequested { false }; +static bool _headInHeadset { false }; + +bool isHeadInHeadset() { + return _headInHeadset; +} bool openVrQuitRequested() { return _openVrQuitRequested; @@ -272,6 +277,15 @@ void handleOpenVrEvents() { default: break; } + if (event.data.controller.button == vr::k_EButton_ProximitySensor) { + vr::VRControllerState_t controllerState = vr::VRControllerState_t(); + if (activeHmd->GetControllerState(vr::k_unTrackedDeviceIndex_Hmd, &controllerState, sizeof(vr::VRControllerState_t))) { + ulong promitySensorFlag = (1UL << ((int)vr::k_EButton_ProximitySensor)); + _headInHeadset = (controllerState.ulButtonPressed & promitySensorFlag) == promitySensorFlag; + } + + } + #if DEV_BUILD qDebug() << "OpenVR: Event " << activeHmd->GetEventTypeNameFromEnum((vr::EVREventType)event.eventType) << "(" << event.eventType << ")"; #endif diff --git a/plugins/openvr/src/OpenVrHelpers.h b/plugins/openvr/src/OpenVrHelpers.h index 833e5ba65d..b0960a03eb 100644 --- a/plugins/openvr/src/OpenVrHelpers.h +++ b/plugins/openvr/src/OpenVrHelpers.h @@ -23,6 +23,7 @@ vr::IVRSystem* acquireOpenVrSystem(); void releaseOpenVrSystem(); void handleOpenVrEvents(); bool openVrQuitRequested(); +bool isHeadInHeadset(); void enableOpenVrKeyboard(PluginContainer* container); void disableOpenVrKeyboard(); bool isOpenVrKeyboardShown();