From 6568c0563de1c8b95f47be2b1a5dc0a7bdf7cc67 Mon Sep 17 00:00:00 2001 From: howard-stearns Date: Fri, 20 May 2016 16:43:55 -0700 Subject: [PATCH] Delay on entry/exit. --- interface/src/ui/OverlayConductor.cpp | 26 +++++++++++++++++++------- interface/src/ui/OverlayConductor.h | 1 + 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/interface/src/ui/OverlayConductor.cpp b/interface/src/ui/OverlayConductor.cpp index 1ceceb741e..e9dc766e73 100644 --- a/interface/src/ui/OverlayConductor.cpp +++ b/interface/src/ui/OverlayConductor.cpp @@ -69,27 +69,39 @@ void OverlayConductor::update(float dt) { void OverlayConductor::updateMode() { MyAvatar* myAvatar = DependencyManager::get()->getMyAvatar(); float speed = glm::length(myAvatar->getVelocity()); - bool nowDriving = _driving; const float MIN_DRIVING = 0.2f; const float MAX_NOT_DRIVING = 0.01f; - if (speed > MIN_DRIVING) { + const quint64 REQUIRED_USECS_IN_NEW_MODE_BEFORE_INVISIBLE = 200 * 1000; + const quint64 REQUIRED_USECS_IN_NEW_MODE_BEFORE_VISIBLE = 1000 * 1000; + int fixmeDiff; + bool nowDriving = _driving; // Assume current _driving mode unless... + if (speed > MIN_DRIVING) { // ... we're definitely moving... nowDriving = true; - } - else if (speed < MAX_NOT_DRIVING) { + } else if (speed < MAX_NOT_DRIVING) { // ... or definitely not. nowDriving = false; } + // Check that we're in this new mode for long enough to really trigger a transition. + if (nowDriving == _driving) { // If there's no change in state, clear any attepted timer. + _timeInPotentialMode = 0; + } else if (_timeInPotentialMode == 0) { // We've just changed with no timer, so start timing now. + _timeInPotentialMode = usecTimestampNow(); + nowDriving = _driving; + } else if ((fixmeDiff = (usecTimestampNow() - _timeInPotentialMode)) < (nowDriving ? REQUIRED_USECS_IN_NEW_MODE_BEFORE_INVISIBLE : REQUIRED_USECS_IN_NEW_MODE_BEFORE_VISIBLE)) { + nowDriving = _driving; // Haven't accumulated enough time in new mode, but keep timing. + } else { // a real transition + _timeInPotentialMode = 0; + } + // If we're really in a transition if (nowDriving != _driving) { if (nowDriving) { _wantsOverlays = Menu::getInstance()->isOptionChecked(MenuOption::Overlays); - } - else { // reset when coming out of driving + } else { // reset when coming out of driving _mode = FLAT; // Seems appropriate to let things reset, below, after the following. // All reset of, e.g., room-scale location as though by apostrophe key, without all the other adjustments. qApp->getActiveDisplayPlugin()->resetSensors(); myAvatar->reset(true, false); } if (_wantsOverlays) { - qDebug() << "flipping" << !nowDriving; setEnabled(!nowDriving, false); } _driving = nowDriving; diff --git a/interface/src/ui/OverlayConductor.h b/interface/src/ui/OverlayConductor.h index 02b2035b07..99f4b56584 100644 --- a/interface/src/ui/OverlayConductor.h +++ b/interface/src/ui/OverlayConductor.h @@ -32,6 +32,7 @@ private: Mode _mode { FLAT }; bool _enabled { false }; bool _driving { false }; + quint64 _timeInPotentialMode { 0 }; bool _wantsOverlays { true }; };