diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h index 576d6d8eff..bde21ffc50 100644 --- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h @@ -29,24 +29,26 @@ protected: using TextureEscrow = GLEscrow; public: OpenGLDisplayPlugin(); - virtual void activate() override; - virtual void deactivate() override; - virtual void stop() override; - virtual bool eventFilter(QObject* receiver, QEvent* event) override; + void activate() override; + void deactivate() override; + void stop() override; + bool eventFilter(QObject* receiver, QEvent* event) override; + bool isDisplayVisible() const override { return true; } - virtual void submitSceneTexture(uint32_t frameIndex, const gpu::TexturePointer& sceneTexture) override; - virtual void submitOverlayTexture(const gpu::TexturePointer& overlayTexture) override; - virtual float presentRate() override; - virtual glm::uvec2 getRecommendedRenderSize() const override { + void submitSceneTexture(uint32_t frameIndex, const gpu::TexturePointer& sceneTexture) override; + void submitOverlayTexture(const gpu::TexturePointer& overlayTexture) override; + float presentRate() override; + + glm::uvec2 getRecommendedRenderSize() const override { return getSurfacePixels(); } - virtual glm::uvec2 getRecommendedUiSize() const override { + glm::uvec2 getRecommendedUiSize() const override { return getSurfaceSize(); } - virtual QImage getScreenshot() const override; + QImage getScreenshot() const override; protected: #if THREADED_PRESENT diff --git a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h index f16a474f74..74f4641bad 100644 --- a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h @@ -22,12 +22,16 @@ public: glm::uvec2 getRecommendedUiSize() const override final; glm::uvec2 getRecommendedRenderSize() const override final { return _renderTargetSize; } void setEyeRenderPose(uint32_t frameIndex, Eye eye, const glm::mat4& pose) override final; + bool isDisplayVisible() const override { return isHmdMounted(); } + void activate() override; void deactivate() override; protected: virtual void hmdPresent() = 0; + virtual bool isHmdMounted() const = 0; + void compositeOverlay() override; void compositePointer() override; void internalPresent() override; diff --git a/libraries/plugins/src/plugins/DisplayPlugin.h b/libraries/plugins/src/plugins/DisplayPlugin.h index c8fba1670d..e1e50b2b32 100644 --- a/libraries/plugins/src/plugins/DisplayPlugin.h +++ b/libraries/plugins/src/plugins/DisplayPlugin.h @@ -65,6 +65,12 @@ public: virtual bool isThrottled() const { return false; } virtual float getTargetFrameRate() { return 0.0f; } + /// Returns a boolean value indicating whether the display is currently visible + /// to the user. For monitor displays, false might indicate that a screensaver, + /// or power-save mode is active. For HMDs it may reflect a sensor indicating + /// whether the HMD is being worn + virtual bool isDisplayVisible() const { return false; } + // Rendering support // Stop requesting renders, but don't do full deactivation diff --git a/plugins/oculus/src/OculusDebugDisplayPlugin.h b/plugins/oculus/src/OculusDebugDisplayPlugin.h index a13315ab05..983511ba01 100644 --- a/plugins/oculus/src/OculusDebugDisplayPlugin.h +++ b/plugins/oculus/src/OculusDebugDisplayPlugin.h @@ -17,6 +17,7 @@ public: protected: void hmdPresent() override {} + bool isHmdMounted() const override { return true; } private: static const QString NAME; diff --git a/plugins/oculus/src/OculusDisplayPlugin.h b/plugins/oculus/src/OculusDisplayPlugin.h index fedb70abdb..1e93d9f823 100644 --- a/plugins/oculus/src/OculusDisplayPlugin.h +++ b/plugins/oculus/src/OculusDisplayPlugin.h @@ -24,6 +24,8 @@ public: protected: void hmdPresent() override; + // FIXME update with Oculus API call once it's available in the SDK + bool isHmdMounted() const override { return true; } void customizeContext() override; void uncustomizeContext() override; void updateFrameData() override; diff --git a/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.h b/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.h index 8708fb9204..4fe9ed081e 100644 --- a/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.h +++ b/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.h @@ -35,6 +35,7 @@ public: protected: virtual void customizeContext() override; void hmdPresent() override {} + bool isHmdMounted() const override { return true; } #if 0 virtual void uncustomizeContext() override; virtual void internalPresent() override; diff --git a/plugins/openvr/src/OpenVrDisplayPlugin.cpp b/plugins/openvr/src/OpenVrDisplayPlugin.cpp index e5708572f6..ae1fa1e19e 100644 --- a/plugins/openvr/src/OpenVrDisplayPlugin.cpp +++ b/plugins/openvr/src/OpenVrDisplayPlugin.cpp @@ -139,4 +139,10 @@ void OpenVrDisplayPlugin::hmdPresent() { vr::TrackedDevicePose_t currentTrackedDevicePose[vr::k_unMaxTrackedDeviceCount]; _compositor->WaitGetPoses(currentTrackedDevicePose, vr::k_unMaxTrackedDeviceCount, nullptr, 0); + _hmdActivityLevel = _system->GetTrackedDeviceActivityLevel(vr::k_unTrackedDeviceIndex_Hmd); } + +bool OpenVrDisplayPlugin::isHmdMounted() const { + return _hmdActivityLevel == vr::k_EDeviceActivityLevel_UserInteraction; +} + diff --git a/plugins/openvr/src/OpenVrDisplayPlugin.h b/plugins/openvr/src/OpenVrDisplayPlugin.h index 2114594b23..affc12a383 100644 --- a/plugins/openvr/src/OpenVrDisplayPlugin.h +++ b/plugins/openvr/src/OpenVrDisplayPlugin.h @@ -33,9 +33,11 @@ public: protected: void hmdPresent() override; + bool isHmdMounted() const override; private: vr::IVRSystem* _system { nullptr }; + std::atomic _hmdActivityLevel { vr::k_EDeviceActivityLevel_Unknown }; static const QString NAME; mutable Mutex _poseMutex; };