From 6d1953070a0807d56e6a20474c605cb3b28dc8e3 Mon Sep 17 00:00:00 2001 From: Chelsea Jaggi Date: Tue, 11 Aug 2020 18:03:35 -0700 Subject: [PATCH] Add an optional pop-up notification when auto-turn is toggled (#496) * Implement (most of) pop-up notification when autoturn is enabled * Add neato fading: doesn't appear to impact performance * formatting * added macro and UI for notification of auto-turn * changed notification default to true for auto-turn * added common issue for trackers * added warning for custom keys * minor documentation markdown format fixes * fix qml syntax error in atgb * gasd Co-authored-by: ykeara --- Readme.md | 12 +- docs/keyboard_input_guide.md | 6 +- src/res/img/rotation/autoturn.png | Bin 0 -> 4270 bytes src/res/img/rotation/noautoturn.png | Bin 0 -> 13064 bytes src/res/img/rotation/noautoturn.svg | 120 ++++++++++++++++++ .../redirected/AutoTurnGroupBox.qml | 43 +++++-- src/settings/internal/settings_controller.h | 4 + src/settings/settings.h | 3 +- src/tabcontrollers/AudioTabController.cpp | 16 +-- src/tabcontrollers/RotationTabController.cpp | 116 +++++++++++++++++ src/tabcontrollers/RotationTabController.h | 23 ++++ src/utils/paths.cpp | 11 ++ src/utils/paths.h | 2 + 13 files changed, 324 insertions(+), 32 deletions(-) create mode 100644 src/res/img/rotation/autoturn.png create mode 100644 src/res/img/rotation/noautoturn.png create mode 100644 src/res/img/rotation/noautoturn.svg diff --git a/Readme.md b/Readme.md index 2f89888..3f61fa9 100644 --- a/Readme.md +++ b/Readme.md @@ -125,7 +125,7 @@ Detailed instructions are available [here](docs/building_for_linux.md). ### Overall Feature Overview Guides -- [Kung's 3.0 New Feature Guide (video/youtube)[https://youtu.be/2ZHdjOfnqOU)] +- [Kung's 3.0 New Feature Guide (video/youtube)[https://youtu.be/2ZHdjOfnqOU] ### SteamVR Input System (keybinds for app) @@ -472,7 +472,7 @@ Allows users to temporarily move and rotate the center of the playspace. This al - **Brightness**: Same as regular. - **Opacity**: Adjusts opacity of color overlay. - **Toggle On/Off**: Turns on/off Color Adjustment Overlay. -- ****: Adjusts the overlay to adjust the color. +- **Color (Red/Green/Blue)**: Adjusts the overlay to adjust the color. ## - Utilities Page @@ -546,6 +546,14 @@ Full build instructions can be found [here](docs/building_for_linux.md). - **Cause:** WMR boundary off, or set up for standing only. - **Solution:** Please set-up WMR for all experiences, and then if you don't want WMR boundary you can toggle off the boundary **after** SteamVR/OpenVR has been started. +- **Issue:** While using Trackers (additional devices besides controllers) Keybinds don't work. + - **Cause:** Trackers can Assume controller roles, and prevent your controllers from working properly. + - **Solution:** Assign Tracker Roles Via SteamVR Widget to anything besides `held-in-hand` + +- **Issue:** Custom Key Presses Not Saving In file. + - **Cause:** Key Presses Modified while Advanced Settings is running. + - **Solution:** Only modify the settings file while VR/Advanced Settings is **not** running. + # License This software is released under GPL 3.0, and other third-party Licenses diff --git a/docs/keyboard_input_guide.md b/docs/keyboard_input_guide.md index 1706e37..105f09b 100644 --- a/docs/keyboard_input_guide.md +++ b/docs/keyboard_input_guide.md @@ -118,6 +118,10 @@ ### Case Sensative - basic characters are all LOWER case, while keys such as ENTER are all UPPER case. +### Custom Keys Not Saving. +- We only load keybinds from file on start-up, and save based on what is in memory (not in file) + - **ONLY** edit the settings file while Advanced Settings is **not** running. + ### Focus Issues - we deliver the keypress to the OS, depending on your set-up and program you may have to have the window "in-focus" @@ -126,4 +130,4 @@ - alt + tab, alt + F4 = `*TAB *F4` ## Parser Spec -(Parser Spec)[https://github.com/OpenVR-Advanced-Settings/OpenVR-AdvancedSettings/blob/master/docs/specs/Keyboard_Manager-Parser_Spec.md] +[Parser Spec](https://github.com/OpenVR-Advanced-Settings/OpenVR-AdvancedSettings/blob/master/docs/specs/Keyboard_Manager-Parser_Spec.md) diff --git a/src/res/img/rotation/autoturn.png b/src/res/img/rotation/autoturn.png new file mode 100644 index 0000000000000000000000000000000000000000..37bd8839a7066701ba807095e175041cf096085e GIT binary patch literal 4270 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 literal 0 HcmV?d00001 diff --git a/src/res/img/rotation/noautoturn.png b/src/res/img/rotation/noautoturn.png new file mode 100644 index 0000000000000000000000000000000000000000..b3a14ef817e88fad7365b23c53c2a7f7ff310949 GIT binary patch literal 13064 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

+ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + A + + + diff --git a/src/res/qml/rotation_page/redirected/AutoTurnGroupBox.qml b/src/res/qml/rotation_page/redirected/AutoTurnGroupBox.qml index 3c0a3e4..81ef06e 100644 --- a/src/res/qml/rotation_page/redirected/AutoTurnGroupBox.qml +++ b/src/res/qml/rotation_page/redirected/AutoTurnGroupBox.qml @@ -35,10 +35,18 @@ GroupBox { MyToggleButton { id: autoTurn text: "Toggle On/Off" - Layout.preferredWidth: 300 + Layout.preferredWidth: 250 onCheckedChanged: { RotationTabController.setAutoTurnEnabled(this.checked, true); } } + MyToggleButton { + id: autoTurnNotificationToggle + text: "HMD Icon" + Layout.preferredWidth: 175 + onCheckedChanged: { + RotationTabController.setAutoTurnShowNotification(this.checked, true) + } + } MyText { text: "Activation Dist:" @@ -160,7 +168,7 @@ GroupBox { } MyText { - text: "Turn Speed (deg/sec):" + text: "Turn Speed(deg/sec):" horizontalAlignment: Text.AlignRight Layout.rightMargin: 10 } @@ -174,7 +182,7 @@ GroupBox { Layout.fillWidth: true onPositionChanged: { var val = this.value - speedValueText.text = val.toFixed() + speedValueText.text = val.toFixed()+ "°" } onValueChanged: { @@ -184,7 +192,7 @@ GroupBox { MyTextField { id: speedValueText - text: "90" + text: "90°" keyBoardUID: 1003 Layout.preferredWidth: 100 Layout.leftMargin: 10 @@ -203,29 +211,30 @@ GroupBox { speedSlider.value = val; } //converts the centidegrees to degrees - text = (((RotationTabController.autoTurnSpeed)/100).toFixed()); + text = (((RotationTabController.autoTurnSpeed)/100).toFixed()) + "°"; } } } RowLayout{ + MyText{ text: "Detangle Angle: " horizontalAlignment: Text.AlignLeft - Layout.preferredWidth: 250 + Layout.preferredWidth: 200 Layout.rightMargin: 5 } MyText{ - text:"Min Rotations(deg):" + text:"Min Rotations:" Layout.rightMargin: 5 } MyTextField { id: detangleAngleStartText - text: "360" + text: "360°" keyBoardUID: 1005 Layout.preferredWidth: 100 Layout.leftMargin: 5 @@ -239,6 +248,7 @@ GroupBox { val = 3600 } RotationTabController.setMinCordTangle((val*(Math.PI/180)), true); + text = (Math.round(val).toFixed())+ "°"; } } } @@ -247,7 +257,7 @@ GroupBox { } MyText{ - text: "Max Wall Angle(deg): " + text: "Max Wall Angle: " horizontalAlignment: Text.AlignRight Layout.rightMargin: 10 Layout.fillWidth: true @@ -255,7 +265,7 @@ GroupBox { } MyTextField { id: detangleAngleAssistText - text: "10" + text: "10°" keyBoardUID: 1006 Layout.preferredWidth: 100 Layout.leftMargin: 10 @@ -269,6 +279,7 @@ GroupBox { val = 3600 } RotationTabController.setCordDetangleAngle((val*(Math.PI/180)), true); + text = (Math.round(val).toFixed())+ "°"; } } } @@ -285,6 +296,7 @@ GroupBox { deactivationSlider.value = RotationTabController.autoTurnDeactivationDistance.toFixed(2) cornerAngle.checked = RotationTabController.autoTurnUseCornerAngle speedSlider.value = (RotationTabController.autoTurnSpeed/100).toFixed() + autoTurnNotificationToggle.checked = RotationTabController.autoTurnShowNotification if(RotationTabController.autoTurnMode === 1){ autoTurnModeToggle.checked = true; @@ -293,8 +305,8 @@ GroupBox { autoTurnModeToggle.checked = false; } - detangleAngleStartText.text = parseInt(RotationTabController.minCordTangle*(180/Math.PI)) - detangleAngleAssistText.text = parseInt(RotationTabController.cordDetangleAngle*(180/Math.PI)) + detangleAngleStartText.text = parseInt(RotationTabController.minCordTangle*(180/Math.PI))+ "°" + detangleAngleAssistText.text = parseInt(RotationTabController.cordDetangleAngle*(180/Math.PI))+ "°" } Connections { @@ -327,10 +339,13 @@ GroupBox { } } onMinCordTangleChanged:{ - detangleAngleStartText.text = parseInt(RotationTabController.minCordTangle*(180/Math.PI)) + detangleAngleStartText.text = parseInt(RotationTabController.minCordTangle*(180/Math.PI))+ "°" } onCordDetangleAngleChanged:{ - detangleAngleAssistText.text = parseInt(RotationTabController.cordDetangleAngle*(180/Math.PI)) + detangleAngleAssistText.text = parseInt(RotationTabController.cordDetangleAngle*(180/Math.PI))+ "°" + } + onAutoTurnShowNotificationChanged:{ + autoTurnNotificationToggle.checked = RotationTabController.autoTurnShowNotification } } } diff --git a/src/settings/internal/settings_controller.h b/src/settings/internal/settings_controller.h index 73ce32a..5d2a0c7 100644 --- a/src/settings/internal/settings_controller.h +++ b/src/settings/internal/settings_controller.h @@ -393,6 +393,10 @@ private: SettingCategory::Rotation, QtInfo{ "autoturnVestibularMotionEnabled" }, false }, + BoolSettingValue{ BoolSetting::ROTATION_autoturnShowNotification, + SettingCategory::Rotation, + QtInfo{ "autoturnShowNotification" }, + true } }; constexpr static auto doubleSettingSize diff --git a/src/settings/settings.h b/src/settings/settings.h index 38df851..b61f6c2 100644 --- a/src/settings/settings.h +++ b/src/settings/settings.h @@ -55,8 +55,9 @@ enum class BoolSetting ROTATION_autoturnEnabled, ROTATION_autoturnUseCornerAngle, ROTATION_autoturnVestibularMotionEnabled, + ROTATION_autoturnShowNotification, // LAST_ENUMERATOR must always be set to the last value - LAST_ENUMERATOR = ROTATION_autoturnVestibularMotionEnabled, + LAST_ENUMERATOR = ROTATION_autoturnShowNotification, }; enum class DoubleSetting diff --git a/src/tabcontrollers/AudioTabController.cpp b/src/tabcontrollers/AudioTabController.cpp index f979379..2344b86 100644 --- a/src/tabcontrollers/AudioTabController.cpp +++ b/src/tabcontrollers/AudioTabController.cpp @@ -63,18 +63,6 @@ void AudioTabController::initStage1() eventLoopTick(); } -std::optional verifyIconFilePath( std::string filename ) -{ - const auto notifIconPath = paths::binaryDirectoryFindFile( filename ); - if ( !notifIconPath.has_value() ) - { - LOG( ERROR ) << "Could not find push to talk icon \"" << filename - << "\""; - } - - return notifIconPath; -} - void AudioTabController::initStage2() { const auto pushToTalkOverlayKey @@ -102,9 +90,9 @@ void AudioTabController::initStage2() = "/res/img/audio/microphone/ptm_notification.png"; const auto pushToTalkIconFilePath - = verifyIconFilePath( pushToTalkIconFilepath ); + = paths::verifyIconFilePath( pushToTalkIconFilepath ); const auto pushToMuteIconFilePath - = verifyIconFilePath( pushToMuteIconFilepath ); + = paths::verifyIconFilePath( pushToMuteIconFilepath ); if ( !pushToTalkIconFilePath.has_value() || !pushToMuteIconFilePath.has_value() ) diff --git a/src/tabcontrollers/RotationTabController.cpp b/src/tabcontrollers/RotationTabController.cpp index 097a1a4..a810f50 100644 --- a/src/tabcontrollers/RotationTabController.cpp +++ b/src/tabcontrollers/RotationTabController.cpp @@ -17,6 +17,60 @@ void RotationTabController::initStage1() void RotationTabController::initStage2( OverlayController* var_parent ) { + const auto autoturnOverlayKey + = std::string( application_strings::applicationKey ) + + ".autoturnnotification"; + + const auto overlayError + = vr::VROverlay()->CreateOverlay( autoturnOverlayKey.c_str(), + autoturnOverlayKey.c_str(), + &m_autoturnValues.overlayHandle ); + if ( overlayError != vr::VROverlayError_None ) + { + LOG( ERROR ) << "Could not create autoturn notification overlay: " + << vr::VROverlay()->GetOverlayErrorNameFromEnum( + overlayError ); + + emit defaultProfileDisplay(); + + return; + } + + constexpr auto autoturnIconFilepath = "/res/img/rotation/autoturn.png"; + constexpr auto noautoturnIconFilepath = "/res/img/rotation/noautoturn.png"; + + const auto autoturnIconFilePath + = paths::verifyIconFilePath( autoturnIconFilepath ); + const auto noautoturnIconFilePath + = paths::verifyIconFilePath( noautoturnIconFilepath ); + + if ( !autoturnIconFilePath.has_value() + || !noautoturnIconFilePath.has_value() ) + { + emit defaultProfileDisplay(); + return; + } + + m_autoturnValues.autoturnPath = *autoturnIconFilePath; + m_autoturnValues.noautoturnPath = *noautoturnIconFilePath; + + auto pushToPath = m_autoturnValues.autoturnPath.c_str(); + + vr::VROverlay()->SetOverlayFromFile( m_autoturnValues.overlayHandle, + pushToPath ); + vr::VROverlay()->SetOverlayWidthInMeters( m_autoturnValues.overlayHandle, + 0.02f ); + vr::HmdMatrix34_t notificationTransform + = { { { 1.0f, 0.0f, 0.0f, 0.12f }, + { 0.0f, 1.0f, 0.0f, 0.08f }, + { 0.0f, 0.0f, 1.0f, -0.3f } } }; + vr::VROverlay()->SetOverlayTransformTrackedDeviceRelative( + m_autoturnValues.overlayHandle, + vr::k_unTrackedDeviceIndex_Hmd, + ¬ificationTransform ); + + emit defaultProfileDisplay(); + this->parent = var_parent; } @@ -65,6 +119,29 @@ void RotationTabController::eventLoopTick( m_autoTurnChaperoneDistancesLast = std::move( chaperoneDistances ); } } + if ( m_autoTurnNotificationTimestamp ) + { + auto count = std::chrono::duration_cast( + std::chrono::steady_clock::now() + - *m_autoTurnNotificationTimestamp ) + .count(); + if ( count > 1500 ) + { + m_autoTurnNotificationTimestamp.reset(); + if ( getNotificationOverlayHandle() + != vr::k_ulOverlayHandleInvalid ) + { + vr::VROverlay()->HideOverlay( getNotificationOverlayHandle() ); + } + } + else + { + float pct + = std::min( 1.0f, 3.0f - static_cast( count ) / 500.0f ); + vr::VROverlay()->SetOverlayAlpha( getNotificationOverlayHandle(), + pct ); + } + } } void RotationTabController::doVestibularMotion( @@ -453,6 +530,12 @@ bool RotationTabController::autoTurnUseCornerAngle() const settings::BoolSetting::ROTATION_autoturnUseCornerAngle ); } +bool RotationTabController::autoTurnShowNotification() const +{ + return settings::getSetting( + settings::BoolSetting::ROTATION_autoturnShowNotification ); +} + double RotationTabController::cordDetangleAngle() const { return settings::getSetting( @@ -505,6 +588,39 @@ void RotationTabController::setAutoTurnEnabled( bool value, bool notify ) { emit autoTurnEnabledChanged( value ); } + + if ( !value ) + { + vr::VROverlay()->SetOverlayFromFile( + m_autoturnValues.overlayHandle, + m_autoturnValues.noautoturnPath.c_str() ); + } + else + { + vr::VROverlay()->SetOverlayFromFile( + m_autoturnValues.overlayHandle, + m_autoturnValues.autoturnPath.c_str() ); + } + + if ( autoTurnShowNotification() + && getNotificationOverlayHandle() != vr::k_ulOverlayHandleInvalid ) + { + vr::VROverlay()->SetOverlayAlpha( getNotificationOverlayHandle(), + 1.0f ); + vr::VROverlay()->ShowOverlay( getNotificationOverlayHandle() ); + m_autoTurnNotificationTimestamp.emplace( + std::chrono::steady_clock::now() ); + } +} +void RotationTabController::setAutoTurnShowNotification( bool value, + bool notify ) +{ + settings::setSetting( + settings::BoolSetting::ROTATION_autoturnShowNotification, value ); + if ( notify ) + { + emit autoTurnShowNotificationChanged( value ); + } } void RotationTabController::setAutoTurnActivationDistance( float value, bool notify ) diff --git a/src/tabcontrollers/RotationTabController.h b/src/tabcontrollers/RotationTabController.h index df6199a..ad6fa80 100644 --- a/src/tabcontrollers/RotationTabController.h +++ b/src/tabcontrollers/RotationTabController.h @@ -6,6 +6,7 @@ #include #include #include +#include #include "../utils/FrameRateUtils.h" #include "../utils/ChaperoneUtils.h" #include "../settings/settings_object.h" @@ -82,10 +83,25 @@ class RotationTabController : public QObject Q_PROPERTY( double vestibularMotionRadius READ vestibularMotionRadius WRITE setVestibularMotionRadius NOTIFY vestibularMotionRadiusChanged ) + Q_PROPERTY( + bool autoTurnShowNotification READ autoTurnShowNotification WRITE + setAutoTurnShowNotification NOTIFY autoTurnShowNotificationChanged ) private: OverlayController* parent; + struct + { + vr::VROverlayHandle_t overlayHandle = vr::k_ulOverlayHandleInvalid; + std::string autoturnPath; + std::string noautoturnPath; + } m_autoturnValues; + + virtual vr::VROverlayHandle_t getNotificationOverlayHandle() + { + return m_autoturnValues.overlayHandle; + } + // Variables int m_autoTurnLinearSmoothTurnRemaining = 0; std::chrono::steady_clock::time_point m_autoTurnLastUpdate; @@ -95,6 +111,9 @@ private: double m_autoTurnRoundingError = 0.0; std::chrono::steady_clock::time_point::duration m_estimatedFrameRate; + std::optional + m_autoTurnNotificationTimestamp; + bool m_isHMDActive = false; void doAutoTurn( @@ -116,6 +135,7 @@ public: float autoTurnActivationDistance() const; float autoTurnDeactivationDistance() const; bool autoTurnUseCornerAngle() const; + bool autoTurnShowNotification() const; double cordDetangleAngle() const; double minCordTangle() const; int autoTurnSpeed() const; @@ -126,6 +146,7 @@ public: public slots: void setAutoTurnEnabled( bool value, bool notify = true ); + void setAutoTurnShowNotification( bool value, bool notify = true ); void setAutoTurnActivationDistance( float value, bool notify = true ); void setAutoTurnDeactivationDistance( float value, bool notify = true ); void setAutoTurnUseCornerAngle( bool value, bool notify = true ); @@ -138,7 +159,9 @@ public slots: signals: + void defaultProfileDisplay(); void autoTurnEnabledChanged( bool value ); + void autoTurnShowNotificationChanged( bool value ); void autoTurnActivationDistanceChanged( float value ); void autoTurnDeactivationDistanceChanged( float value ); void autoTurnUseCornerAngleChanged( bool value ); diff --git a/src/utils/paths.cpp b/src/utils/paths.cpp index d6761d0..9b07c26 100644 --- a/src/utils/paths.cpp +++ b/src/utils/paths.cpp @@ -57,4 +57,15 @@ optional settingsDirectory() return path.toStdString(); } +std::optional verifyIconFilePath( std::string filename ) +{ + const auto notifIconPath = paths::binaryDirectoryFindFile( filename ); + if ( !notifIconPath.has_value() ) + { + LOG( ERROR ) << "Could not find icon \"" << filename << "\""; + } + + return notifIconPath; +} + } // namespace paths diff --git a/src/utils/paths.h b/src/utils/paths.h index 819a67f..63e71c9 100644 --- a/src/utils/paths.h +++ b/src/utils/paths.h @@ -12,4 +12,6 @@ optional binaryDirectoryFindFile( string fileName ); optional settingsDirectory(); +std::optional verifyIconFilePath( std::string filename ); + } // namespace paths