From ff3061123479dc91ca0ac9ed09259cfba500f3af Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Thu, 10 Mar 2016 16:07:49 -0800 Subject: [PATCH] first cut at getting overlays to toggle again --- .../src/display-plugins/CompositorHelper.cpp | 38 ++++++++++++++++++- .../src/display-plugins/CompositorHelper.h | 5 +++ .../display-plugins/OpenGLDisplayPlugin.cpp | 28 ++++++++++++++ .../src/display-plugins/OpenGLDisplayPlugin.h | 1 + .../display-plugins/hmd/HmdDisplayPlugin.cpp | 31 ++++++++++++++- libraries/gl/src/gl/OglplusHelpers.cpp | 3 +- 6 files changed, 102 insertions(+), 4 deletions(-) diff --git a/libraries/display-plugins/src/display-plugins/CompositorHelper.cpp b/libraries/display-plugins/src/display-plugins/CompositorHelper.cpp index f6e9d8dbbc..c013cf07af 100644 --- a/libraries/display-plugins/src/display-plugins/CompositorHelper.cpp +++ b/libraries/display-plugins/src/display-plugins/CompositorHelper.cpp @@ -11,6 +11,7 @@ #include #include +#include #include #include #include @@ -414,13 +415,45 @@ void CompositorHelper::updateTooltips() { } static const float FADE_DURATION = 500.0f; +static const float FADE_IN_ALPHA = 1.0f; +static const float FADE_OUT_ALPHA = 0.0f; + +void CompositorHelper::startFadeFailsafe(float endValue) { + return; + + qDebug() << __FUNCTION__; + _fadeStarted = usecTimestampNow(); + _fadeFailsafeEndValue = endValue; + + const int SLIGHT_DELAY = 10; + QTimer::singleShot(FADE_DURATION + SLIGHT_DELAY, [this]{ + checkFadeFailsafe(); + }); +} + +void CompositorHelper::checkFadeFailsafe() { + return; + + qDebug() << __FUNCTION__; + auto elapsedInFade = usecTimestampNow() - _fadeStarted; + if (elapsedInFade > FADE_DURATION) { + setAlpha(_fadeFailsafeEndValue); + } +} + void CompositorHelper::fadeIn() { _fadeInAlpha = true; _alphaPropertyAnimation->setDuration(FADE_DURATION); _alphaPropertyAnimation->setStartValue(_alpha); - _alphaPropertyAnimation->setEndValue(1.0f); + _alphaPropertyAnimation->setEndValue(FADE_IN_ALPHA); _alphaPropertyAnimation->start(); + + // Sometimes, this "QPropertyAnimation" fails to complete the animation, and we end up with a partially faded + // state. So we will also have this fail-safe, where we record the timestamp of the fadeRequest, and the target + // value of the fade, and if after that time we still haven't faded all the way, we will kick it to the final + // fade value + startFadeFailsafe(FADE_IN_ALPHA); } void CompositorHelper::fadeOut() { @@ -428,8 +461,9 @@ void CompositorHelper::fadeOut() { _alphaPropertyAnimation->setDuration(FADE_DURATION); _alphaPropertyAnimation->setStartValue(_alpha); - _alphaPropertyAnimation->setEndValue(0.0f); + _alphaPropertyAnimation->setEndValue(FADE_OUT_ALPHA); _alphaPropertyAnimation->start(); + startFadeFailsafe(FADE_OUT_ALPHA); } void CompositorHelper::toggle() { diff --git a/libraries/display-plugins/src/display-plugins/CompositorHelper.h b/libraries/display-plugins/src/display-plugins/CompositorHelper.h index 55364be85b..44c769c965 100644 --- a/libraries/display-plugins/src/display-plugins/CompositorHelper.h +++ b/libraries/display-plugins/src/display-plugins/CompositorHelper.h @@ -145,6 +145,11 @@ private: float _fadeInAlpha { true }; float _oculusUIRadius { 1.0f }; + quint64 _fadeStarted { 0.0f }; + float _fadeFailsafeEndValue { 1.0f }; + void checkFadeFailsafe(); + void startFadeFailsafe(float endValue); + int _reticleQuad; int _previousBorderWidth { -1 }; diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp index 7af97678a7..4ef2648e10 100644 --- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp @@ -296,6 +296,9 @@ void OpenGLDisplayPlugin::customizeContext() { if (uniform.Name() == "mvp") { _mvpUniform = uniform.Index(); } + if (uniform.Name() == "alpha") { + _alphaUniform = uniform.Index(); + } uniforms.Next(); } @@ -406,6 +409,20 @@ void OpenGLDisplayPlugin::updateFramerate() { void OpenGLDisplayPlugin::compositeOverlay() { using namespace oglplus; + + + // set the alpha + auto compositorHelper = DependencyManager::get(); + auto overlayAlpha = compositorHelper->getAlpha(); + + qDebug() << __FUNCTION__ << "overlayAlpha:" << overlayAlpha; + + if (overlayAlpha <= 0.0f) { + //return; // don't render the overlay at all. + qDebug() << "would bail early..."; + } + Uniform(*_program, _alphaUniform).Set(overlayAlpha); + // Overlay draw if (isStereo()) { Uniform(*_program, _mvpUniform).Set(mat4()); @@ -423,6 +440,17 @@ void OpenGLDisplayPlugin::compositeOverlay() { void OpenGLDisplayPlugin::compositePointer() { using namespace oglplus; auto compositorHelper = DependencyManager::get(); + + // set the alpha + auto overlayAlpha = compositorHelper->getAlpha(); + if (overlayAlpha <= 0.0f) { + //return; // don't render the overlay at all. + qDebug() << "would bail early..."; + } + qDebug() << __FUNCTION__ << "overlayAlpha:" << overlayAlpha; + Uniform(*_program, _alphaUniform).Set(overlayAlpha); + + Uniform(*_program, _mvpUniform).Set(compositorHelper->getReticleTransform(glm::mat4())); if (isStereo()) { for_each_eye([&](Eye eye) { diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h index 576d6d8eff..ace866a946 100644 --- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h @@ -86,6 +86,7 @@ protected: ProgramPtr _program; int32_t _mvpUniform { -1 }; + int32_t _alphaUniform { -1 }; ShapeWrapperPtr _plane; mutable Mutex _mutex; diff --git a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp index 92bfef0dc8..8427141e24 100644 --- a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp @@ -62,6 +62,20 @@ void HmdDisplayPlugin::uncustomizeContext() { void HmdDisplayPlugin::compositeOverlay() { using namespace oglplus; + + // set the alpha + auto compositorHelper = DependencyManager::get(); + auto overlayAlpha = compositorHelper->getAlpha(); + + qDebug() << __FUNCTION__ << "overlayAlpha:" << overlayAlpha; + + if (overlayAlpha <= 0.0f) { + //return; // don't render the overlay at all. + qDebug() << "would bail early..."; + } + Uniform(*_program, _alphaUniform).Set(overlayAlpha); + + _sphereSection->Use(); for_each_eye([&](Eye eye) { eyeViewport(eye); @@ -73,13 +87,28 @@ void HmdDisplayPlugin::compositeOverlay() { } void HmdDisplayPlugin::compositePointer() { + using namespace oglplus; + //Mouse Pointer + auto compositorHelper = DependencyManager::get(); + // set the alpha + auto overlayAlpha = compositorHelper->getAlpha(); + + qDebug() << __FUNCTION__ << "overlayAlpha:" << overlayAlpha; + + if (overlayAlpha <= 0.0f) { + //return; // don't render the overlay at all. + qDebug() << "would bail early..."; + } + qDebug() << __FUNCTION__ << "overlayAlpha:" << overlayAlpha; + Uniform(*_program, _alphaUniform).Set(1.0f); + + _plane->Use(); // Reconstruct the headpose from the eye poses auto headPosition = (vec3(_currentRenderEyePoses[Left][3]) + vec3(_currentRenderEyePoses[Right][3])) / 2.0f; for_each_eye([&](Eye eye) { - using namespace oglplus; eyeViewport(eye); auto reticleTransform = compositorHelper->getReticleTransform(_currentRenderEyePoses[eye], headPosition); auto mvp = _eyeProjections[eye] * reticleTransform; diff --git a/libraries/gl/src/gl/OglplusHelpers.cpp b/libraries/gl/src/gl/OglplusHelpers.cpp index a579f061b7..d583e6de6c 100644 --- a/libraries/gl/src/gl/OglplusHelpers.cpp +++ b/libraries/gl/src/gl/OglplusHelpers.cpp @@ -33,13 +33,14 @@ static const char * SIMPLE_TEXTURED_FS = R"FS(#version 410 core #pragma line __LINE__ uniform sampler2D sampler; +uniform float alpha = 1.0; in vec2 vTexCoord; out vec4 FragColor; void main() { - FragColor = texture(sampler, vTexCoord); + FragColor = texture(sampler, vTexCoord) * alpha; } )FS";