From dca1e18e0e73ddb30a88313869977b60ac37a2ee Mon Sep 17 00:00:00 2001 From: ykeara Date: Tue, 2 Jun 2020 12:10:21 -0500 Subject: [PATCH] CenterMarker Rotation Fix + Misc (#458) * add native chaperone option * refactored overlaywrapper error handling * added reset all settings * added reset all settings option * clarified driver bounds language * fixed naming schema of turn settings * fixed qml issue * marked errors in settings * fixed rotation of center marker and cleaned up * ci test * removed debugging code * fixed comment * fixed rotation.... made messy * fixed crash when centermarker new was on at launch * added settings to scroll view * fixed some initialization issues w/ center marker and some race conditions * updated Documentation to be more correct/concise about openGL rendering Information issue 457 * changed default behaviour of chaperone bounds to be un-checked to be consistant w/ other settings (default is unchecked) * cleaned up code around centermarker overlay * removed unused variables, changed scope of some existing * code naming cleanup * more rename * updated Version strings for 5.1.1 release * updated string to be more concise --- Readme.md | 6 +- build_scripts/compile_version_string.txt | 2 +- src/main.cpp | 6 + src/openvr/ovr_overlay_wrapper.cpp | 88 ++-- src/openvr/ovr_settings_wrapper.cpp | 11 + src/openvr/ovr_settings_wrapper.h | 2 + src/res/qml/SettingsPage.qml | 428 +++++++++--------- src/res/qml/chaperone_page/ChaperonePage.qml | 2 + .../chaperonemisc/ChaperoneMiscGroupBox.qml | 2 +- .../redirected/AutoTurnGroupBox.qml | 2 +- .../redirected/RedirectedGroupBox.qml | 2 +- .../space_turn/SpaceTurnGroupBox.qml | 2 +- src/settings/internal/settings_controller.h | 8 + src/tabcontrollers/ChaperoneTabController.cpp | 61 ++- src/tabcontrollers/ChaperoneTabController.h | 12 +- .../MoveCenterTabController.cpp | 53 ++- src/tabcontrollers/MoveCenterTabController.h | 4 + src/tabcontrollers/SettingsTabController.cpp | 33 ++ src/tabcontrollers/SettingsTabController.h | 8 + src/tabcontrollers/VideoTabController.h | 1 + src/utils/Matrix.h | 7 + src/utils/setup.cpp | 16 +- src/utils/setup.h | 4 + ver/versioncheck.json | 2 +- 24 files changed, 446 insertions(+), 316 deletions(-) diff --git a/Readme.md b/Readme.md index 87610c0..462ecb7 100644 --- a/Readme.md +++ b/Readme.md @@ -510,9 +510,11 @@ Full build instructions can be found [here](docs/building_for_linux.md). # Common Issues: + - **Issue:** Upon clicking ADV-Settings icon no page shows up. - - **Cause:** related to multiple GPU systems (and specifically nvidia), and ALVR - - **Solution:** go to Nvidia Control Panel -> manage 3D settings -> add Advanced Settings, and force the vr gpu for it. + - **Cause:** related to multiple GPU systems Displaying OpenGL on low power GPU first (IGPU's primarily) [some programs such as alvr may also cause this issue] + - **Solution for Nvidia GPU's:** go to Nvidia Control Panel -> manage 3D settings -> Program Settings -> add Advanced Settings, and change `OpenGL Rendering GPU` to the GPU your VR is connected to. + - **Solution for Windows (1803+):** go to Settings -> System -> Display -> Select `Classic App` and Browse for `AdvancedSettings.exe` -> Click Options -> Select High Performance - **Issue:** Snap back when using motion controls with WMR headset - **Cause:** WMR boundary off, or set up for standing only. diff --git a/build_scripts/compile_version_string.txt b/build_scripts/compile_version_string.txt index ae4be6b..1fee09a 100644 --- a/build_scripts/compile_version_string.txt +++ b/build_scripts/compile_version_string.txt @@ -1 +1 @@ -5.1.0-dev \ No newline at end of file +5.1.1-release \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 5fd7f18..ec3b26c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,5 +1,6 @@ #include "utils/setup.h" #include "settings/settings.h" +#include "openvr/ovr_settings_wrapper.h" INITIALIZE_EASYLOGGINGPP @@ -109,6 +110,11 @@ int main( int argc, char* argv[] ) qobject_cast( quickObj )->height() ) ); m_pWindow->show(); } + if ( commandLineArgs.resetSettings ) + { + // resets all settings if called + ovr_settings_wrapper::resetAllSettings(); + } return mainEventLoop.exec(); } diff --git a/src/openvr/ovr_overlay_wrapper.cpp b/src/openvr/ovr_overlay_wrapper.cpp index 0af3a8b..9cf5553 100644 --- a/src/openvr/ovr_overlay_wrapper.cpp +++ b/src/openvr/ovr_overlay_wrapper.cpp @@ -9,11 +9,7 @@ OverlayError createOverlay( const std::string overlayKey, { vr::VROverlayError oError = vr::VROverlay()->CreateOverlay( overlayKey.c_str(), overlayName.c_str(), overlayHandle ); - if ( oError == vr::VROverlayError_None ) - { - return OverlayError::NoError; - } - else + if ( oError != vr::VROverlayError_None ) { LOG( ERROR ) << "Could not create overlay: " << overlayName << "because " @@ -21,6 +17,7 @@ OverlayError createOverlay( const std::string overlayKey, << " " << customErrorMsg; return OverlayError::UndefinedError; } + return OverlayError::NoError; } OverlayError setOverlayColor( vr::VROverlayHandle_t overlayHandle, @@ -31,11 +28,7 @@ OverlayError setOverlayColor( vr::VROverlayHandle_t overlayHandle, { vr::VROverlayError oError = vr::VROverlay()->SetOverlayColor( overlayHandle, red, green, blue ); - if ( oError == vr::VROverlayError_None ) - { - return OverlayError::NoError; - } - else + if ( oError != vr::VROverlayError_None ) { LOG( ERROR ) << "Error setting Overlay Color For " << getOverlayKey( overlayHandle ) << " with error: " @@ -43,6 +36,7 @@ OverlayError setOverlayColor( vr::VROverlayHandle_t overlayHandle, << " " << customErrorMsg; return OverlayError::UndefinedError; } + return OverlayError::NoError; } OverlayError setOverlayAlpha( vr::VROverlayHandle_t overlayHandle, @@ -51,11 +45,7 @@ OverlayError setOverlayAlpha( vr::VROverlayHandle_t overlayHandle, { vr::VROverlayError oError = vr::VROverlay()->SetOverlayAlpha( overlayHandle, alpha ); - if ( oError == vr::VROverlayError_None ) - { - return OverlayError::NoError; - } - else + if ( oError != vr::VROverlayError_None ) { LOG( ERROR ) << "Error setting Overlay Alpha For " << getOverlayKey( overlayHandle ) << " with error: " @@ -63,6 +53,7 @@ OverlayError setOverlayAlpha( vr::VROverlayHandle_t overlayHandle, << " " << customErrorMsg; return OverlayError::UndefinedError; } + return OverlayError::NoError; } OverlayError setOverlayWidthInMeters( vr::VROverlayHandle_t overlayHandle, @@ -71,11 +62,7 @@ OverlayError setOverlayWidthInMeters( vr::VROverlayHandle_t overlayHandle, { vr::VROverlayError oError = vr::VROverlay()->SetOverlayWidthInMeters( overlayHandle, widthInMeters ); - if ( oError == vr::VROverlayError_None ) - { - return OverlayError::NoError; - } - else + if ( oError != vr::VROverlayError_None ) { LOG( ERROR ) << "Error setting overlay width For " << getOverlayKey( overlayHandle ) << " with error: " @@ -83,6 +70,7 @@ OverlayError setOverlayWidthInMeters( vr::VROverlayHandle_t overlayHandle, << " " << customErrorMsg; return OverlayError::UndefinedError; } + return OverlayError::NoError; } OverlayError setOverlayFromFile( vr::VROverlayHandle_t overlayHandle, @@ -91,29 +79,23 @@ OverlayError setOverlayFromFile( vr::VROverlayHandle_t overlayHandle, { { const auto overlayPath = paths::binaryDirectoryFindFile( fileName ); - if ( overlayPath.has_value() ) - { - vr::VROverlayError oError = vr::VROverlay()->SetOverlayFromFile( - overlayHandle, overlayPath->c_str() ); - if ( oError == vr::VROverlayError_None ) - { - return OverlayError::NoError; - } - else - { - LOG( ERROR ) - << "Error setting Overlay from file For " - << getOverlayKey( overlayHandle ) << " with error: " - << vr::VROverlay()->GetOverlayErrorNameFromEnum( oError ) - << " " << customErrorMsg; - return OverlayError::UndefinedError; - } - } - else + if ( !overlayPath.has_value() ) { LOG( ERROR ) << "File not Found: " << fileName << customErrorMsg; return OverlayError::UndefinedError; } + vr::VROverlayError oError = vr::VROverlay()->SetOverlayFromFile( + overlayHandle, overlayPath->c_str() ); + if ( oError != vr::VROverlayError_None ) + { + LOG( ERROR ) << "Error setting Overlay from file For " + << getOverlayKey( overlayHandle ) << " with error: " + << vr::VROverlay()->GetOverlayErrorNameFromEnum( + oError ) + << " " << customErrorMsg; + return OverlayError::UndefinedError; + } + return OverlayError::NoError; } } @@ -121,11 +103,7 @@ OverlayError showOverlay( vr::VROverlayHandle_t overlayHandle, std::string customErrorMsg ) { vr::VROverlayError oError = vr::VROverlay()->ShowOverlay( overlayHandle ); - if ( oError == vr::VROverlayError_None ) - { - return OverlayError::NoError; - } - else + if ( oError != vr::VROverlayError_None ) { LOG( ERROR ) << "Error showing overlay For " << getOverlayKey( overlayHandle ) << " with error: " @@ -133,17 +111,14 @@ OverlayError showOverlay( vr::VROverlayHandle_t overlayHandle, << " " << customErrorMsg; return OverlayError::UndefinedError; } + return OverlayError::NoError; } OverlayError hideOverlay( vr::VROverlayHandle_t overlayHandle, std::string customErrorMsg ) { vr::VROverlayError oError = vr::VROverlay()->HideOverlay( overlayHandle ); - if ( oError == vr::VROverlayError_None ) - { - return OverlayError::NoError; - } - else + if ( oError != vr::VROverlayError_None ) { LOG( ERROR ) << "Error hiding overlay For " << getOverlayKey( overlayHandle ) << " with error: " @@ -151,6 +126,7 @@ OverlayError hideOverlay( vr::VROverlayHandle_t overlayHandle, << " " << customErrorMsg; return OverlayError::UndefinedError; } + return OverlayError::NoError; } OverlayError setOverlayTransformAbsolute( @@ -161,11 +137,7 @@ OverlayError setOverlayTransformAbsolute( { vr::VROverlayError oError = vr::VROverlay()->SetOverlayTransformAbsolute( overlayHandle, trackingOrigin, trackingOriginToOverlayTransform ); - if ( oError == vr::VROverlayError_None ) - { - return OverlayError::NoError; - } - else + if ( oError != vr::VROverlayError_None ) { LOG( ERROR ) << "Error setting Overlay Position For " << getOverlayKey( overlayHandle ) << " with error: " @@ -173,6 +145,7 @@ OverlayError setOverlayTransformAbsolute( << " " << customErrorMsg; return OverlayError::UndefinedError; } + return OverlayError::NoError; } std::string getOverlayKey( vr::VROverlayHandle_t overlayHandle ) @@ -184,16 +157,13 @@ std::string getOverlayKey( vr::VROverlayHandle_t overlayHandle ) vr::VROverlay()->GetOverlayKey( overlayHandle, cStringOut, bufferMax, &oErrorOut ); std::string output = cStringOut; - if ( oErrorOut == vr::VROverlayError_None ) - { - return output; - } - else + if ( oErrorOut != vr::VROverlayError_None ) { std::string errorName = vr::VROverlay()->GetOverlayErrorNameFromEnum( oErrorOut ); return ( "can't get name:" + errorName ); } + return output; } } // namespace ovr_overlay_wrapper diff --git a/src/openvr/ovr_settings_wrapper.cpp b/src/openvr/ovr_settings_wrapper.cpp index a09a168..fd971bb 100644 --- a/src/openvr/ovr_settings_wrapper.cpp +++ b/src/openvr/ovr_settings_wrapper.cpp @@ -145,4 +145,15 @@ SettingsError removeKeyInSection( std::string section, return handleErrors( settingsKey, error, customErrorMsg ); } +void resetAllSettings() +{ + // these should cover all sections we touch and should be added to if we + // touch more or they change + removeSection( vr::k_pch_SteamVR_Section, "While Resetting All" ); + removeSection( vr::k_pch_Notifications_Section, "While Resetting All" ); + removeSection( vr::k_pch_CollisionBounds_Section, "While Resetting All" ); + removeSection( vr::k_pch_Camera_Section, "While Resetting All" ); + removeSection( vr::k_pch_audio_Section, "While Resetting All" ); +} + } // namespace ovr_settings_wrapper diff --git a/src/openvr/ovr_settings_wrapper.h b/src/openvr/ovr_settings_wrapper.h index 01fb465..14d1a2d 100644 --- a/src/openvr/ovr_settings_wrapper.h +++ b/src/openvr/ovr_settings_wrapper.h @@ -63,4 +63,6 @@ SettingsError removeKeyInSection( std::string section, SettingsError handleErrors( std::string settingsKey, vr::EVRSettingsError, std::string customErrorMsg ); + +void resetAllSettings(); } // namespace ovr_settings_wrapper diff --git a/src/res/qml/SettingsPage.qml b/src/res/qml/SettingsPage.qml index 5b4cc40..fa931b0 100644 --- a/src/res/qml/SettingsPage.qml +++ b/src/res/qml/SettingsPage.qml @@ -1,5 +1,6 @@ import QtQuick 2.7 import QtQuick.Controls 2.0 +import QtQuick.Controls 2.5 import QtQuick.Layouts 1.3 import ovras.advsettings 1.0 import "common" @@ -7,233 +8,248 @@ import "common" MyStackViewPage { headerText: "Application Settings" - content: ColumnLayout { - spacing: 18 + content: ScrollView{ + ScrollBar.horizontal.policy: ScrollBar.AlwaysOff + ScrollBar.vertical.policy: ScrollBar.AlwaysOn - MyToggleButton { - id: settingsAutoStartToggle - text: "Autostart" - onCheckedChanged: { - SettingsTabController.setAutoStartEnabled(checked, false) - } - } - - MyToggleButton { - id: allowExternalEditsToggle - text: "Allow External App Chaperone Edits (Danger)" - onCheckedChanged: { - MoveCenterTabController.setAllowExternalEdits(checked, true) - seatedOldExternalWarning.visible = checked && MoveCenterTabController.oldStyleMotion && MoveCenterTabController.enableSeatedMotion - } - } - - MyToggleButton { - id: oldStyleMotionToggle - text: "Old-Style Motion (per-frame disk writes)" - onCheckedChanged: { - MoveCenterTabController.setOldStyleMotion(checked, true) - seatedOldExternalWarning.visible = MoveCenterTabController.allowExternalEdits && checked && MoveCenterTabController.enableSeatedMotion - } - } - - MyToggleButton { - id: universeCenteredRotationToggle - text: "Universe-Centered Rotation (Disables HMD Centering)" - onCheckedChanged: { - MoveCenterTabController.setUniverseCenteredRotation(checked, true) - } - } - - MyToggleButton { - id: enableSeatedMotionToggle - text: "Enable Motion Features When in Seated Mode (Experimental)" - onCheckedChanged: { - MoveCenterTabController.setEnableSeatedMotion(checked, true) - seatedOldExternalWarning.visible = MoveCenterTabController.allowExternalEdits && MoveCenterTabController.oldStyleMotion && checked - } - } - - MyToggleButton { - id: disableCrashRecoveryToggle - text: "Disable Automatic Crash Recovery of Chaperone Config" - onCheckedChanged: { - OverlayController.setCrashRecoveryDisabled(checked, true) - } - } - - MyToggleButton { - id: disableVersionCheckToggle - text: "Disable Notification of Newer Version Availability" - onCheckedChanged: { - OverlayController.setDisableVersionCheck(checked, true) - } - } - - RowLayout { - Layout.fillWidth: true + ColumnLayout { + spacing: 18 MyToggleButton { - id: vsyncDisabledToggle - text: "Disable App Vsync" + id: settingsAutoStartToggle + text: "Autostart" onCheckedChanged: { - OverlayController.setVsyncDisabled(checked, true) - customTickRateText.visible = checked - customTickRateLabel.visible = checked - customTickRateMsLabel.visible = checked + SettingsTabController.setAutoStartEnabled(checked, false) } } - MyText { - id: customTickRateLabel - text: "Custom Tick Rate: " - horizontalAlignment: Text.AlignRight - Layout.leftMargin: 20 - Layout.rightMargin: 2 - } - - MyTextField { - id: customTickRateText - text: "20" - keyBoardUID: 1001 - Layout.preferredWidth: 140 - Layout.leftMargin: 10 - Layout.rightMargin: 1 - horizontalAlignment: Text.AlignHCenter - function onInputEvent(input) { - var val = parseInt(input, 10) - if (!isNaN(val)) { - OverlayController.customTickRateMs = val - text = OverlayController.customTickRateMs - } else { - text = OverlayController.customTickRateMs - } - } - } - - MyText { - id: customTickRateMsLabel - text: "ms" - horizontalAlignment: Text.AlignLeft - Layout.leftMargin: 1 - } - - Item { - Layout.fillWidth: true - } - } - - RowLayout { - id: debugStateRow - Layout.fillWidth: true - - MyText { - id: debugStateLabel - text: "Debug State: " - horizontalAlignment: Text.AlignRight - Layout.leftMargin: 20 - Layout.rightMargin: 2 - } - - MyTextField { - id: debugStateText - text: "0" - keyBoardUID: 1002 - Layout.preferredWidth: 140 - Layout.leftMargin: 10 - Layout.rightMargin: 1 - horizontalAlignment: Text.AlignHCenter - function onInputEvent(input) { - var val = parseInt(input, 10) - if (!isNaN(val)) { - OverlayController.debugState = val - text = OverlayController.debugState - } else { - text = OverlayController.debugState - } - } - } - Item { - Layout.fillWidth: true - } - } - RowLayout{ - - MyText { - id: seatedOldExternalWarning - wrapMode: Text.WordWrap - font.pointSize: 20 - color: "#FFA500" - text: "WARNING: 'Allow External App Chaperone Edits' + 'Old-Style Motion' + 'Enable Motion Features When in Seated Mode' active together may cause space center misalignment. Load the «Autosaved Profile» in the 'Chaperone' tab to fix." - horizontalAlignment: Text.AlignHCenter - Layout.leftMargin: 20 - Layout.rightMargin: 20 - Layout.fillWidth: true - } - } - RowLayout{ - Item { - Layout.fillWidth: true - } - MyPushButton { - id: shutdownButton - Layout.preferredWidth: 250 - text: "Shutdown OVRAS" - onClicked: { - OverlayController.exitApp() - } - } - } - - Item { - Layout.fillHeight: true - } - - RowLayout { - Layout.fillWidth: true - - - Item { - Layout.fillWidth: true - } - MyToggleButton { - // set visible to true here in builds when we need a debug toggle checkbox, otherwise false when on master branch. - visible: false - id: debugToggle - text: "Debug" + id: allowExternalEditsToggle + text: "Allow External App Chaperone Edits (Danger)" onCheckedChanged: { - OverlayController.setEnableDebug(checked, true) + MoveCenterTabController.setAllowExternalEdits(checked, true) + seatedOldExternalWarning.visible = checked && MoveCenterTabController.oldStyleMotion && MoveCenterTabController.enableSeatedMotion } } - } + MyToggleButton { + id: oldStyleMotionToggle + text: "Old-Style Motion (per-frame disk writes)" + onCheckedChanged: { + MoveCenterTabController.setOldStyleMotion(checked, true) + seatedOldExternalWarning.visible = MoveCenterTabController.allowExternalEdits && checked && MoveCenterTabController.enableSeatedMotion + } + } - Component.onCompleted: { - settingsAutoStartToggle.checked = SettingsTabController.autoStartEnabled + MyToggleButton { + id: universeCenteredRotationToggle + text: "Universe-Centered Rotation (Disables HMD Centering)" + onCheckedChanged: { + MoveCenterTabController.setUniverseCenteredRotation(checked, true) + } + } - allowExternalEditsToggle.checked = MoveCenterTabController.allowExternalEdits - oldStyleMotionToggle.checked = MoveCenterTabController.oldStyleMotion - universeCenteredRotationToggle.checked = MoveCenterTabController.universeCenteredRotation - enableSeatedMotionToggle.checked = MoveCenterTabController.enableSeatedMotion + MyToggleButton { + id: enableSeatedMotionToggle + text: "Enable Motion Features When in Seated Mode (Experimental)" + onCheckedChanged: { + MoveCenterTabController.setEnableSeatedMotion(checked, true) + seatedOldExternalWarning.visible = MoveCenterTabController.allowExternalEdits && MoveCenterTabController.oldStyleMotion && checked + } + } - disableCrashRecoveryToggle.checked = OverlayController.crashRecoveryDisabled - customTickRateText.text = OverlayController.customTickRateMs - vsyncDisabledToggle.checked = OverlayController.vsyncDisabled - customTickRateText.visible = vsyncDisabledToggle.checked - customTickRateLabel.visible = vsyncDisabledToggle.checked - customTickRateMsLabel.visible = vsyncDisabledToggle.checked - debugStateRow.visible = OverlayController.enableDebug - debugStateText.text = OverlayController.debugState - disableVersionCheckToggle.checked = OverlayController.disableVersionCheck + MyToggleButton { + id: disableCrashRecoveryToggle + text: "Disable Automatic Crash Recovery of Chaperone Config" + onCheckedChanged: { + OverlayController.setCrashRecoveryDisabled(checked, true) + } + } - seatedOldExternalWarning.visible = MoveCenterTabController.allowExternalEdits && MoveCenterTabController.oldStyleMotion && MoveCenterTabController.enableSeatedMotion - } + MyToggleButton { + id: disableVersionCheckToggle + text: "Disable Notification of Newer Version Availability" + onCheckedChanged: { + OverlayController.setDisableVersionCheck(checked, true) + } + } + MyToggleButton { + id: nativeChaperoneToggleButton + text: "Force Use SteamVR Chaperone (experimental + SteamVR restart required)" + onCheckedChanged: { + SettingsTabController.setNativeChaperoneToggle(this.checked, true) + } + } + + RowLayout { + Layout.fillWidth: true + + MyToggleButton { + id: vsyncDisabledToggle + text: "Disable App Vsync" + onCheckedChanged: { + OverlayController.setVsyncDisabled(checked, true) + customTickRateText.visible = checked + customTickRateLabel.visible = checked + customTickRateMsLabel.visible = checked + } + } + + MyText { + id: customTickRateLabel + text: "Custom Tick Rate: " + horizontalAlignment: Text.AlignRight + Layout.leftMargin: 20 + Layout.rightMargin: 2 + } + + MyTextField { + id: customTickRateText + text: "20" + keyBoardUID: 1001 + Layout.preferredWidth: 140 + Layout.leftMargin: 10 + Layout.rightMargin: 1 + horizontalAlignment: Text.AlignHCenter + function onInputEvent(input) { + var val = parseInt(input, 10) + if (!isNaN(val)) { + OverlayController.customTickRateMs = val + text = OverlayController.customTickRateMs + } else { + text = OverlayController.customTickRateMs + } + } + } + + MyText { + id: customTickRateMsLabel + text: "ms" + horizontalAlignment: Text.AlignLeft + Layout.leftMargin: 1 + } + + Item { + Layout.fillWidth: true + } + } + + RowLayout { + id: debugStateRow + Layout.fillWidth: true + + MyText { + id: debugStateLabel + text: "Debug State: " + horizontalAlignment: Text.AlignRight + Layout.leftMargin: 20 + Layout.rightMargin: 2 + } + + MyTextField { + id: debugStateText + text: "0" + keyBoardUID: 1002 + Layout.preferredWidth: 140 + Layout.leftMargin: 10 + Layout.rightMargin: 1 + horizontalAlignment: Text.AlignHCenter + function onInputEvent(input) { + var val = parseInt(input, 10) + if (!isNaN(val)) { + OverlayController.debugState = val + text = OverlayController.debugState + } else { + text = OverlayController.debugState + } + } + } + Item { + Layout.fillWidth: true + } + } + RowLayout{ + + MyText { + id: seatedOldExternalWarning + wrapMode: Text.WordWrap + font.pointSize: 20 + color: "#FFA500" + text: "WARNING: 'Allow External App Chaperone Edits' + 'Old-Style Motion' + 'Enable Motion Features When in Seated Mode' active together may cause space center misalignment. Load the «Autosaved Profile» in the 'Chaperone' tab to fix." + horizontalAlignment: Text.AlignHCenter + Layout.leftMargin: 20 + Layout.rightMargin: 20 + Layout.fillWidth: true + } + } + RowLayout{ + Item { + Layout.fillWidth: true + } + MyPushButton { + id: shutdownButton + Layout.preferredWidth: 250 + text: "Shutdown OVRAS" + onClicked: { + OverlayController.exitApp() + } + } + } + + Item { + Layout.fillHeight: true + } + + RowLayout { + Layout.fillWidth: true + + + Item { + Layout.fillWidth: true + } + + MyToggleButton { + // set visible to true here in builds when we need a debug toggle checkbox, otherwise false when on master branch. + visible: false + id: debugToggle + text: "Debug" + onCheckedChanged: { + OverlayController.setEnableDebug(checked, true) + } + } + + } + } // end column + Component.onCompleted: { + settingsAutoStartToggle.checked = SettingsTabController.autoStartEnabled + + allowExternalEditsToggle.checked = MoveCenterTabController.allowExternalEdits + oldStyleMotionToggle.checked = MoveCenterTabController.oldStyleMotion + universeCenteredRotationToggle.checked = MoveCenterTabController.universeCenteredRotation + enableSeatedMotionToggle.checked = MoveCenterTabController.enableSeatedMotion + + disableCrashRecoveryToggle.checked = OverlayController.crashRecoveryDisabled + customTickRateText.text = OverlayController.customTickRateMs + vsyncDisabledToggle.checked = OverlayController.vsyncDisabled + customTickRateText.visible = vsyncDisabledToggle.checked + customTickRateLabel.visible = vsyncDisabledToggle.checked + customTickRateMsLabel.visible = vsyncDisabledToggle.checked + debugStateRow.visible = OverlayController.enableDebug + debugStateText.text = OverlayController.debugState + disableVersionCheckToggle.checked = OverlayController.disableVersionCheck + nativeChaperoneToggleButton.checked = SettingsTabController.nativeChaperoneToggle + + seatedOldExternalWarning.visible = MoveCenterTabController.allowExternalEdits && MoveCenterTabController.oldStyleMotion && MoveCenterTabController.enableSeatedMotion + } Connections { target: SettingsTabController onAutoStartEnabledChanged: { settingsAutoStartToggle.checked = SettingsTabController.autoStartEnabled } + onNativeChaperoneToggleChanged:{ + nativeChaperoneToggleButton.checked = SettingsTabController.nativeChaperoneToggle + } } Connections { @@ -282,5 +298,5 @@ MyStackViewPage { disableVersionCheckToggle.checked = OverlayController.disableVersionCheck } } - } + } // end scroll } diff --git a/src/res/qml/chaperone_page/ChaperonePage.qml b/src/res/qml/chaperone_page/ChaperonePage.qml index 758b72e..2f6b6c8 100644 --- a/src/res/qml/chaperone_page/ChaperonePage.qml +++ b/src/res/qml/chaperone_page/ChaperonePage.qml @@ -556,6 +556,8 @@ MyStackViewPage { } chaperoneHeightText.text = h chaperoneCenterMarkerToggle.checked = ChaperoneTabController.centerMarkerNew + //We Need a Set call on init in order to display the overlay! + ChaperoneTabController.setCenterMarkerNew(chaperoneCenterMarkerToggle.checked); chaperonePlaySpaceToggle.checked = ChaperoneTabController.playSpaceMarker chaperoneForceBoundsToggle.checked = ChaperoneTabController.forceBounds chaperoneDisableChaperone.checked = ChaperoneTabController.disableChaperone diff --git a/src/res/qml/chaperone_page/chaperone_additional/chaperonemisc/ChaperoneMiscGroupBox.qml b/src/res/qml/chaperone_page/chaperone_additional/chaperonemisc/ChaperoneMiscGroupBox.qml index daa533e..60ed654 100644 --- a/src/res/qml/chaperone_page/chaperone_additional/chaperonemisc/ChaperoneMiscGroupBox.qml +++ b/src/res/qml/chaperone_page/chaperone_additional/chaperonemisc/ChaperoneMiscGroupBox.qml @@ -74,7 +74,7 @@ GroupBox { chaperoneFloorToggleBtn.checked = ChaperoneTabController.chaperoneFloorToggle } onCenterMarkerChanged:{ - legacyCenterMarkerbtn.checked = ChaperoneTabController.centermarker + legacyCenterMarkerbtn.checked = ChaperoneTabController.centerMarker } } } diff --git a/src/res/qml/rotation_page/redirected/AutoTurnGroupBox.qml b/src/res/qml/rotation_page/redirected/AutoTurnGroupBox.qml index ffc6c65..3c0a3e4 100644 --- a/src/res/qml/rotation_page/redirected/AutoTurnGroupBox.qml +++ b/src/res/qml/rotation_page/redirected/AutoTurnGroupBox.qml @@ -10,7 +10,7 @@ GroupBox { label: MyText { leftPadding: 10 - text: "Auto-turn (aka infinite walk)" + text: "Auto-Turn (for discrete redirected walking)" bottomPadding: -10 } background: Rectangle { diff --git a/src/res/qml/rotation_page/redirected/RedirectedGroupBox.qml b/src/res/qml/rotation_page/redirected/RedirectedGroupBox.qml index c9ec39f..757f2c5 100644 --- a/src/res/qml/rotation_page/redirected/RedirectedGroupBox.qml +++ b/src/res/qml/rotation_page/redirected/RedirectedGroupBox.qml @@ -10,7 +10,7 @@ GroupBox { label: MyText { leftPadding: 10 - text: "Redirected Walking" + text: "Vestibular Motion (for continuous redirected walking)" bottomPadding: -10 } background: Rectangle { diff --git a/src/res/qml/rotation_page/space_turn/SpaceTurnGroupBox.qml b/src/res/qml/rotation_page/space_turn/SpaceTurnGroupBox.qml index 78e53cb..8491220 100644 --- a/src/res/qml/rotation_page/space_turn/SpaceTurnGroupBox.qml +++ b/src/res/qml/rotation_page/space_turn/SpaceTurnGroupBox.qml @@ -10,7 +10,7 @@ GroupBox { label: MyText { leftPadding: 10 - text: "Space Turn" + text: "Space Turn (for manual redirected walking)" bottomPadding: -10 } background: Rectangle { diff --git a/src/settings/internal/settings_controller.h b/src/settings/internal/settings_controller.h index 2a0a11c..ba1fafe 100644 --- a/src/settings/internal/settings_controller.h +++ b/src/settings/internal/settings_controller.h @@ -426,18 +426,26 @@ private: QtInfo{ "colorBlueNew" }, 1.0 }, + // TODO BUG [breaking change] should be in Chaperone Settings Not Video + // fix @ breaking change DoubleSettingValue{ DoubleSetting::CHAPERONE_switchToBeginnerDistance, SettingCategory::Video, QtInfo{ "chaperoneSwitchToBeginnerDistance" }, 0.5 }, + // TODO BUG [breaking change] should be in Chaperone Settings Not Video + // fix @ breaking change DoubleSettingValue{ DoubleSetting::CHAPERONE_hapticFeedbackDistance, SettingCategory::Video, QtInfo{ "chaperoneHapticFeedbackDistance" }, 0.5 }, + // TODO BUG [breaking change] should be in Chaperone Settings Not Video + // fix @ breaking change DoubleSettingValue{ DoubleSetting::CHAPERONE_alarmSoundDistance, SettingCategory::Video, QtInfo{ "chaperoneAlarmSoundDistance" }, 0.5 }, + // TODO BUG [breaking change] should be in Chaperone Settings Not Video + // fix @ breaking change DoubleSettingValue{ DoubleSetting::CHAPERONE_showDashboardDistance, SettingCategory::Video, QtInfo{ "chaperoneShowDashboardDistance" }, diff --git a/src/tabcontrollers/ChaperoneTabController.cpp b/src/tabcontrollers/ChaperoneTabController.cpp index fc30c79..34db2cb 100644 --- a/src/tabcontrollers/ChaperoneTabController.cpp +++ b/src/tabcontrollers/ChaperoneTabController.cpp @@ -20,17 +20,24 @@ void ChaperoneTabController::initStage1() reloadChaperoneProfiles(); m_chaperoneSettingsUpdateCounter = utils::adjustUpdateRate( k_chaperoneSettingsUpdateCounter ); - initFloorOverlay(); + initCenterMarkerOverlay(); eventLoopTick( m_trackingUniverse, nullptr ); } void ChaperoneTabController::initStage2( OverlayController* var_parent ) { this->parent = var_parent; - // Cludge Fix for now, but its not getting called for some reason w/ QML - setCenterMarkerNew( centerMarkerNew() ); + updateChaperoneSettings(); // force one update of OVR saved settings to make // sure our m_ variables are correct + // Force call Update Overlay Once, so Default state is in correct location + if ( m_centerMarkerOverlayIsInit ) + { + vr::HmdMatrix34_t temp = { { { 1.0f, 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 1.0f, 0.0f }, + { 0.0f, -1.0f, 0.0f, 0.0f } } }; + updateCenterMarkerOverlay( &( temp ) ); + } } void ChaperoneTabController::dashboardLoopTick() @@ -237,13 +244,7 @@ void ChaperoneTabController::eventLoopTick( vr::TrackedDevicePose_t* devicePoses ) { m_trackingUniverse = universe; - // Update overlay should only run After move center tab controller is - // initialized. - // As such this protects it from running during initstage 1. - if ( centerMarkerNew() && devicePoses != nullptr ) - { - updateOverlay(); - } + if ( devicePoses ) { m_isHMDActive = false; @@ -739,7 +740,7 @@ void ChaperoneTabController::setChaperoneColorR( int value, bool notify ) vr::k_pch_CollisionBounds_ColorGammaR_Int32, m_chaperoneColorR, "" ); - updateOverlayColor(); + updateCenterMarkerOverlayColor(); if ( notify ) { emit chaperoneColorRChanged( value ); @@ -767,7 +768,7 @@ void ChaperoneTabController::setChaperoneColorG( int value, bool notify ) vr::k_pch_CollisionBounds_ColorGammaG_Int32, m_chaperoneColorG, "" ); - updateOverlayColor(); + updateCenterMarkerOverlayColor(); if ( notify ) { emit chaperoneColorGChanged( value ); @@ -795,14 +796,14 @@ void ChaperoneTabController::setChaperoneColorB( int value, bool notify ) vr::k_pch_CollisionBounds_ColorGammaB_Int32, m_chaperoneColorB, "" ); - updateOverlayColor(); + updateCenterMarkerOverlayColor(); if ( notify ) { emit chaperoneColorBChanged( value ); } } } -void ChaperoneTabController::updateOverlayColor() +void ChaperoneTabController::updateCenterMarkerOverlayColor() { float chapColorR = static_cast( m_chaperoneColorR ) / 255.0f; float chapColorG = static_cast( m_chaperoneColorG ) / 255.0f; @@ -840,10 +841,12 @@ void ChaperoneTabController::setCenterMarkerNew( bool value, bool notify ) if ( value ) { ovr_overlay_wrapper::showOverlay( m_chaperoneFloorOverlayHandle ); + m_centerMarkerOverlayNeedsUpdate = true; } else { ovr_overlay_wrapper::hideOverlay( m_chaperoneFloorOverlayHandle ); + m_centerMarkerOverlayNeedsUpdate = false; } if ( notify ) @@ -1546,7 +1549,7 @@ void ChaperoneTabController::addRightHapticClick( bool rightHapticClickPressed ) } } -void ChaperoneTabController::initFloorOverlay() +void ChaperoneTabController::initCenterMarkerOverlay() { std::string overlayFloorMarkerKey = std::string( application_strings::applicationKey ) + ".floormarker"; @@ -1561,9 +1564,10 @@ void ChaperoneTabController::initFloorOverlay() m_chaperoneFloorOverlayHandle, m_floorMarkerFN, "" ); ovr_overlay_wrapper::setOverlayWidthInMeters( m_chaperoneFloorOverlayHandle, 0.5f ); - updateOverlayColor(); + updateCenterMarkerOverlayColor(); ovr_overlay_wrapper::setOverlayAlpha( m_chaperoneFloorOverlayHandle, m_visibility, "" ); + m_centerMarkerOverlayIsInit = true; } else { @@ -1572,32 +1576,25 @@ void ChaperoneTabController::initFloorOverlay() } } -void ChaperoneTabController::updateOverlay() +// This Function Is called And Handled In MoveCenterTabController to reduce +// un-necessary overhead, as well as consistancy in movement operations +// It will be updated Every frame that movement is updated +void ChaperoneTabController::updateCenterMarkerOverlay( + vr::HmdMatrix34_t* centerPlaySpaceMatrix ) { if ( m_trackingUniverse != vr::TrackingUniverseRawAndUncalibrated ) { - float xoff = -( parent->m_moveCenterTabController.offsetX() ); - float yoff = -( parent->m_moveCenterTabController.offsetY() ); - float zoff = -( parent->m_moveCenterTabController.offsetZ() ); - /* Rotation on Y Axis - * {cos t, 0, sin t} - * {0, 1, 0} - * {-sin t, 0 cost t} - */ - - vr::HmdMatrix34_t updateTransform = { { { 1.0f, 0.0f, 0.0f, xoff }, - { 0.0f, 0.0f, 1.0f, yoff }, - { 0.0f, -1.0f, 0.0f, zoff } } }; ovr_overlay_wrapper::setOverlayTransformAbsolute( m_chaperoneFloorOverlayHandle, m_trackingUniverse, - &updateTransform, + ( centerPlaySpaceMatrix ), "" ); - checkOverlayRotation(); + + checkCenterMarkerOverlayRotationCount(); } } -void ChaperoneTabController::checkOverlayRotation() +void ChaperoneTabController::checkCenterMarkerOverlayRotationCount() { // can only turn so quickly soooo roughly .5 secondish update should be fine if ( m_rotationUpdateCounter > 45 ) diff --git a/src/tabcontrollers/ChaperoneTabController.h b/src/tabcontrollers/ChaperoneTabController.h index 443ce9f..96e89bb 100644 --- a/src/tabcontrollers/ChaperoneTabController.h +++ b/src/tabcontrollers/ChaperoneTabController.h @@ -376,13 +376,12 @@ private: std::vector chaperoneProfiles; std::string m_floorMarkerFN = "/res/img/chaperone/centermark.png"; - void initFloorOverlay(); - void updateOverlay(); - void updateOverlayColor(); - void checkOverlayRotation(); + void initCenterMarkerOverlay(); + void updateCenterMarkerOverlayColor(); + void checkCenterMarkerOverlayRotationCount(); int m_rotationUpdateCounter = 0; int m_rotationCurrent = 0; - bool m_overlayNeedsUpdate = false; + bool m_centerMarkerOverlayIsInit = false; vr::ETrackingUniverseOrigin m_trackingUniverse = vr::TrackingUniverseRawAndUncalibrated; @@ -398,6 +397,8 @@ public: void dashboardLoopTick(); void handleChaperoneWarnings( float distance ); + void updateCenterMarkerOverlay( vr::HmdMatrix34_t* centerPlaySpaceMatrix ); + float boundsVisibility() const; float fadeDistance(); float height(); @@ -412,6 +413,7 @@ public: int chaperoneColorA() const; bool centerMarkerNew(); + bool m_centerMarkerOverlayNeedsUpdate = false; bool chaperoneFloorToggle(); diff --git a/src/tabcontrollers/MoveCenterTabController.cpp b/src/tabcontrollers/MoveCenterTabController.cpp index f8dfb0d..1a67b14 100644 --- a/src/tabcontrollers/MoveCenterTabController.cpp +++ b/src/tabcontrollers/MoveCenterTabController.cpp @@ -1,7 +1,6 @@ #include "MoveCenterTabController.h" #include #include "../overlaycontroller.h" -#include "../utils/Matrix.h" #include "../quaternion/quaternion.h" #include "../settings/settings.h" @@ -1005,6 +1004,14 @@ void MoveCenterTabController::reset() m_lastControllerPosition[0] = 0.0f; m_lastControllerPosition[1] = 0.0f; m_lastControllerPosition[2] = 0.0f; + + // For Center Marker + if ( parent->m_chaperoneTabController.m_centerMarkerOverlayNeedsUpdate ) + { + m_offsetmatrix = utils::k_forwardUpMatrix; + parent->m_chaperoneTabController.updateCenterMarkerOverlay( + &m_offsetmatrix ); + } m_lastMoveHand = vr::TrackedControllerRole_Invalid; m_lastRotateHand = vr::TrackedControllerRole_Invalid; applyChaperoneResetData(); @@ -2567,14 +2574,17 @@ void MoveCenterTabController::updateSpace( bool forceUpdate ) // (we reuse offsetUniverseCenterYaw to rotate the chaperone also) double offsetUniverseCenterYaw = static_cast( std::atan2( offsetUniverseCenter.m[0][2], offsetUniverseCenter.m[2][2] ) ); + double offsetUniverseCenterXyz[3] = { static_cast( offsetUniverseCenter.m[0][3] ), static_cast( offsetUniverseCenter.m[1][3] ), static_cast( offsetUniverseCenter.m[2][3] ) }; // unrotate to get raw values of xyz + rotateCoordinates( offsetUniverseCenterXyz, offsetUniverseCenterYaw - ( m_rotation * k_centidegreesToRadians ) ); + if ( abs( offsetUniverseCenterXyz[0] ) > k_maxOpenvrWorkingSetOffest || ( abs( offsetUniverseCenterXyz[0] ) > k_maxOvrasUniverseCenteredTurningOffset @@ -2715,6 +2725,47 @@ void MoveCenterTabController::updateSpace( bool forceUpdate ) } } + // Center Marker for playspace. + if ( parent->m_chaperoneTabController.m_centerMarkerOverlayNeedsUpdate ) + { + // Set Unrotated Coordinates + float universePlayCenterTempCoords[3] = { 0.0f, 0.0f, 0.0f }; + universePlayCenterTempCoords[0] + -= offsetUniverseCenter.m[0][3] + - m_universeCenterForReset.m[0][3]; + universePlayCenterTempCoords[1] + -= offsetUniverseCenter.m[1][3] + - m_universeCenterForReset.m[1][3]; + universePlayCenterTempCoords[2] + -= offsetUniverseCenter.m[2][3] + - m_universeCenterForReset.m[2][3]; + // Rotate un-rotated to rotated + rotateFloatCoordinates( + universePlayCenterTempCoords, + static_cast( offsetUniverseCenterYaw ) ); + // Set Up orientation properly away from raw center + utils::matMul33( m_offsetmatrix, + offsetUniverseCenter, + utils::k_forwardUpMatrix ); + vr::HmdMatrix34_t rotMatrix; + utils::initRotationMatrix( + rotMatrix, + 1, + static_cast( -( ( m_rotation * k_centidegreesToRadians ) + + offsetUniverseCenterYaw ) ) ); + + // Rotates orientation At playspace center + vr::HmdMatrix34_t finalmatrix; + utils::matMul33( finalmatrix, rotMatrix, m_offsetmatrix ); + + finalmatrix.m[0][3] = universePlayCenterTempCoords[0]; + finalmatrix.m[1][3] = universePlayCenterTempCoords[1]; + finalmatrix.m[2][3] = universePlayCenterTempCoords[2]; + + parent->m_chaperoneTabController.updateCenterMarkerOverlay( + &finalmatrix ); + } + // update chaperone working set preview (this does not commit) vr::VRChaperoneSetup()->SetWorkingCollisionBoundsInfo( updatedBounds, m_collisionBoundsCountForReset ); diff --git a/src/tabcontrollers/MoveCenterTabController.h b/src/tabcontrollers/MoveCenterTabController.h index 3b4a0a3..3d5ab9b 100644 --- a/src/tabcontrollers/MoveCenterTabController.h +++ b/src/tabcontrollers/MoveCenterTabController.h @@ -5,6 +5,7 @@ #include #include #include +#include "../utils/Matrix.h" #include "../utils/FrameRateUtils.h" #include "../settings/settings_object.h" @@ -205,6 +206,9 @@ private: unsigned int m_moveCenterSettingsUpdateCounter = 83; + // Matrix used For Center Marker + vr::HmdMatrix34_t m_offsetmatrix = utils::k_forwardUpMatrix; + double m_velocity[3] = { 0.0, 0.0, 0.0 }; std::chrono::steady_clock::time_point m_lastGravityUpdateTimePoint; std::chrono::steady_clock::time_point m_lastDragUpdateTimePoint; diff --git a/src/tabcontrollers/SettingsTabController.cpp b/src/tabcontrollers/SettingsTabController.cpp index beafc74..85c6965 100644 --- a/src/tabcontrollers/SettingsTabController.cpp +++ b/src/tabcontrollers/SettingsTabController.cpp @@ -16,6 +16,7 @@ void SettingsTabController::initStage1() void SettingsTabController::initStage2( OverlayController* var_parent ) { this->parent = var_parent; + setNativeChaperoneToggle( nativeChaperoneToggle() ); } void SettingsTabController::dashboardLoopTick() @@ -37,6 +38,38 @@ bool SettingsTabController::autoStartEnabled() const return m_autoStartEnabled; } +bool SettingsTabController::nativeChaperoneToggle() +{ + std::pair p + = ovr_settings_wrapper::getFloat( + vr::k_pch_CollisionBounds_Section, + vr::k_pch_CollisionBounds_EnableDriverImport, + "" ); + if ( p.first == ovr_settings_wrapper::SettingsError::NoError ) + { + m_nativeChaperoneToggle = !( p.second ); + } + return m_nativeChaperoneToggle; +} + +void SettingsTabController::setNativeChaperoneToggle( bool value, bool notify ) +{ + if ( m_nativeChaperoneToggle != value ) + { + m_nativeChaperoneToggle = !( value ); + ovr_settings_wrapper::setBool( + vr::k_pch_CollisionBounds_Section, + vr::k_pch_CollisionBounds_EnableDriverImport, + m_nativeChaperoneToggle, + "" ); + // On Error Do Nothing + if ( notify ) + { + emit nativeChaperoneToggleChanged( m_nativeChaperoneToggle ); + } + } +} + void SettingsTabController::setAutoStartEnabled( bool value, bool notify ) { if ( m_autoStartEnabled != value ) diff --git a/src/tabcontrollers/SettingsTabController.h b/src/tabcontrollers/SettingsTabController.h index b3d1cbc..14439d5 100644 --- a/src/tabcontrollers/SettingsTabController.h +++ b/src/tabcontrollers/SettingsTabController.h @@ -3,6 +3,7 @@ #include #include "../utils/FrameRateUtils.h" +#include "../openvr/ovr_settings_wrapper.h" class QQuickWindow; // application namespace @@ -16,6 +17,9 @@ class SettingsTabController : public QObject Q_OBJECT Q_PROPERTY( bool autoStartEnabled READ autoStartEnabled WRITE setAutoStartEnabled NOTIFY autoStartEnabledChanged ) + Q_PROPERTY( + bool nativeChaperoneToggle READ nativeChaperoneToggle WRITE + setNativeChaperoneToggle NOTIFY nativeChaperoneToggleChanged ) private: OverlayController* parent; @@ -23,6 +27,7 @@ private: unsigned settingsUpdateCounter = 0; bool m_autoStartEnabled = false; + bool m_nativeChaperoneToggle = false; unsigned int m_settingsTabSettingsUpdateCounter = 157; @@ -33,12 +38,15 @@ public: void dashboardLoopTick(); bool autoStartEnabled() const; + bool nativeChaperoneToggle(); public slots: void setAutoStartEnabled( bool value, bool notify = true ); + void setNativeChaperoneToggle( bool value, bool notify = true ); signals: void autoStartEnabledChanged( bool value ); + void nativeChaperoneToggleChanged( bool value ); }; } // namespace advsettings diff --git a/src/tabcontrollers/VideoTabController.h b/src/tabcontrollers/VideoTabController.h index 6aadb7e..06d9037 100644 --- a/src/tabcontrollers/VideoTabController.h +++ b/src/tabcontrollers/VideoTabController.h @@ -58,6 +58,7 @@ struct VideoProfile : settings::ISettingsObject o.addValue( overlayMethodState ); + // TODO add opacity Toggle? o.addValue( static_cast( opacity ) ); return o; diff --git a/src/utils/Matrix.h b/src/utils/Matrix.h index 0eed8d6..a8d8ee9 100644 --- a/src/utils/Matrix.h +++ b/src/utils/Matrix.h @@ -5,6 +5,13 @@ namespace utils { +// TODO possibly expand on this to include other orientations? +// This is Forward, and Up orientation matrix +constexpr vr::HmdMatrix34_t k_forwardUpMatrix + = { { { 1.0f, 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 1.0f, 0.0f }, + { 0.0f, -1.0f, 0.0f, 0.0f } } }; + inline vr::HmdMatrix34_t& initRotationMatrix( vr::HmdMatrix34_t& matrix, unsigned axisId, float angle ) diff --git a/src/utils/setup.cpp b/src/utils/setup.cpp index 04d9aaf..36ac96d 100644 --- a/src/utils/setup.cpp +++ b/src/utils/setup.cpp @@ -67,6 +67,10 @@ CommandLineOptions returnCommandLineParser( const MyQApplication& application ) k_forceRemoveManifestDescription ); parser.addOption( forceRemoveManifest ); + QCommandLineOption resetSettings( k_resetSettings, + k_resetSettingsDescription ); + parser.addOption( resetSettings ); + parser.process( application ); const bool desktopModeEnabled = parser.isSet( desktopMode ); @@ -87,12 +91,14 @@ CommandLineOptions returnCommandLineParser( const MyQApplication& application ) const bool forceRemoveManifestEnabled = parser.isSet( forceRemoveManifest ); LOG_IF( forceRemoveManifestEnabled, INFO ) << "Forcing removal of applications manifest."; + const bool resetSettingsEnabled = parser.isSet( resetSettings ); + LOG_IF( resetSettingsEnabled, INFO ) << "Reset SteamVR Settings."; - const CommandLineOptions commandLineArgs{ desktopModeEnabled, - forceNoSoundEnabled, - forceNoManifestEnabled, - forceInstallManifestEnabled, - forceRemoveManifestEnabled }; + const CommandLineOptions commandLineArgs{ + desktopModeEnabled, forceNoSoundEnabled, + forceNoManifestEnabled, forceInstallManifestEnabled, + forceRemoveManifestEnabled, resetSettingsEnabled + }; LOG( INFO ) << "Command line arguments processed."; diff --git a/src/utils/setup.h b/src/utils/setup.h index 3526755..9d4fd63 100644 --- a/src/utils/setup.h +++ b/src/utils/setup.h @@ -26,6 +26,7 @@ struct CommandLineOptions const bool forceNoManifest = false; const bool forceInstallManifest = false; const bool forceRemoveManifest = false; + const bool resetSettings = false; }; // Manages the programs control flow and main settings. @@ -87,6 +88,9 @@ constexpr auto k_forceInstallManifestDescription constexpr auto k_forceRemoveManifest = "force-remove-manifest"; constexpr auto k_forceRemoveManifestDescription = "Forces removing the applications manifest. Application will exit early."; +constexpr auto k_resetSettings = "reset-steamvr-settings"; +constexpr auto k_resetSettingsDescription + = "Resets all SteamVR values that can be modified in OVRAS to defaults."; CommandLineOptions returnCommandLineParser( const MyQApplication& application ); diff --git a/ver/versioncheck.json b/ver/versioncheck.json index b01db08..41db930 100644 --- a/ver/versioncheck.json +++ b/ver/versioncheck.json @@ -1 +1 @@ -{ "major": 5, "minor": 1, "patch": 0, "updateMessage": "", "optionalMessage": "" } \ No newline at end of file +{ "major": 5, "minor": 1, "patch": 1, "updateMessage": "", "optionalMessage": "" } \ No newline at end of file