diff --git a/Readme.md b/Readme.md
index a64e3ff..0ec2bdb 100644
--- a/Readme.md
+++ b/Readme.md
@@ -27,6 +27,7 @@ Adds an overlay to the OpenVR dashboard that allows access to advanced settings
+ [Other Controllers](#other-controllers)
* [SteamVR Input Guide](#steamvr-input-guide)
* [Command Line Arguments](#command-line-arguments)
+ * [INI File Options](#ini-file-options)
* [Preview builds](#preview-builds)
- [Documentation](#documentation)
* [Top Page](#top-page)
@@ -41,6 +42,7 @@ Adds an overlay to the OpenVR dashboard that allows access to advanced settings
* [- Utilities Page](#--utilities-page)
* [- Desktop Overlay Page](#--desktop-overlay-page)
* [- Statistics Page](#--statistics-page)
+ * [- Bindings Page](#--bindings-page)
* [- Settings Page](#--settings-page)
- [How to Compile](#how-to-compile)
* [Building on Windows](#building-on-windows)
@@ -217,6 +219,22 @@ The application (`AdvancedSettings.exe`) can be run with the following optional
`"--force-remove-manifest"`: Force uninstalls the `.vrmanifest`. This should be done every time the application is uninstalled. On Windows it is automatically done by the uninstaller. The program will exit early when this flag is set.
+## INI File Options
+
+There are some features that can only be enabled by directly specifying them in the .ini file. On windows the .ini file can be found at `Users\username\AppData\Roaming\AdvancedSettings-Team\OpenVRAdvancedSettings.ini`.
+
+When adding options to the .ini file, they must be added under the correct section to function.
+
+Currently the following ini-file-only settings exist:
+
+Under `[playspaceSettings]` adding `showLogMatricesButton=true` will enable a button in the Offsets Tab that when pressed will write a section to the log file containing the current pose matrix data for tracked devices and universe settings.
+
+Also under `[playspaceSettings]` adding `simpleRecenter=true` will disable a workaround that allows seated recenter to function on non-lighthouse devices. The workaround instantly applies a second seated recenter whenever a seated recenter is executed. Because simpleRecenter=true will break non-lighthouse seated mode, and true/false behavior is indistinguishable on lighthouse devices, usage of simpleRecenter=true is not recommended.
+
+Under `[utilitiesSettings]` adding `vrcDebug=true` will enable some buttons in the Utilities Tab to toggle debug panels in VRChat.
+
+Under `[applicationSettings]` adding `enableDebug=true` will show a "Debug State" text box in the Settings Tab. Changing the debug state number may be used for in-dev branch builds. At this time, it doesn't do anything on the master build.
+
## Preview builds
If you want to try latest and greatest unreleased features, you can download the latest from the CI (Continuous Integration) server for [Windows](https://ci.appveyor.com/project/icewind1991/openvr-advancedsettings/branch/master). The Linux CI does not provide binary artifacts.
@@ -379,6 +397,12 @@ Allows users to temporarily move and rotate the center of the playspace. This al
- **Timed Out**: Number of times the currently running application timed out.
- **Reprojection Ratio**: Ratio of presented frames to reprojected frames.
+## - Bindings Page
+
+
+
+- **Bindings Guide**: Shows users how to access the SteamVR input bindings configuration for Advanced Settings. Unfortunately we can't provide a button to directly open this, so users must navigate there themselves. The sole purpose of this page is to make the navigation to the actual bindings config more obvious for users who missed the instruction in this readme (This was a very common support issue). The intended reading of this image is: Click on the SteamVR Settings dash button, then click on "Controller Settings", then click on "Show More Applications" then find "Advanced Settings" by scrolling to the bottom, and click on it.
+
## - Settings Page
diff --git a/build_scripts/qt/resources.pri b/build_scripts/qt/resources.pri
index a18eb04..9d65f21 100644
--- a/build_scripts/qt/resources.pri
+++ b/build_scripts/qt/resources.pri
@@ -54,5 +54,6 @@ DISTFILES += \
src/res/qml/desktop_overlay_page/translation_left_right/SteamDesktopTranslationLeftRight.qml \
src/res/qml/desktop_overlay_page/translation_back_forwards/SteamDesktopTranslationBackForwards.qml \
src/res/qml/desktop_overlay_page/translation_up_down/SteamDesktopTranslationUpDown.qml \
+ src/res/qml/BindingsPage.qml \
win32:RC_ICONS += src/res/img/icons/advicon256px.ico
diff --git a/docs/screenshots/BindingsPage.png b/docs/screenshots/BindingsPage.png
new file mode 100644
index 0000000..0ab1c55
Binary files /dev/null and b/docs/screenshots/BindingsPage.png differ
diff --git a/docs/screenshots/RootPage.png b/docs/screenshots/RootPage.png
index 1b26dc6..cd6b550 100644
Binary files a/docs/screenshots/RootPage.png and b/docs/screenshots/RootPage.png differ
diff --git a/src/res/img/bindings/bindings.png b/src/res/img/bindings/bindings.png
new file mode 100644
index 0000000..762f6dd
Binary files /dev/null and b/src/res/img/bindings/bindings.png differ
diff --git a/src/res/qml/BindingsPage.qml b/src/res/qml/BindingsPage.qml
new file mode 100644
index 0000000..ae1574e
--- /dev/null
+++ b/src/res/qml/BindingsPage.qml
@@ -0,0 +1,19 @@
+import QtQuick 2.7
+import QtQuick.Controls 2.0
+import QtQuick.Layouts 1.3
+import ovras.advsettings 1.0
+import "common"
+
+MyStackViewPage {
+ headerText: "Bindings Guide"
+
+ content: ColumnLayout {
+ Image {
+ source: "qrc:/bindings/bindings"
+ sourceSize.width: 1120
+ sourceSize.height: 659
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ }
+ }
+}
diff --git a/src/res/qml/RootPage.qml b/src/res/qml/RootPage.qml
index 9e06975..9b1f6e8 100644
--- a/src/res/qml/RootPage.qml
+++ b/src/res/qml/RootPage.qml
@@ -141,6 +141,17 @@ MyStackViewPage {
Layout.fillWidth: true
}
+ MyPushButton {
+ id: bindingsButton
+ activationSoundEnabled: false
+ text: "Bindings"
+ Layout.fillWidth: true
+ onClicked: {
+ MyResources.playFocusChangedSound()
+ mainView.push(bindingsPage)
+ }
+ }
+
MyPushButton {
id: settingsButton
activationSoundEnabled: false
diff --git a/src/res/qml/common/mainwidget.qml b/src/res/qml/common/mainwidget.qml
index d044935..b48cbfc 100644
--- a/src/res/qml/common/mainwidget.qml
+++ b/src/res/qml/common/mainwidget.qml
@@ -80,6 +80,11 @@ Rectangle {
visible: false
}
+ property BindingsPage bindingsPage: BindingsPage {
+ stackView: mainView
+ visible: false
+ }
+
StackView {
id: mainView
anchors.fill: parent
diff --git a/src/res/resources.qrc b/src/res/resources.qrc
index 6fb7946..22cbb86 100644
--- a/src/res/resources.qrc
+++ b/src/res/resources.qrc
@@ -17,4 +17,7 @@
img/audio/media_keys/outline_skip_previous_white_24dp.svg
img/audio/media_keys/outline_stop_white_24dp.svg
+
+ img/bindings/bindings.png
+
\ No newline at end of file
diff --git a/src/tabcontrollers/MoveCenterTabController.cpp b/src/tabcontrollers/MoveCenterTabController.cpp
index bb7d200..017d3f3 100644
--- a/src/tabcontrollers/MoveCenterTabController.cpp
+++ b/src/tabcontrollers/MoveCenterTabController.cpp
@@ -1323,6 +1323,11 @@ void MoveCenterTabController::reset()
m_offsetY = 0.0f;
m_offsetZ = 0.0f;
m_rotation = 0;
+ m_lastControllerPosition[0] = 0.0f;
+ m_lastControllerPosition[1] = 0.0f;
+ m_lastControllerPosition[2] = 0.0f;
+ m_lastMoveHand = vr::TrackedControllerRole_Invalid;
+ m_lastRotateHand = vr::TrackedControllerRole_Invalid;
applyChaperoneResetData();
emit offsetXChanged( m_offsetX );
emit offsetYChanged( m_offsetY );
@@ -2546,6 +2551,14 @@ void MoveCenterTabController::updateHandDrag(
// offset is un-rotated coordinates
+ // prevent positional glitches from exceeding max openvr offset clamps.
+ // We do this by detecting a drag larger than 100m in a single frame.
+ if ( abs( diff[0] ) > 100.0 || abs( diff[1] ) > 100.0
+ || abs( diff[2] ) > 100.0 )
+ {
+ reset();
+ }
+
// prevents updating if axis movement is locked
if ( !m_lockXToggle )
{
@@ -2863,7 +2876,8 @@ void MoveCenterTabController::updateSpace( bool forceUpdate )
LOG( INFO ) << "GetWorkingStandingZeroPoseToRawTrackingPose";
outputLogHmdMatrix( standingZero );
reset();
- LOG( INFO ) << "-Resetting offsets-";
+ parent->m_chaperoneTabController.applyAutosavedProfile();
+ LOG( INFO ) << "-Resetting to autosaved chaperone profile-";
return;
}
if ( abs( offsetUniverseCenterXyz[1] ) > k_maxOpenvrWorkingSetOffest
@@ -2879,7 +2893,8 @@ void MoveCenterTabController::updateSpace( bool forceUpdate )
LOG( INFO ) << "GetWorkingStandingZeroPoseToRawTrackingPose";
outputLogHmdMatrix( standingZero );
reset();
- LOG( INFO ) << "-Resetting offsets-";
+ parent->m_chaperoneTabController.applyAutosavedProfile();
+ LOG( INFO ) << "-Resetting to autosaved chaperone profile-";
return;
}
if ( abs( offsetUniverseCenterXyz[2] ) > k_maxOpenvrWorkingSetOffest
@@ -2895,7 +2910,8 @@ void MoveCenterTabController::updateSpace( bool forceUpdate )
LOG( INFO ) << "GetWorkingStandingZeroPoseToRawTrackingPose";
outputLogHmdMatrix( standingZero );
reset();
- LOG( INFO ) << "-Resetting offsets-";
+ parent->m_chaperoneTabController.applyAutosavedProfile();
+ LOG( INFO ) << "-Resetting to autosaved chaperone profile-";
return;
}
@@ -3009,7 +3025,8 @@ void MoveCenterTabController::updateSpace( bool forceUpdate )
LOG( INFO ) << "GetWorkingStandingZeroPoseToRawTrackingPose";
outputLogHmdMatrix( standingZero );
reset();
- LOG( INFO ) << "-Resetting offsets-";
+ parent->m_chaperoneTabController.applyAutosavedProfile();
+ LOG( INFO ) << "-Resetting to autosaved chaperone profile-";
return;
}
if ( abs( offsetUniverseCenterXyz[1] ) > k_maxOpenvrCommitOffset )
@@ -3023,7 +3040,8 @@ void MoveCenterTabController::updateSpace( bool forceUpdate )
LOG( INFO ) << "GetWorkingStandingZeroPoseToRawTrackingPose";
outputLogHmdMatrix( standingZero );
reset();
- LOG( INFO ) << "-Resetting offsets-";
+ parent->m_chaperoneTabController.applyAutosavedProfile();
+ LOG( INFO ) << "-Resetting to autosaved chaperone profile-";
return;
}
if ( abs( offsetUniverseCenterXyz[2] ) > k_maxOpenvrCommitOffset )
@@ -3037,7 +3055,8 @@ void MoveCenterTabController::updateSpace( bool forceUpdate )
LOG( INFO ) << "GetWorkingStandingZeroPoseToRawTrackingPose";
outputLogHmdMatrix( standingZero );
reset();
- LOG( INFO ) << "-Resetting offsets-";
+ parent->m_chaperoneTabController.applyAutosavedProfile();
+ LOG( INFO ) << "-Resetting to autosaved chaperone profile-";
return;
}
vr::VRChaperoneSetup()->CommitWorkingCopy(