diff --git a/Readme.md b/Readme.md
index d4ec599..a96964f 100644
--- a/Readme.md
+++ b/Readme.md
@@ -1,3 +1,4 @@
+
 

@@ -23,6 +24,7 @@
> * [Space Fix Page](#space_fix_page)
> * [Audio Page](#audio_page)
> * [Utilities Page](#utilities_page)
+ > * [Desktop Overlay Page](#desktop_overlay_page)
> * [Statistics Page](#statistics_page)
> * [Settings Page](#settings_page)
> * [How To Compile](#how_to_compile)
@@ -329,6 +331,19 @@ Allows users to temporarily move and rotate the center of the playspace. This al
- **Media Control Keys:** Allows controlling a media player through the media keys. This is the same as having a keyboard with media keys and then pressing them. Should support most common media players.
+
+## - Desktop Overlay Page
+
+
+
+-**Overlay Width:** The width of the overlay in meters. Multi screen setups need larger values to see any difference.
+
+-**Up/Down Translation:** Moves the overlay up and down.
+
+-**Forwards/Backwards Translation:** Moves the overlay forwards and backwards.
+
+-**Left/Right Translation:** Moves the overlay left or right.
+
## - Statistics Page:
diff --git a/build_scripts/qt/resources.pri b/build_scripts/qt/resources.pri
index 236dda7..f0c32c9 100644
--- a/build_scripts/qt/resources.pri
+++ b/build_scripts/qt/resources.pri
@@ -32,7 +32,7 @@ DISTFILES += \
src/res/qml/utilities_page/* \
src/res/qml/utilities_page/media_keys/* \
src/res/qml/utilities_page/keyboard_utils/* \
- src/res/qml/utilities_page/desktop_size/* \
+ src/res/qml/desktop_overlay_page/desktop_size/* \
src/res/qml/utilities_page/alarm_clock/* \
src/res/qml/audio_page/dialog_boxes/* \
src/res/qml/audio_page/device_selector/* \
@@ -42,5 +42,9 @@ DISTFILES += \
src/res/qml/video_page/* \
src/res/qml/video_page/brightness/* \
src/res/qml/common/* \
+ src/res/qml/desktop_overlay_page/* \
+ 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 \
RC_FILE = src/res/icon.rc
diff --git a/build_scripts/qt/sources.pri b/build_scripts/qt/sources.pri
index 317fe27..5f20f18 100644
--- a/build_scripts/qt/sources.pri
+++ b/build_scripts/qt/sources.pri
@@ -13,11 +13,11 @@ SOURCES += src/main.cpp\
src/tabcontrollers/VideoTabController.cpp \
src/utils/ChaperoneUtils.cpp \
src/tabcontrollers/audiomanager/AudioManagerDummy.cpp \
- src/tabcontrollers/keyboardinput/KeyboardInputDummy.cpp \
src/openvr/openvr_init.cpp \
src/openvr/ivrinput.cpp \
src/utils/setup.cpp \
- src/utils/paths.cpp
+ src/utils/paths.cpp \
+ src/openvr/overlay_utils.cpp
HEADERS += src/overlaycontroller.h \
src/tabcontrollers/AudioTabController.h \
@@ -32,12 +32,11 @@ HEADERS += src/overlaycontroller.h \
src/tabcontrollers/VideoTabController.h \
src/tabcontrollers/AudioManager.h \
src/tabcontrollers/PttController.h \
- src/tabcontrollers/KeyboardInput.h \
+ src/tabcontrollers/keyboardinput/KeyboardInput.h \
src/utils/Matrix.h \
src/utils/ChaperoneUtils.h \
src/quaternion/quaternion.h \
src/tabcontrollers/audiomanager/AudioManagerDummy.h \
- src/tabcontrollers/keyboardinput/KeyboardInputDummy.h \
src/openvr/openvr_init.h \
src/openvr/ivrinput_action.h \
src/openvr/ivrinput_manifest.h \
@@ -45,13 +44,17 @@ HEADERS += src/overlaycontroller.h \
src/openvr/ivrinput_input_source.h \
src/openvr/ivrinput.h \
src/utils/setup.h \
- src/utils/paths.h
+ src/utils/paths.h \
+ src/openvr/overlay_utils.h
win32 {
SOURCES += src/tabcontrollers/audiomanager/AudioManagerWindows.cpp \
src/tabcontrollers/keyboardinput/KeyboardInputWindows.cpp
- HEADERS += src/tabcontrollers/audiomanager/AudioManagerWindows.h \
- src/tabcontrollers/keyboardinput/KeyboardInputWindows.h
+ HEADERS += src/tabcontrollers/audiomanager/AudioManagerWindows.h
+}
+
+!win32 {
+ SOURCES += src/tabcontrollers/keyboardinput/KeyboardInputDummy.cpp
}
win32-msvc {
diff --git a/docs/screenshots/DesktopOverlayPage.png b/docs/screenshots/DesktopOverlayPage.png
new file mode 100644
index 0000000..326d4e4
Binary files /dev/null and b/docs/screenshots/DesktopOverlayPage.png differ
diff --git a/docs/screenshots/UtilitiesPage.png b/docs/screenshots/UtilitiesPage.png
index 6cbe38f..40d1fab 100644
Binary files a/docs/screenshots/UtilitiesPage.png and b/docs/screenshots/UtilitiesPage.png differ
diff --git a/src/openvr/overlay_utils.cpp b/src/openvr/overlay_utils.cpp
new file mode 100644
index 0000000..7d71315
--- /dev/null
+++ b/src/openvr/overlay_utils.cpp
@@ -0,0 +1,192 @@
+#include "overlay_utils.h"
+#include "../overlaycontroller.h"
+
+namespace overlay
+{
+vr::VROverlayHandle_t getOverlayHandle()
+{
+ vr::VROverlayHandle_t pOverlayHandle;
+ vr::VROverlay()->FindOverlay( strings::overlaykey, &pOverlayHandle );
+ return pOverlayHandle;
+}
+
+vr::HmdMatrix34_t getDesktopOverlayPositions()
+{
+ vr::HmdMatrix34_t currentPosition = {};
+
+ const auto overlayHandle = getOverlayHandle();
+
+ vr::ETrackingUniverseOrigin origin
+ = vr::ETrackingUniverseOrigin::TrackingUniverseStanding;
+
+ vr::VROverlay()->GetOverlayTransformAbsolute(
+ overlayHandle, &origin, ¤tPosition );
+
+ return currentPosition;
+}
+
+void setDesktopOverlayPositions( vr::HmdMatrix34_t& positions )
+{
+ const auto overlayHandle = getOverlayHandle();
+
+ // We need to make sure we get the same Universe Origin as before.
+ vr::HmdMatrix34_t currentPosition = {};
+ vr::ETrackingUniverseOrigin origin
+ = vr::ETrackingUniverseOrigin::TrackingUniverseStanding;
+ vr::VROverlay()->GetOverlayTransformAbsolute(
+ overlayHandle, &origin, ¤tPosition );
+
+ vr::VROverlay()->SetOverlayTransformAbsolute(
+ overlayHandle, origin, &positions );
+}
+
+void setDesktopOverlayWidth( double width )
+{
+ const auto overlayHandle = getOverlayHandle();
+ auto error = vr::VROverlay()->SetOverlayWidthInMeters(
+ overlayHandle, static_cast( width ) );
+ if ( error != vr::VROverlayError_None )
+ {
+ LOG( ERROR ) << "Could not modify overlay width of \""
+ << strings::overlaykey << "\": "
+ << vr::VROverlay()->GetOverlayErrorNameFromEnum( error );
+ }
+}
+
+void setSettingsToValue( const std::string setting, const double value )
+{
+ QSettings settings( QSettings::Format::IniFormat,
+ QSettings::Scope::UserScope,
+ application_strings::applicationOrganizationName,
+ application_strings::applicationName );
+ settings.beginGroup( strings::settingsGroupName );
+ settings.setValue( setting.c_str(), value );
+ settings.endGroup();
+}
+
+overlay::DesktopOverlay::DesktopOverlay()
+{
+ QSettings settings( QSettings::Format::IniFormat,
+ QSettings::Scope::UserScope,
+ application_strings::applicationOrganizationName,
+ application_strings::applicationName );
+
+ LOG( INFO ) << settings.fileName();
+ settings.beginGroup( strings::settingsGroupName );
+ m_width = settings.value( strings::widthSettingsName, defaultOverlayWidth )
+ .toDouble();
+ m_forwardsMovement
+ = settings.value( strings::forwardsSettingsName, defaultMovement )
+ .toDouble();
+ m_rightMovement
+ = settings.value( strings::rightMovementSettingsName, defaultMovement )
+ .toDouble();
+ m_upMovement
+ = settings.value( strings::upMovementSettingsName, defaultMovement )
+ .toDouble();
+ settings.endGroup();
+}
+
+void DesktopOverlay::update()
+{
+ setDesktopOverlayWidth( m_width );
+
+ auto positionMatrix = getDesktopOverlayPositions();
+
+ auto changedPositions = getChangedMatrix( positionMatrix );
+
+ setDesktopOverlayPositions( changedPositions );
+}
+
+bool DesktopOverlay::isAvailable() const
+{
+ vr::VROverlayHandle_t pOverlayHandle = 0;
+ auto error
+ = vr::VROverlay()->FindOverlay( strings::overlaykey, &pOverlayHandle );
+ if ( error != vr::VROverlayError_None )
+ {
+ LOG( INFO ) << "Could not find overlay \"" << strings::overlaykey
+ << "\": "
+ << vr::VROverlay()->GetOverlayErrorNameFromEnum( error );
+ return false;
+ }
+ return true;
+}
+
+void overlay::DesktopOverlay::setWidth( double width )
+{
+ if ( width < 0.01 )
+ {
+ width = 0.01;
+ }
+
+ setSettingsToValue( strings::widthSettingsName, width );
+ m_width = width;
+}
+
+double DesktopOverlay::getCurrentWidth() const noexcept
+{
+ return m_width;
+}
+
+void DesktopOverlay::setRightMovement( double distance )
+{
+ setSettingsToValue( strings::rightMovementSettingsName, distance );
+ m_rightMovement = distance;
+}
+
+double DesktopOverlay::getCurrentRightMovement() const noexcept
+{
+ return m_rightMovement;
+}
+
+void DesktopOverlay::setForwardsMovement( double distance )
+{
+ setSettingsToValue( strings::forwardsSettingsName, distance );
+ m_forwardsMovement = distance;
+}
+
+double DesktopOverlay::getCurrentForwardsMovement() const noexcept
+{
+ return m_forwardsMovement;
+}
+
+void DesktopOverlay::setHeight( double height )
+{
+ setSettingsToValue( strings::upMovementSettingsName, height );
+ m_upMovement = height;
+}
+
+double DesktopOverlay::getCurrentHeight() const noexcept
+{
+ return m_upMovement;
+}
+
+vr::HmdMatrix34_t
+ DesktopOverlay::getChangedMatrix( vr::HmdMatrix34_t& matrix ) const noexcept
+{
+ auto position = QVector3D( matrix.m[0][3], matrix.m[1][3], matrix.m[2][3] );
+
+ const auto screenRight
+ = QVector3D( matrix.m[0][0], matrix.m[1][0], matrix.m[2][0] );
+
+ const auto screenForwards
+ = QVector3D( matrix.m[0][2], matrix.m[1][2], matrix.m[2][2] );
+
+ const auto screenUp
+ = QVector3D( matrix.m[0][1], matrix.m[1][1], matrix.m[2][1] );
+
+ position += ( static_cast( m_rightMovement ) * screenRight );
+
+ position += ( static_cast( m_forwardsMovement ) * screenForwards );
+
+ position += ( static_cast( m_upMovement ) * screenUp );
+
+ matrix.m[0][3] = position.x();
+ matrix.m[1][3] = position.y();
+ matrix.m[2][3] = position.z();
+
+ return matrix;
+}
+
+} // namespace overlay
diff --git a/src/openvr/overlay_utils.h b/src/openvr/overlay_utils.h
new file mode 100644
index 0000000..03981b3
--- /dev/null
+++ b/src/openvr/overlay_utils.h
@@ -0,0 +1,68 @@
+#pragma once
+#include
+#include
+#include
+#include
+#include
+#include
+
+void outputMat();
+void transformMat();
+
+namespace overlay
+{
+namespace strings
+{
+ constexpr auto overlaykey = "valve.steam.desktop";
+ constexpr auto settingsGroupName = "utilitiesSettings";
+ constexpr auto widthSettingsName = "desktopWidth";
+ constexpr auto forwardsSettingsName = "desktopForwardsMovement";
+ constexpr auto rightMovementSettingsName = "desktopRightMovement";
+ constexpr auto upMovementSettingsName = "desktopUpMovement";
+ constexpr auto positionSettingsName = "desktopOverlayPosition";
+} // namespace strings
+
+constexpr auto defaultOverlayWidth = 4.0;
+constexpr auto defaultMovement = 0.0;
+constexpr auto defaultWidth = 1.0;
+
+class DesktopOverlay : public QObject
+{
+ Q_OBJECT
+public:
+ Q_PROPERTY( double rightMovement READ getCurrentRightMovement()
+ WRITE setRightMovement )
+ Q_PROPERTY( double forwardsMovement READ getCurrentForwardsMovement WRITE
+ setForwardsMovement )
+ Q_PROPERTY( double width READ getCurrentWidth WRITE setWidth )
+ Q_PROPERTY( double height READ getCurrentHeight WRITE setHeight )
+
+ DesktopOverlay();
+
+ Q_INVOKABLE void update();
+
+ bool isAvailable() const;
+
+ void setWidth( double width );
+ double getCurrentWidth() const noexcept;
+
+ void setRightMovement( double distance );
+ double getCurrentRightMovement() const noexcept;
+
+ void setForwardsMovement( double distance );
+ double getCurrentForwardsMovement() const noexcept;
+
+ void setHeight( double height );
+ double getCurrentHeight() const noexcept;
+
+private:
+ vr::HmdMatrix34_t getChangedMatrix( vr::HmdMatrix34_t& matrix ) const
+ noexcept;
+
+ double m_width = defaultOverlayWidth;
+ double m_forwardsMovement = defaultMovement;
+ double m_rightMovement = defaultMovement;
+ double m_upMovement = defaultMovement;
+};
+
+} // namespace overlay
diff --git a/src/overlaycontroller.cpp b/src/overlaycontroller.cpp
index 07d7f35..092b124 100644
--- a/src/overlaycontroller.cpp
+++ b/src/overlaycontroller.cpp
@@ -20,6 +20,7 @@
#include
#include
#include "utils/Matrix.h"
+#include "openvr/overlay_utils.h"
// application namespace
namespace advsettings
@@ -262,6 +263,16 @@ OverlayController::OverlayController( bool desktopMode,
QQmlEngine::setObjectOwnership(obj, QQmlEngine::CppOwnership);
return obj;
});
+ qmlRegisterSingletonType(
+ qmlSingletonImportName,
+ 1,
+ 0,
+ "DesktopOverlay",
+ []( QQmlEngine*, QJSEngine* ) {
+ QObject* obj = &( objectAddress->m_desktopOverlay );
+ QQmlEngine::setObjectOwnership( obj, QQmlEngine::CppOwnership );
+ return obj;
+ } );
}
OverlayController::~OverlayController()
@@ -711,7 +722,7 @@ void OverlayController::mainEventLoop()
LOG( INFO ) << "Received quit request.";
vr::VRSystem()->AcknowledgeQuit_Exiting(); // Let us buy some
// time just in case
- m_moveCenterTabController.reset();
+ m_moveCenterTabController.shutdown();
// Un-mute mic before Exiting VR, as it is set at system level Not
// Vr level.
m_audioTabController.setMicMuted( false, false );
@@ -727,6 +738,7 @@ void OverlayController::mainEventLoop()
case vr::VREvent_DashboardActivated:
{
LOG( DEBUG ) << "Dashboard activated";
+ m_desktopOverlay.update();
m_dashboardVisible = true;
}
break;
@@ -748,6 +760,13 @@ void OverlayController::mainEventLoop()
}
break;
+ case vr::VREvent_SeatedZeroPoseReset:
+ {
+ m_moveCenterTabController.incomingSeatedReset();
+ LOG( INFO ) << "Game Triggered Seated Zero-Position Reset";
+ }
+ break;
+
// Multiple ChaperoneUniverseHasChanged are often emitted at the
// same time (some with a little bit of delay) There is no sure way
// to recognize redundant events, we can only exclude redundant
diff --git a/src/overlaycontroller.h b/src/overlaycontroller.h
index d4cae12..4142b7f 100644
--- a/src/overlaycontroller.h
+++ b/src/overlaycontroller.h
@@ -40,6 +40,7 @@
#include "tabcontrollers/VideoTabController.h"
#include "openvr/ivrinput.h"
+#include "openvr/overlay_utils.h"
namespace application_strings
{
@@ -61,7 +62,7 @@ namespace advsettings
// Avoid setting values to the same numbers.
constexpr int k_audioSettingsUpdateCounter = 89;
constexpr int k_chaperoneSettingsUpdateCounter = 101;
-constexpr int k_moveCenterSettingsUpdateCounter = 149;
+constexpr int k_moveCenterSettingsUpdateCounter = 83;
constexpr int k_reviveSettingsUpdateCounter = 139;
constexpr int k_settingsTabSettingsUpdateCounter = 157;
constexpr int k_steamVrSettingsUpdateCounter = 97;
@@ -123,6 +124,7 @@ public: // I know it's an ugly hack to make them public to enable external
ReviveTabController m_reviveTabController;
UtilitiesTabController m_utilitiesTabController;
VideoTabController m_videoTabController;
+ overlay::DesktopOverlay m_desktopOverlay;
private:
QPoint getMousePositionForEvent( vr::VREvent_Mouse_t mouse );
diff --git a/src/res/qml/PlayspacePage.qml b/src/res/qml/PlayspacePage.qml
index a762f4f..f0b6e9c 100644
--- a/src/res/qml/PlayspacePage.qml
+++ b/src/res/qml/PlayspacePage.qml
@@ -340,6 +340,30 @@ MyStackViewPage {
}
}
+ Item {
+ Layout.fillWidth: true
+ }
+
+ MyPushButton {
+ id: spaceLogMatrices
+ Layout.preferredWidth: 250
+ visible: MoveCenterTabController.showLogMatricesButton
+ text: "Log Matrices"
+ onClicked: {
+ MoveCenterTabController.outputLogPoses()
+ }
+ }
+
+ MyPushButton {
+ id: spaceSeatedRecenter
+ Layout.preferredWidth: 250
+ visible: false
+ text: "Seated Recenter"
+ onClicked: {
+ MoveCenterTabController.updateSeatedResetData()
+ }
+ }
+
}
}
@@ -356,19 +380,14 @@ MyStackViewPage {
lockXToggle.checked = MoveCenterTabController.lockXToggle
lockYToggle.checked = MoveCenterTabController.lockYToggle
lockZToggle.checked = MoveCenterTabController.lockZToggle
+ spaceLogMatrices.visible = MoveCenterTabController.showLogMatricesButton
if (MoveCenterTabController.trackingUniverse === 0) {
spaceModeText.text = "Sitting"
- spaceRotationPlusButton.enabled = false
- spaceRotationMinusButton.enabled = false
- spaceRotationSlider.enabled = false
- spaceRotationText.text = "-"
+ spaceSeatedRecenter.visible = true
} else if (MoveCenterTabController.trackingUniverse === 1) {
spaceModeText.text = "Standing"
- spaceRotationPlusButton.enabled = true
- spaceRotationMinusButton.enabled = true
- spaceRotationSlider.enabled = true
- spaceRotationText.text = "0°"
+ spaceSeatedRecenter.visible = false
} else {
spaceModeText.text = "Unknown(" + MoveCenterTabController.trackingUniverse + ")"
}
@@ -407,16 +426,10 @@ MyStackViewPage {
onTrackingUniverseChanged: {
if (MoveCenterTabController.trackingUniverse === 0) {
spaceModeText.text = "Sitting"
- spaceRotationPlusButton.enabled = false
- spaceRotationMinusButton.enabled = false
- spaceRotationSlider.enabled = false
- spaceRotationText.text = "-"
+ spaceSeatedRecenter.visible = true
} else if (MoveCenterTabController.trackingUniverse === 1) {
spaceModeText.text = "Standing"
- spaceRotationPlusButton.enabled = true
- spaceRotationMinusButton.enabled = true
- spaceRotationSlider.enabled = true
- spaceRotationText.text = "0°"
+ spaceSeatedRecenter.visible = false
} else {
spaceModeText.text = "Unknown(" + MoveCenterTabController.trackingUniverse + ")"
}
diff --git a/src/res/qml/RootPage.qml b/src/res/qml/RootPage.qml
index 615bf0a..1d1e22d 100644
--- a/src/res/qml/RootPage.qml
+++ b/src/res/qml/RootPage.qml
@@ -115,6 +115,17 @@ MyStackViewPage {
}
}
+ MyPushButton {
+ id: desktopOverlayButton
+ activationSoundEnabled: false
+ text: "Desktop Overlay"
+ Layout.fillWidth: true
+ onClicked: {
+ MyResources.playFocusChangedSound()
+ mainView.push(desktopOverlayPage)
+ }
+ }
+
MyPushButton {
id: statisticsButton
activationSoundEnabled: false
diff --git a/src/res/qml/SettingsPage.qml b/src/res/qml/SettingsPage.qml
index 79eb375..6fd4b17 100644
--- a/src/res/qml/SettingsPage.qml
+++ b/src/res/qml/SettingsPage.qml
@@ -26,6 +26,14 @@ MyStackViewPage {
}
}
+ MyToggleButton {
+ id: allowExternalEditsToggle
+ text: "Allow External App Chaperone Edits (Danger)"
+ onCheckedChanged: {
+ MoveCenterTabController.setAllowExternalEdits(checked, true)
+ }
+ }
+
Item {
Layout.fillHeight: true
}
@@ -33,6 +41,7 @@ MyStackViewPage {
Component.onCompleted: {
settingsAutoStartToggle.checked = SettingsTabController.autoStartEnabled
forceReviveToggle.checked = SettingsTabController.forceRevivePage
+ allowExternalEditsToggle.checked = MoveCenterTabController.allowExternalEdits
}
Connections {
@@ -44,5 +53,12 @@ MyStackViewPage {
forceReviveToggle.checked = SettingsTabController.forceRevivePage
}
}
+
+ Connections {
+ target: MoveCenterTabController
+ onAllowExternalEditsChanged: {
+ allowExternalEditsToggle.checked = MoveCenterTabController.allowExternalEdits
+ }
+ }
}
}
diff --git a/src/res/qml/common/FullWidthSliderBox.qml b/src/res/qml/common/FullWidthSliderBox.qml
new file mode 100644
index 0000000..7129008
--- /dev/null
+++ b/src/res/qml/common/FullWidthSliderBox.qml
@@ -0,0 +1,92 @@
+import QtQuick 2.7
+import QtQuick.Controls 2.0
+import QtQuick.Layouts 1.3
+import ovras.advsettings 1.0
+
+GroupBox {
+ // Public properties
+ // Overload
+ property alias headerMessage: headerText.text
+ property alias sliderText: steamDesktopForwardText.text
+ property alias sliderValue: steamDesktopForwardSlider.value
+ property alias lowerLimit: steamDesktopForwardSlider.from
+ property alias upperLimit: steamDesktopForwardSlider.to
+
+
+ function onValueChanged(value) {
+
+ }
+
+ function onComponentComplete() {
+
+ }
+
+
+ // Private properties
+ id: sliderBox
+ Layout.fillWidth: true
+ label: MyText {
+ id: headerText
+ leftPadding: 10
+ text: "MISSING HEADER TEXT"
+ bottomPadding: -10
+ }
+ background: Rectangle {
+ color: "transparent"
+ border.color: "#ffffff"
+ radius: 8
+ }
+
+ property real sliderStepSize: 0.10
+ readonly property real rightLeftLimit: 4.0
+
+ ColumnLayout {
+ anchors.fill: parent
+
+ LineSeparator {
+ }
+
+ ColumnLayout {
+ RowLayout {
+ MyPushButton2 {
+ Layout.preferredWidth: 40
+ text: "-"
+ onClicked: {
+ steamDesktopForwardSlider.value -= sliderStepSize
+ }
+ }
+
+ MySlider {
+ id: steamDesktopForwardSlider
+ from: -rightLeftLimit
+ to: rightLeftLimit
+ stepSize: sliderStepSize
+ Layout.fillWidth: true
+ onValueChanged: {
+ sliderBox.onValueChanged(this.value)
+ }
+ }
+
+ MyPushButton2 {
+ Layout.preferredWidth: 40
+ text: "+"
+ onClicked: {
+ steamDesktopForwardSlider.value += sliderStepSize
+ }
+ }
+
+ MyTextField {
+ id: steamDesktopForwardText
+ text: "0.0"
+ keyBoardUID: 611
+ Layout.preferredWidth: 100
+ Layout.leftMargin: 10
+ horizontalAlignment: Text.AlignHCenter
+ }
+ }
+ }
+ }
+ Component.onCompleted: {
+ sliderBox.onComponentComplete()
+ }
+}
diff --git a/src/res/qml/common/mainwidget.qml b/src/res/qml/common/mainwidget.qml
index 22e62b0..31d7be5 100644
--- a/src/res/qml/common/mainwidget.qml
+++ b/src/res/qml/common/mainwidget.qml
@@ -6,6 +6,7 @@ import "../utilities_page"
import "../audio_page"
import "../motion_page"
import "../video_page"
+import "../desktop_overlay_page"
Rectangle {
id: root
@@ -76,6 +77,10 @@ Rectangle {
stackView: mainView
visible:false
}
+ property DesktopOverlayPage desktopOverlayPage: DesktopOverlayPage {
+ stackView: mainView
+ visible: false
+ }
StackView {
id: mainView
diff --git a/src/res/qml/desktop_overlay_page/DesktopOverlayPage.qml b/src/res/qml/desktop_overlay_page/DesktopOverlayPage.qml
new file mode 100644
index 0000000..ff84e79
--- /dev/null
+++ b/src/res/qml/desktop_overlay_page/DesktopOverlayPage.qml
@@ -0,0 +1,40 @@
+import QtQuick 2.7
+import QtQuick.Controls 2.0
+import QtQuick.Layouts 1.3
+import ovras.advsettings 1.0
+import "translation_left_right"
+import "translation_back_forwards"
+import "translation_up_down"
+import "desktop_size"
+import "../common"
+
+MyStackViewPage {
+ headerText: "Desktop Overlay"
+
+ content: ColumnLayout {
+ spacing: 18
+
+ MyText {
+ Layout.alignment: Qt.AlignHCenter
+ horizontalAlignment: Text.AlignHCenter
+ text: "Reopen overlay to apply."
+ }
+
+ SteamDesktopGroupBox {
+ }
+
+ SteamDesktopTranslationUpDown {
+ }
+
+ SteamDesktopTranslationBackForwards {
+ }
+
+ SteamDesktopTranslationLeftRight {
+ }
+
+ Item {
+ Layout.fillHeight: true
+ }
+
+ }
+}
diff --git a/src/res/qml/desktop_overlay_page/desktop_size/SteamDesktopGroupBox.qml b/src/res/qml/desktop_overlay_page/desktop_size/SteamDesktopGroupBox.qml
new file mode 100644
index 0000000..a9b7b95
--- /dev/null
+++ b/src/res/qml/desktop_overlay_page/desktop_size/SteamDesktopGroupBox.qml
@@ -0,0 +1,22 @@
+import QtQuick 2.7
+import QtQuick.Controls 2.0
+import QtQuick.Layouts 1.3
+import ovras.advsettings 1.0
+import "../../common"
+
+FullWidthSliderBox {
+ headerMessage: "Overlay Width"
+
+ lowerLimit: 0.0
+ upperLimit: 32.0
+ sliderStepSize: 0.5
+
+ function onValueChanged(value) {
+ DesktopOverlay.width = value
+ sliderText = value.toFixed(2)
+ }
+ function onComponentComplete() {
+ sliderValue = DesktopOverlay.width
+ }
+}
+
diff --git a/src/res/qml/desktop_overlay_page/translation_back_forwards/SteamDesktopTranslationBackForwards.qml b/src/res/qml/desktop_overlay_page/translation_back_forwards/SteamDesktopTranslationBackForwards.qml
new file mode 100644
index 0000000..be88c06
--- /dev/null
+++ b/src/res/qml/desktop_overlay_page/translation_back_forwards/SteamDesktopTranslationBackForwards.qml
@@ -0,0 +1,21 @@
+import QtQuick 2.7
+import QtQuick.Controls 2.0
+import QtQuick.Layouts 1.3
+import ovras.advsettings 1.0
+import "../../common"
+
+FullWidthSliderBox {
+ headerMessage: "Forwards/Backwards Translation"
+
+ lowerLimit: -4.0
+ upperLimit: 4.0
+ sliderStepSize: 0.10
+
+ function onValueChanged(value) {
+ DesktopOverlay.forwardsMovement = value
+ sliderText = value.toFixed(2)
+ }
+ function onComponentComplete() {
+ sliderValue = DesktopOverlay.forwardsMovement
+ }
+}
diff --git a/src/res/qml/desktop_overlay_page/translation_left_right/SteamDesktopTranslationLeftRight.qml b/src/res/qml/desktop_overlay_page/translation_left_right/SteamDesktopTranslationLeftRight.qml
new file mode 100644
index 0000000..8938bdd
--- /dev/null
+++ b/src/res/qml/desktop_overlay_page/translation_left_right/SteamDesktopTranslationLeftRight.qml
@@ -0,0 +1,21 @@
+import QtQuick 2.7
+import QtQuick.Controls 2.0
+import QtQuick.Layouts 1.3
+import ovras.advsettings 1.0
+import "../../common"
+
+FullWidthSliderBox {
+ headerMessage: "Left/Right Translation"
+
+ lowerLimit: -4.0
+ upperLimit: 4.0
+ sliderStepSize: 0.10
+
+ function onValueChanged(value) {
+ DesktopOverlay.rightMovement = value
+ sliderText = value.toFixed(2)
+ }
+ function onComponentComplete() {
+ sliderValue = DesktopOverlay.rightMovement
+ }
+}
diff --git a/src/res/qml/desktop_overlay_page/translation_up_down/SteamDesktopTranslationUpDown.qml b/src/res/qml/desktop_overlay_page/translation_up_down/SteamDesktopTranslationUpDown.qml
new file mode 100644
index 0000000..f2d9997
--- /dev/null
+++ b/src/res/qml/desktop_overlay_page/translation_up_down/SteamDesktopTranslationUpDown.qml
@@ -0,0 +1,21 @@
+import QtQuick 2.7
+import QtQuick.Controls 2.0
+import QtQuick.Layouts 1.3
+import ovras.advsettings 1.0
+import "../../common"
+
+FullWidthSliderBox {
+ headerMessage: "Up/Down Translation"
+
+ lowerLimit: -4.0
+ upperLimit: 4.0
+ sliderStepSize: 0.10
+
+ function onValueChanged(value) {
+ DesktopOverlay.height = value
+ sliderText = value.toFixed(2)
+ }
+ function onComponentComplete() {
+ sliderValue = DesktopOverlay.height
+ }
+}
diff --git a/src/res/qml/utilities_page/UtilitiesPage.qml b/src/res/qml/utilities_page/UtilitiesPage.qml
index f7ae438..bce8d48 100644
--- a/src/res/qml/utilities_page/UtilitiesPage.qml
+++ b/src/res/qml/utilities_page/UtilitiesPage.qml
@@ -4,7 +4,6 @@ import QtQuick.Layouts 1.3
import ovras.advsettings 1.0
import "media_keys"
import "alarm_clock"
-import "desktop_size"
import "keyboard_utils"
import "../common"
@@ -22,10 +21,6 @@ MyStackViewPage {
id: alarmGroupBox
}
- SteamDesktopGroupBox {
- id: steamDesktopGroupBox
- }
-
MediaControllerKeys {
id: mediaKeysGroupBox
}
diff --git a/src/res/qml/utilities_page/desktop_size/SteamDesktopGroupBox.qml b/src/res/qml/utilities_page/desktop_size/SteamDesktopGroupBox.qml
deleted file mode 100644
index b811785..0000000
--- a/src/res/qml/utilities_page/desktop_size/SteamDesktopGroupBox.qml
+++ /dev/null
@@ -1,108 +0,0 @@
-import QtQuick 2.7
-import QtQuick.Controls 2.0
-import QtQuick.Layouts 1.3
-import ovras.advsettings 1.0
-import "../../common"
-
-GroupBox {
- id: steamDesktopGroupBox
- Layout.fillWidth: true
-
- label: MyText {
- leftPadding: 10
- text: "Steam Desktop Overlay Width"
- bottomPadding: -10
- }
- background: Rectangle {
- color: "transparent"
- border.color: "#ffffff"
- radius: 8
- }
- ColumnLayout {
- anchors.fill: parent
-
- Rectangle {
- color: "#ffffff"
- height: 1
- Layout.fillWidth: true
- Layout.bottomMargin: 5
- }
-
- ColumnLayout {
- RowLayout {
- MyPushButton2 {
- id: steamDesktopWidthMinusButton
- Layout.preferredWidth: 40
- text: "-"
- onClicked: {
- steamDesktopWidthSlider.value -= 1.0
- }
- }
-
- MySlider {
- id: steamDesktopWidthSlider
- from: 0.1
- to: 32.0
- stepSize: 0.1
- value: 1.0
- Layout.fillWidth: true
- onPositionChanged: {
- var val = this.from + ( this.position * (this.to - this.from))
- steamDesktopWidthText.text = val.toFixed(1)
- }
- onValueChanged: {
- UtilitiesTabController.setSteamDesktopOverlayWidth(value, false)
- steamDesktopWidthText.text = value.toFixed(1)
- }
- }
-
- MyPushButton2 {
- id: steamDesktopWidthPlusButton
- Layout.preferredWidth: 40
- text: "+"
- onClicked: {
- steamDesktopWidthSlider.value += 1.0
- }
- }
-
- MyTextField {
- id: steamDesktopWidthText
- text: "0.0"
- keyBoardUID: 611
- Layout.preferredWidth: 100
- Layout.leftMargin: 10
- horizontalAlignment: Text.AlignHCenter
- function onInputEvent(input) {
- var val = parseFloat(input)
- if (!isNaN(val)) {
- if (val < 0.1) {
- val = 0.1
- }
- steamDesktopWidthSlider.value = val
- UtilitiesTabController.setSteamDesktopOverlayWidth(val, false)
- }
- text = UtilitiesTabController.steamDesktopOverlayWidth.toFixed(1)
- }
- }
- }
- }
- }
- Component.onCompleted: {
- steamDesktopGroupBox.visible = UtilitiesTabController.steamDesktopOverlayAvailable
- if (steamDesktopGroupBox.visible) {
- steamDesktopWidthSlider.value = UtilitiesTabController.steamDesktopOverlayWidth
- }
- }
- Connections {
- target: UtilitiesTabController
- onSteamDesktopOverlayAvailableChanged: {
- steamDesktopGroupBox.visible = UtilitiesTabController.steamDesktopOverlayAvailable
- if (steamDesktopGroupBox.visible) {
- steamDesktopWidthSlider.value = UtilitiesTabController.steamDesktopOverlayWidth
- }
- }
- onSteamDesktopOverlayWidthChanged: {
- steamDesktopWidthSlider.value = UtilitiesTabController.steamDesktopOverlayWidth
- }
- }
-}
diff --git a/src/tabcontrollers/KeyboardInput.h b/src/tabcontrollers/KeyboardInput.h
deleted file mode 100644
index a4e1ba7..0000000
--- a/src/tabcontrollers/KeyboardInput.h
+++ /dev/null
@@ -1,27 +0,0 @@
-#pragma once
-
-#include
-#include
-
-// application namespace
-namespace advsettings
-{
-class AudioTabController;
-
-class KeyboardInput
-{
-public:
- virtual ~KeyboardInput() {}
-
- virtual void sendKeyboardInput( QString input ) = 0;
- virtual void sendKeyboardEnter() = 0;
- virtual void sendKeyboardBackspace( const int count ) = 0;
- virtual void sendKeyboardAltTab() = 0;
- virtual void sendKeyboardAltEnter() = 0;
- virtual void sendMediaNextSong() = 0;
- virtual void sendMediaPreviousSong() = 0;
- virtual void sendMediaPausePlay() = 0;
- virtual void sendMediaStopSong() = 0;
-};
-
-} // namespace advsettings
diff --git a/src/tabcontrollers/MoveCenterTabController.cpp b/src/tabcontrollers/MoveCenterTabController.cpp
index c900d56..500b42f 100644
--- a/src/tabcontrollers/MoveCenterTabController.cpp
+++ b/src/tabcontrollers/MoveCenterTabController.cpp
@@ -118,6 +118,16 @@ void MoveCenterTabController::initStage1()
{
m_lockZToggle = value.toBool();
}
+ value = settings->value( "showLogMatricesButton", m_showLogMatricesButton );
+ if ( value.isValid() && !value.isNull() )
+ {
+ m_showLogMatricesButton = value.toBool();
+ }
+ value = settings->value( "allowExternalEdits", m_allowExternalEdits );
+ if ( value.isValid() && !value.isNull() )
+ {
+ m_allowExternalEdits = value.toBool();
+ }
settings->endGroup();
m_lastDragUpdateTimePoint = std::chrono::steady_clock::now();
m_lastGravityUpdateTimePoint = std::chrono::steady_clock::now();
@@ -131,6 +141,109 @@ void MoveCenterTabController::initStage2( OverlayController* var_parent,
this->widget = var_widget;
}
+void MoveCenterTabController::outputLogPoses()
+{
+ vr::TrackedDevicePose_t devicePosesStanding[vr::k_unMaxTrackedDeviceCount];
+
+ vr::VRSystem()->GetDeviceToAbsoluteTrackingPose(
+ vr::TrackingUniverseStanding,
+ 0.0f,
+ devicePosesStanding,
+ vr::k_unMaxTrackedDeviceCount );
+
+ vr::HmdMatrix34_t hmdStanding
+ = devicePosesStanding[0].mDeviceToAbsoluteTracking;
+
+ LOG( INFO ) << "HMD POSE (standing universe)";
+ outputLogHmdMatrix( hmdStanding );
+
+ vr::TrackedDevicePose_t devicePosesSeated[vr::k_unMaxTrackedDeviceCount];
+
+ vr::VRSystem()->GetDeviceToAbsoluteTrackingPose(
+ vr::TrackingUniverseSeated,
+ 0.0f,
+ devicePosesSeated,
+ vr::k_unMaxTrackedDeviceCount );
+
+ vr::HmdMatrix34_t hmdSeated
+ = devicePosesSeated[0].mDeviceToAbsoluteTracking;
+
+ LOG( INFO ) << "HMD POSE (seated universe)";
+ outputLogHmdMatrix( hmdSeated );
+
+ auto leftHand = vr::VRSystem()->GetTrackedDeviceIndexForControllerRole(
+ vr::TrackedControllerRole_LeftHand );
+ auto rightHand = vr::VRSystem()->GetTrackedDeviceIndexForControllerRole(
+ vr::TrackedControllerRole_RightHand );
+
+ vr::HmdMatrix34_t leftHandMatrix
+ = devicePosesStanding[leftHand].mDeviceToAbsoluteTracking;
+ vr::HmdMatrix34_t rightHandMatrix
+ = devicePosesStanding[rightHand].mDeviceToAbsoluteTracking;
+
+ LOG( INFO ) << "LEFT Hand Controller Pose (standing universe)";
+ outputLogHmdMatrix( leftHandMatrix );
+
+ LOG( INFO ) << "RIGHT Hand Controller Pose (standing universe)";
+ outputLogHmdMatrix( rightHandMatrix );
+
+ vr::HmdMatrix34_t standingZero;
+ vr::VRChaperoneSetup()->GetWorkingStandingZeroPoseToRawTrackingPose(
+ &standingZero );
+ LOG( INFO ) << "GetWorkingStandingZeroPoseToRawTrackingPose";
+ outputLogHmdMatrix( standingZero );
+
+ vr::HmdMatrix34_t seatedZero;
+ vr::VRChaperoneSetup()->GetWorkingSeatedZeroPoseToRawTrackingPose(
+ &seatedZero );
+ LOG( INFO ) << "GetWorkingSeatedZeroPoseToRawTrackingPose";
+ outputLogHmdMatrix( seatedZero );
+
+ vr::HmdMatrix34_t seatedZeroLive;
+ vr::VRChaperoneSetup()->GetLiveSeatedZeroPoseToRawTrackingPose(
+ &seatedZeroLive );
+ LOG( INFO ) << "GetLiveSeatedZeroPoseToRawTrackingPose";
+ outputLogHmdMatrix( seatedZeroLive );
+
+ vr::HmdMatrix34_t seatedToStandingAbsolute
+ = vr::VRSystem()->GetSeatedZeroPoseToStandingAbsoluteTrackingPose();
+ LOG( INFO ) << "GetSeatedZeroPoseToStandingAbsoluteTrackingPose";
+ outputLogHmdMatrix( seatedToStandingAbsolute );
+
+ LOG( INFO ) << "m_universeCenterForReset";
+ outputLogHmdMatrix( m_universeCenterForReset );
+
+ LOG( INFO ) << "m_seatedCenterForReset";
+ outputLogHmdMatrix( m_seatedCenterForReset );
+}
+
+void MoveCenterTabController::outputLogHmdMatrix( vr::HmdMatrix34_t hmdMatrix )
+{
+ LOG( INFO ) << hmdMatrix.m[0][0] << "\t\t\t" << hmdMatrix.m[0][1]
+ << "\t\t\t" << hmdMatrix.m[0][2] << "\t\t\t"
+ << hmdMatrix.m[0][3];
+ LOG( INFO ) << hmdMatrix.m[1][0] << "\t\t\t" << hmdMatrix.m[1][1]
+ << "\t\t\t" << hmdMatrix.m[1][2] << "\t\t\t"
+ << hmdMatrix.m[1][3];
+ LOG( INFO ) << hmdMatrix.m[2][0] << "\t\t\t" << hmdMatrix.m[2][1]
+ << "\t\t\t" << hmdMatrix.m[2][2] << "\t\t\t"
+ << hmdMatrix.m[2][3];
+
+ float atan2Yaw = std::atan2( hmdMatrix.m[0][2], hmdMatrix.m[2][2] );
+ LOG( INFO ) << "atan2 Yaw Calculation: " << atan2Yaw << "radians "
+ << ( ( static_cast( atan2Yaw )
+ * k_radiansToCentidegrees )
+ / 100 )
+ << "degrees";
+
+ vr::HmdQuaternion_t hmdQuat = quaternion::fromHmdMatrix34( hmdMatrix );
+ double hmdQuatYaw = quaternion::getYaw( hmdQuat );
+ LOG( INFO ) << "Quaternion Yaw Calculation: " << hmdQuatYaw << "radians "
+ << ( ( hmdQuatYaw * k_radiansToCentidegrees ) / 100 )
+ << "degrees";
+ LOG( INFO ) << "";
+}
+
int MoveCenterTabController::trackingUniverse() const
{
return static_cast( m_trackingUniverse );
@@ -140,7 +253,12 @@ void MoveCenterTabController::setTrackingUniverse( int value, bool notify )
{
if ( m_trackingUniverse != value )
{
- reset();
+ vr::VRChaperoneSetup()->HideWorkingSetPreview();
+ if ( !m_roomSetupModeDetected && value == vr::TrackingUniverseStanding )
+ {
+ reset();
+ }
+
m_trackingUniverse = value;
if ( notify )
{
@@ -207,11 +325,25 @@ void MoveCenterTabController::setRotation( int value, bool notify )
// Get hmd pose matrix.
vr::TrackedDevicePose_t
devicePosesForRot[vr::k_unMaxTrackedDeviceCount];
- vr::VRSystem()->GetDeviceToAbsoluteTrackingPose(
- vr::TrackingUniverseStanding,
- 0.0f,
- devicePosesForRot,
- vr::k_unMaxTrackedDeviceCount );
+
+ // source must be current universe
+ if ( m_trackingUniverse == vr::TrackingUniverseSeated )
+ {
+ vr::VRSystem()->GetDeviceToAbsoluteTrackingPose(
+ vr::TrackingUniverseSeated,
+ 0.0f,
+ devicePosesForRot,
+ vr::k_unMaxTrackedDeviceCount );
+ }
+ else
+ {
+ vr::VRSystem()->GetDeviceToAbsoluteTrackingPose(
+ vr::TrackingUniverseStanding,
+ 0.0f,
+ devicePosesForRot,
+ vr::k_unMaxTrackedDeviceCount );
+ }
+
vr::HmdMatrix34_t oldHmdPos
= devicePosesForRot[0].mDeviceToAbsoluteTracking;
@@ -626,6 +758,45 @@ void MoveCenterTabController::setLockZ( bool value, bool notify )
}
}
+bool MoveCenterTabController::showLogMatricesButton() const
+{
+ return m_showLogMatricesButton;
+}
+
+void MoveCenterTabController::setShowLogMatricesButton( bool value,
+ bool notify )
+{
+ m_showLogMatricesButton = value;
+ auto settings = OverlayController::appSettings();
+ settings->beginGroup( "playspaceSettings" );
+ settings->setValue( "showLogMatricesButton", m_showLogMatricesButton );
+ settings->endGroup();
+ settings->sync();
+ if ( notify )
+ {
+ emit showLogMatricesButtonChanged( m_showLogMatricesButton );
+ }
+}
+
+bool MoveCenterTabController::allowExternalEdits() const
+{
+ return m_allowExternalEdits;
+}
+
+void MoveCenterTabController::setAllowExternalEdits( bool value, bool notify )
+{
+ m_allowExternalEdits = value;
+ auto settings = OverlayController::appSettings();
+ settings->beginGroup( "playspaceSettings" );
+ settings->setValue( "allowExternalEdits", m_allowExternalEdits );
+ settings->endGroup();
+ settings->sync();
+ if ( notify )
+ {
+ emit allowExternalEditsChanged( m_allowExternalEdits );
+ }
+}
+
void MoveCenterTabController::modOffsetX( float value, bool notify )
{
if ( !m_lockXToggle )
@@ -662,11 +833,22 @@ void MoveCenterTabController::modOffsetZ( float value, bool notify )
}
}
+void MoveCenterTabController::shutdown()
+{
+ reset();
+ vr::VRChaperoneSetup()->HideWorkingSetPreview();
+}
+
+void MoveCenterTabController::incomingSeatedReset()
+{
+ updateSeatedResetData();
+}
+
void MoveCenterTabController::reset()
{
+ vr::VRChaperoneSetup()->HideWorkingSetPreview();
m_heightToggle = false;
emit heightToggleChanged( m_heightToggle );
- applyChaperoneResetData();
m_oldOffsetX = 0.0f;
m_oldOffsetY = 0.0f;
m_oldOffsetZ = 0.0f;
@@ -675,6 +857,7 @@ void MoveCenterTabController::reset()
m_offsetY = 0.0f;
m_offsetZ = 0.0f;
m_rotation = 0;
+ applyChaperoneResetData();
emit offsetXChanged( m_offsetX );
emit offsetYChanged( m_offsetY );
emit offsetZChanged( m_offsetZ );
@@ -700,9 +883,20 @@ void MoveCenterTabController::zeroOffsets()
emit rotationChanged( m_rotation );
updateChaperoneResetData();
m_pendingZeroOffsets = false;
+ if ( m_roomSetupModeDetected )
+ {
+ LOG( INFO ) << "room setup EXIT detected";
+ m_roomSetupModeDetected = false;
+ }
+
+ LOG( INFO ) << "SUCCESS: Chaperone Data Updated and Offsets zeroed out";
}
else
{
+ if ( !m_pendingZeroOffsets )
+ {
+ LOG( INFO ) << "PENDING: Chaperone Data Update and Offsets zeroing";
+ }
m_pendingZeroOffsets = true;
}
}
@@ -729,6 +923,46 @@ void MoveCenterTabController::clampVelocity( double* velocity )
}
}
+void MoveCenterTabController::updateSeatedResetData()
+{
+ reset();
+ vr::VRChaperoneSetup()->RevertWorkingCopy();
+ vr::TrackedDevicePose_t devicePosesStanding[vr::k_unMaxTrackedDeviceCount];
+ vr::VRSystem()->GetDeviceToAbsoluteTrackingPose(
+ vr::TrackingUniverseStanding,
+ 0.0f,
+ devicePosesStanding,
+ vr::k_unMaxTrackedDeviceCount );
+ vr::HmdMatrix34_t hmdMatrix
+ = devicePosesStanding[0].mDeviceToAbsoluteTracking;
+
+ vr::HmdQuaternion_t hmdQuat = quaternion::fromHmdMatrix34( hmdMatrix );
+ double hmdYaw = quaternion::getYaw( hmdQuat );
+ int hmdYawCentideg = static_cast( hmdYaw * k_radiansToCentidegrees );
+ // Keep angle within -18000 ~ 18000 centidegrees
+ if ( hmdYawCentideg > 18000 )
+ {
+ hmdYawCentideg -= 36000;
+ }
+ else if ( hmdYawCentideg < -18000 )
+ {
+ hmdYawCentideg += 36000;
+ }
+
+ m_seatedCenterForReset = m_universeCenterForReset;
+ m_seatedHeight = hmdMatrix.m[1][3];
+ m_seatedCenterForReset.m[1][3] += m_seatedHeight;
+
+ m_offsetX = hmdMatrix.m[0][3];
+ m_offsetY = 0.0f;
+ m_offsetZ = hmdMatrix.m[2][3];
+ m_rotation = hmdYawCentideg;
+ emit offsetXChanged( m_offsetX );
+ emit offsetYChanged( m_offsetY );
+ emit offsetZChanged( m_offsetZ );
+ emit rotationChanged( m_rotation );
+}
+
void MoveCenterTabController::updateChaperoneResetData()
{
vr::VRChaperoneSetup()->HideWorkingSetPreview();
@@ -741,50 +975,76 @@ void MoveCenterTabController::updateChaperoneResetData()
m_collisionBoundsCountForReset = currentQuadCount;
vr::VRChaperoneSetup()->GetWorkingCollisionBoundsInfo(
m_collisionBoundsForReset, ¤tQuadCount );
+
vr::VRChaperoneSetup()->GetWorkingStandingZeroPoseToRawTrackingPose(
&m_universeCenterForReset );
- float universeCenterForResetYaw = std::atan2(
- m_universeCenterForReset.m[0][2], m_universeCenterForReset.m[2][2] );
- // we want to store m_collisionBoundsForOffset as spacially relative to
- // m_universeCenterForReset, so:
+ // update seated center to standing offset by current hmd Y value.
+ m_seatedCenterForReset = m_universeCenterForReset;
+ vr::TrackedDevicePose_t devicePosesStanding[vr::k_unMaxTrackedDeviceCount];
+ vr::VRSystem()->GetDeviceToAbsoluteTrackingPose(
+ vr::TrackingUniverseStanding,
+ 0.0f,
+ devicePosesStanding,
+ vr::k_unMaxTrackedDeviceCount );
+ vr::HmdMatrix34_t hmdMatrix
+ = devicePosesStanding[0].mDeviceToAbsoluteTracking;
+ m_seatedHeight = hmdMatrix.m[1][3];
+ m_seatedCenterForReset.m[1][3] += m_seatedHeight;
- // for every quad in the chaperone bounds...
- for ( unsigned quad = 0; quad < m_collisionBoundsCountForReset; quad++ )
+ if ( m_collisionBoundsCountForReset > 0 )
{
- // at every corner in that quad...
- for ( unsigned corner = 0; corner < 4; corner++ )
- {
- // copy from m_collisionBoundsForReset
- m_collisionBoundsForOffset[quad].vCorners[corner].v[0]
- = m_collisionBoundsForReset[quad].vCorners[corner].v[0];
- m_collisionBoundsForOffset[quad].vCorners[corner].v[1]
- = m_collisionBoundsForReset[quad].vCorners[corner].v[1];
- m_collisionBoundsForOffset[quad].vCorners[corner].v[2]
- = m_collisionBoundsForReset[quad].vCorners[corner].v[2];
+ float universeCenterForResetYaw
+ = std::atan2( m_universeCenterForReset.m[0][2],
+ m_universeCenterForReset.m[2][2] );
- // unrotate by universe center's yaw
- rotateFloatCoordinates(
- m_collisionBoundsForOffset[quad].vCorners[corner].v,
- -universeCenterForResetYaw );
+ // we want to store m_collisionBoundsForOffset as spacially relative to
+ // m_universeCenterForReset, so:
+
+ // for every quad in the chaperone bounds...
+ for ( unsigned quad = 0; quad < m_collisionBoundsCountForReset; quad++ )
+ {
+ // at every corner in that quad...
+ for ( unsigned corner = 0; corner < 4; corner++ )
+ {
+ // copy from m_collisionBoundsForReset
+ m_collisionBoundsForOffset[quad].vCorners[corner].v[0]
+ = m_collisionBoundsForReset[quad].vCorners[corner].v[0];
+ m_collisionBoundsForOffset[quad].vCorners[corner].v[1]
+ = m_collisionBoundsForReset[quad].vCorners[corner].v[1];
+ m_collisionBoundsForOffset[quad].vCorners[corner].v[2]
+ = m_collisionBoundsForReset[quad].vCorners[corner].v[2];
+
+ // unrotate by universe center's yaw
+ rotateFloatCoordinates(
+ m_collisionBoundsForOffset[quad].vCorners[corner].v,
+ -universeCenterForResetYaw );
+ }
}
}
+
// update the working set preview for potential Oculus and WMR issues
- vr::VRChaperoneSetup()->ShowWorkingSetPreview();
+ // vr::VRChaperoneSetup()->ShowWorkingSetPreview();
}
void MoveCenterTabController::applyChaperoneResetData()
{
vr::VRChaperoneSetup()->HideWorkingSetPreview();
vr::VRChaperoneSetup()->RevertWorkingCopy();
- vr::VRChaperoneSetup()->SetWorkingCollisionBoundsInfo(
- m_collisionBoundsForReset, m_collisionBoundsCountForReset );
+ if ( m_collisionBoundsCountForReset > 0 )
+ {
+ vr::VRChaperoneSetup()->SetWorkingCollisionBoundsInfo(
+ m_collisionBoundsForReset, m_collisionBoundsCountForReset );
+ }
vr::VRChaperoneSetup()->SetWorkingStandingZeroPoseToRawTrackingPose(
&m_universeCenterForReset );
+ vr::VRChaperoneSetup()->SetWorkingSeatedZeroPoseToRawTrackingPose(
+ &m_seatedCenterForReset );
+
vr::VRChaperoneSetup()->CommitWorkingCopy( vr::EChaperoneConfigFile_Live );
// update the working set preview otherwise Oculus and WMR users may not see
// results of the reset
- vr::VRChaperoneSetup()->ShowWorkingSetPreview();
+ // vr::VRChaperoneSetup()->ShowWorkingSetPreview();
}
// START of drag bindings:
@@ -1492,10 +1752,14 @@ void MoveCenterTabController::saveUncommittedChaperone()
{
if ( !m_chaperoneCommitted )
{
+ // double commit... once to ensure before we HideWorkingSetPreview the
+ // working set is synced. Commit a second time as a workaround for WMR
+ // and Rift not getting the commit during active ShowWorkingSetPreview
+ vr::VRChaperoneSetup()->CommitWorkingCopy(
+ vr::EChaperoneConfigFile_Live );
+ vr::VRChaperoneSetup()->HideWorkingSetPreview();
vr::VRChaperoneSetup()->CommitWorkingCopy(
vr::EChaperoneConfigFile_Live );
- // test removal for oculus and WMR users
- // vr::VRChaperoneSetup()->HideWorkingSetPreview();
m_chaperoneCommitted = true;
}
}
@@ -1855,6 +2119,15 @@ void MoveCenterTabController::updateSpace()
return;
}
+ if ( m_allowExternalEdits && m_oldOffsetX == 0.0f && m_oldOffsetY == 0.0f
+ && m_oldOffsetZ == 0.0f && m_oldRotation == 0 )
+ {
+ vr::VRChaperoneSetup()->ReloadFromDisk( vr::EChaperoneConfigFile_Live );
+ vr::VRChaperoneSetup()->CommitWorkingCopy(
+ vr::EChaperoneConfigFile_Live );
+ updateChaperoneResetData();
+ }
+
vr::HmdMatrix34_t offsetUniverseCenter;
// set offsetUniverseCenter to the current angle
@@ -1892,6 +2165,17 @@ void MoveCenterTabController::updateSpace()
offsetUniverseCenter.m[2][3]
+= m_universeCenterForReset.m[2][2] * m_offsetZ;
+ // keep the seated origin synced with offsets if in seated mode
+ if ( m_trackingUniverse == vr::TrackingUniverseSeated )
+ {
+ vr::HmdMatrix34_t offsetSeatedCenter = offsetUniverseCenter;
+
+ offsetSeatedCenter.m[1][3] += m_seatedHeight;
+
+ vr::VRChaperoneSetup()->SetWorkingSeatedZeroPoseToRawTrackingPose(
+ &offsetSeatedCenter );
+ }
+
if ( m_adjustChaperone )
{
// make a copy of our bounds and
@@ -1950,9 +2234,14 @@ void MoveCenterTabController::updateSpace()
}
vr::VRChaperoneSetup()->SetWorkingStandingZeroPoseToRawTrackingPose(
&offsetUniverseCenter );
+
vr::VRChaperoneSetup()->ShowWorkingSetPreview();
m_chaperoneCommitted = false;
+ // loadChaperoneData( false ), false so that we don't load live data, and
+ // reference the working set instead.
+ parent->chaperoneUtils().loadChaperoneData( false );
+
m_oldOffsetX = m_offsetX;
m_oldOffsetY = m_offsetY;
m_oldOffsetZ = m_offsetZ;
@@ -1964,28 +2253,58 @@ void MoveCenterTabController::eventLoopTick(
vr::TrackedDevicePose_t* devicePoses )
{
- if ( settingsUpdateCounter >= k_moveCenterSettingsUpdateCounter )
+ // detect if room setup is running
+ if ( universe == vr::TrackingUniverseRawAndUncalibrated )
{
- if ( parent->isDashboardVisible() )
+ if ( !m_roomSetupModeDetected )
{
- setTrackingUniverse( int( universe ) );
+ m_roomSetupModeDetected = true;
+
+ // give up on any pending zero offsets so they aren't applied in the
+ // middle of room setup.
+ m_pendingZeroOffsets = false;
+
+ LOG( INFO ) << "room setup ENTRY detected";
+ vr::VRChaperoneSetup()->HideWorkingSetPreview();
+ reset();
+ vr::VRChaperoneSetup()->RevertWorkingCopy();
}
- settingsUpdateCounter = 0;
+ setTrackingUniverse( int( universe ) );
+ return;
}
- else
+
+ // detect entering seated mode
+ if ( universe == vr::TrackingUniverseSeated && !m_seatedModeDetected )
{
- settingsUpdateCounter++;
+ m_seatedModeDetected = true;
+ LOG( INFO ) << "seated mode ENTRY detected";
+ }
+
+ // detect exiting seated mode
+ if ( universe == vr::TrackingUniverseStanding && m_seatedModeDetected )
+ {
+ m_seatedModeDetected = false;
+ reset();
+ LOG( INFO ) << "seated mode EXIT detected";
}
// If we're trying to redifine the origin point, but can't becaues of bad
// chaperone calibration, we keep trying and hold off on motion features
// until we get ChaperoneCalibrationState_OK
- if ( m_pendingZeroOffsets )
+
+ // if we were in room setup, but got this far in the loop, universe is no
+ // longer raw mode and we detect room setup exit and zeroOffsets() to apply
+ // new setup.
+ if ( m_pendingZeroOffsets || m_roomSetupModeDetected )
{
zeroOffsets();
+ // m_roomSetupModeDetected is set to false in zeroOffsets() if it's
+ // successful.
}
else
{
+ setTrackingUniverse( int( universe ) );
+
// get current space rotation in radians
double angle = m_rotation * k_centidegreesToRadians;
diff --git a/src/tabcontrollers/MoveCenterTabController.h b/src/tabcontrollers/MoveCenterTabController.h
index ac1018a..b715331 100644
--- a/src/tabcontrollers/MoveCenterTabController.h
+++ b/src/tabcontrollers/MoveCenterTabController.h
@@ -68,6 +68,11 @@ class MoveCenterTabController : public QObject
requireLockYChanged )
Q_PROPERTY( bool lockZToggle READ lockZToggle WRITE setLockZ NOTIFY
requireLockZChanged )
+ Q_PROPERTY(
+ bool showLogMatricesButton READ showLogMatricesButton WRITE
+ setShowLogMatricesButton NOTIFY showLogMatricesButtonChanged )
+ Q_PROPERTY( bool allowExternalEdits READ allowExternalEdits WRITE
+ setAllowExternalEdits NOTIFY allowExternalEditsChanged )
private:
OverlayController* parent;
@@ -100,6 +105,7 @@ private:
float m_gravityFloor = 0.0f;
float m_gravityStrength = 9.8f;
float m_flingStrength = 1.0f;
+ float m_seatedHeight = 1.0f;
bool m_momentumSave = false;
bool m_lockXToggle = false;
bool m_lockYToggle = false;
@@ -138,6 +144,10 @@ private:
bool m_chaperoneCommitted = true;
bool m_pendingZeroOffsets = true;
bool m_dashWasOpenPreviousFrame = false;
+ bool m_roomSetupModeDetected = false;
+ bool m_seatedModeDetected = false;
+ bool m_showLogMatricesButton = false;
+ bool m_allowExternalEdits = false;
unsigned settingsUpdateCounter = 0;
int m_hmdRotationStatsUpdateCounter = 0;
unsigned m_dragComfortFrameSkipCounter = 0;
@@ -148,6 +158,7 @@ private:
vr::HmdQuad_t* m_collisionBoundsForReset;
uint32_t m_collisionBoundsCountForReset = 0;
vr::HmdMatrix34_t m_universeCenterForReset;
+ vr::HmdMatrix34_t m_seatedCenterForReset;
vr::HmdQuad_t* m_collisionBoundsForOffset;
void updateHmdRotationCounter( vr::TrackedDevicePose_t hmdPose,
@@ -160,6 +171,7 @@ private:
void updateChaperoneResetData();
void applyChaperoneResetData();
void saveUncommittedChaperone();
+ void outputLogHmdMatrix( vr::HmdMatrix34_t hmdMatrix );
public:
void initStage1();
@@ -190,8 +202,11 @@ public:
bool lockXToggle() const;
bool lockYToggle() const;
bool lockZToggle() const;
+ bool showLogMatricesButton() const;
+ bool allowExternalEdits() const;
double getHmdYawTotal();
void resetHmdYawTotal();
+ void incomingSeatedReset();
// actions:
void leftHandSpaceDrag( bool leftHandDragActive );
@@ -247,8 +262,13 @@ public slots:
void setLockX( bool value, bool notify = true );
void setLockY( bool value, bool notify = true );
void setLockZ( bool value, bool notify = true );
+ void setShowLogMatricesButton( bool value, bool notify = true );
+ void setAllowExternalEdits( bool value, bool notify = true );
+ void shutdown();
void reset();
+ void updateSeatedResetData();
+ void outputLogPoses();
void zeroOffsets();
signals:
@@ -275,6 +295,8 @@ signals:
void requireLockXChanged( bool value );
void requireLockYChanged( bool value );
void requireLockZChanged( bool value );
+ void showLogMatricesButtonChanged( bool value );
+ void allowExternalEditsChanged( bool value );
};
} // namespace advsettings
diff --git a/src/tabcontrollers/UtilitiesTabController.cpp b/src/tabcontrollers/UtilitiesTabController.cpp
index 8cec8d4..6b70ea4 100644
--- a/src/tabcontrollers/UtilitiesTabController.cpp
+++ b/src/tabcontrollers/UtilitiesTabController.cpp
@@ -4,37 +4,22 @@
#include "../overlaycontroller.h"
#include
#include
-#ifdef _WIN32
-# include "keyboardinput/KeyboardInputWindows.h"
-#else
-# include "keyboardinput/KeyboardInputDummy.h"
-#endif
// application namespace
namespace advsettings
{
-constexpr auto steamDesktopOverlaykey = "valve.steam.desktop";
-
void UtilitiesTabController::initStage1()
{
-#ifdef _WIN32
- keyboardInput.reset( new KeyboardInputWindows() );
-#else
- keyboardInput.reset( new KeyboardInputDummy() );
-#endif
auto settings = OverlayController::appSettings();
settings->beginGroup( "utilitiesSettings" );
auto qAlarmEnabled = settings->value( "alarmEnabled", m_alarmEnabled );
auto qAlarmIsModal = settings->value( "alarmIsModal", m_alarmIsModal );
auto qAlarmHour = settings->value( "alarmHour", 0 );
auto qAlarmMinute = settings->value( "alarmMinute", 0 );
- auto qDesktopWidth = settings->value( "desktopWidth", 4.0 );
settings->endGroup();
m_alarmEnabled = qAlarmEnabled.toBool();
m_alarmIsModal = qAlarmIsModal.toBool();
m_alarmTime = QTime( qAlarmHour.toInt(), qAlarmMinute.toInt() );
-
- setUpDesktopOverlay( qDesktopWidth.toFloat() );
}
void UtilitiesTabController::initStage2( OverlayController* var_parent,
@@ -46,44 +31,44 @@ void UtilitiesTabController::initStage2( OverlayController* var_parent,
void UtilitiesTabController::sendKeyboardInput( QString input )
{
- keyboardInput->sendKeyboardInput( input );
+ keyboardinput::sendKeyboardInput( input );
}
void UtilitiesTabController::sendKeyboardEnter()
{
- keyboardInput->sendKeyboardEnter();
+ keyboardinput::sendKeyboardEnter();
}
void UtilitiesTabController::sendKeyboardAltEnter()
{
- keyboardInput->sendKeyboardAltEnter();
+ keyboardinput::sendKeyboardAltEnter();
}
void UtilitiesTabController::sendKeyboardAltTab()
{
- keyboardInput->sendKeyboardAltTab();
+ keyboardinput::sendKeyboardAltTab();
}
void UtilitiesTabController::sendKeyboardBackspace( const int count )
{
- keyboardInput->sendKeyboardBackspace( count );
+ keyboardinput::sendKeyboardBackspace( count );
}
void UtilitiesTabController::sendMediaNextSong()
{
- keyboardInput->sendMediaNextSong();
+ keyboardinput::sendMediaNextSong();
}
void UtilitiesTabController::sendMediaPreviousSong()
{
- keyboardInput->sendMediaPreviousSong();
+ keyboardinput::sendMediaPreviousSong();
}
void UtilitiesTabController::sendMediaPausePlay()
{
- keyboardInput->sendMediaPausePlay();
+ keyboardinput::sendMediaPausePlay();
}
void UtilitiesTabController::sendMediaStopSong()
{
- keyboardInput->sendMediaStopSong();
+ keyboardinput::sendMediaStopSong();
}
bool UtilitiesTabController::alarmEnabled() const
@@ -311,42 +296,6 @@ void UtilitiesTabController::eventLoopTick()
{
if ( settingsUpdateCounter >= k_utilitiesSettingsUpdateCounter )
{
- vr::VROverlayHandle_t pOverlayHandle;
- auto error = vr::VROverlay()->FindOverlay( steamDesktopOverlaykey,
- &pOverlayHandle );
- if ( error == vr::VROverlayError_None )
- {
- if ( !m_steamDesktopOverlayAvailable )
- {
- m_steamDesktopOverlayAvailable = true;
- emit steamDesktopOverlayAvailableChanged(
- m_steamDesktopOverlayAvailable );
- }
- float width;
- error = vr::VROverlay()->GetOverlayWidthInMeters( pOverlayHandle,
- &width );
- if ( error != vr::VROverlayError_None )
- {
- LOG( ERROR )
- << "Could not read overlay width of \""
- << steamDesktopOverlaykey << "\": "
- << vr::VROverlay()->GetOverlayErrorNameFromEnum( error );
- }
- else
- {
- setSteamDesktopOverlayWidth( width, true, false );
- }
- }
- else
- {
- if ( m_steamDesktopOverlayAvailable )
- {
- m_steamDesktopOverlayAvailable = false;
- emit steamDesktopOverlayAvailableChanged(
- m_steamDesktopOverlayAvailable );
- }
- }
-
if ( m_alarmEnabled && m_alarmTime.isValid() )
{
auto now = QTime::currentTime();
@@ -558,104 +507,4 @@ void UtilitiesTabController::eventLoopTick()
}
}
-bool steamDesktopOverlayExists()
-{
- vr::VROverlayHandle_t pOverlayHandle = 0;
- auto error = vr::VROverlay()->FindOverlay( steamDesktopOverlaykey,
- &pOverlayHandle );
- if ( error != vr::VROverlayError_None )
- {
- LOG( DEBUG ) << "Could not find overlay \"" << steamDesktopOverlaykey
- << "\": "
- << vr::VROverlay()->GetOverlayErrorNameFromEnum( error );
- return false;
- }
- return true;
-}
-
-void UtilitiesTabController::setUpDesktopOverlay( float desktopWidthInMeters )
-{
- auto setOverlayVariablesSuccess = [this, desktopWidthInMeters]() {
- m_steamDesktopOverlayAvailable = true;
- setSteamDesktopOverlayWidth( desktopWidthInMeters, true, true );
- LOG( INFO ) << "Found overlay \"" << steamDesktopOverlaykey << "\".";
- };
-
- if ( steamDesktopOverlayExists() )
- {
- setOverlayVariablesSuccess();
- return;
- }
-
- constexpr auto timeBetweenAdditionalAttempts = std::chrono::seconds( 1 );
- constexpr auto maxAttempts = 7;
- for ( int attempts = 0; attempts < maxAttempts; ++attempts )
- {
- std::this_thread::sleep_for( timeBetweenAdditionalAttempts );
- if ( steamDesktopOverlayExists() )
- {
- setOverlayVariablesSuccess();
- return;
- }
- }
- LOG( INFO ) << "Could not find overlay \"" << steamDesktopOverlaykey
- << "\" after " << maxAttempts << " extra attempts.";
-}
-
-bool UtilitiesTabController::steamDesktopOverlayAvailable() const
-{
- return m_steamDesktopOverlayAvailable;
-}
-
-float UtilitiesTabController::steamDesktopOverlayWidth() const
-{
- return m_steamDesktopOverlayWidth;
-}
-
-void UtilitiesTabController::setSteamDesktopOverlayWidth( float width,
- bool notify,
- bool notifyOpenVr )
-{
- if ( std::abs( m_steamDesktopOverlayWidth - width ) > 0.01f )
- {
- m_steamDesktopOverlayWidth = width;
-
- auto settings = OverlayController::appSettings();
- settings->beginGroup( "utilitiesSettings" );
- settings->setValue( "desktopWidth", m_steamDesktopOverlayWidth );
- settings->endGroup();
-
- if ( notifyOpenVr )
- {
- vr::VROverlayHandle_t pOverlayHandle;
- auto error = vr::VROverlay()->FindOverlay( steamDesktopOverlaykey,
- &pOverlayHandle );
- if ( error != vr::VROverlayError_None )
- {
- LOG( ERROR )
- << "Could not find overlay \"" << steamDesktopOverlaykey
- << "\": "
- << vr::VROverlay()->GetOverlayErrorNameFromEnum( error );
- }
- else
- {
- error = vr::VROverlay()->SetOverlayWidthInMeters(
- pOverlayHandle, m_steamDesktopOverlayWidth );
- if ( error != vr::VROverlayError_None )
- {
- LOG( ERROR )
- << "Could not modify overlay width of \""
- << steamDesktopOverlaykey << "\": "
- << vr::VROverlay()->GetOverlayErrorNameFromEnum(
- error );
- }
- }
- }
- if ( notify )
- {
- emit steamDesktopOverlayWidthChanged( m_steamDesktopOverlayWidth );
- }
- }
-}
-
} // namespace advsettings
diff --git a/src/tabcontrollers/UtilitiesTabController.h b/src/tabcontrollers/UtilitiesTabController.h
index 7f05e3b..e97cb60 100644
--- a/src/tabcontrollers/UtilitiesTabController.h
+++ b/src/tabcontrollers/UtilitiesTabController.h
@@ -5,7 +5,7 @@
#include
#include
#include
-#include "KeyboardInput.h"
+#include "keyboardinput/KeyboardInput.h"
class QQuickWindow;
// application namespace
@@ -25,16 +25,8 @@ class UtilitiesTabController : public QObject
NOTIFY alarmTimeHourChanged )
Q_PROPERTY( int alarmTimeMinute READ alarmTimeMinute WRITE
setAlarmTimeMinute NOTIFY alarmTimeMinuteChanged )
- Q_PROPERTY(
- bool steamDesktopOverlayAvailable READ steamDesktopOverlayAvailable
- NOTIFY steamDesktopOverlayAvailableChanged )
- Q_PROPERTY(
- float steamDesktopOverlayWidth READ steamDesktopOverlayWidth WRITE
- setSteamDesktopOverlayWidth NOTIFY steamDesktopOverlayWidthChanged )
private:
- void setUpDesktopOverlay( float desktopWidthInMeters );
-
OverlayController* m_parent;
QQuickWindow* m_widget;
@@ -44,15 +36,12 @@ private:
bool m_alarmIsModal = true;
QTime m_alarmTime;
QTime m_alarmLastCheckTime;
- bool m_steamDesktopOverlayAvailable = false;
- float m_steamDesktopOverlayWidth = 4.0f;
+
vr::VROverlayHandle_t m_batteryOverlayHandles[vr::k_unMaxTrackedDeviceCount]
= { 0 };
int m_batteryState[vr::k_unMaxTrackedDeviceCount];
bool m_batteryVisible[vr::k_unMaxTrackedDeviceCount];
- std::unique_ptr keyboardInput;
-
public:
void initStage1();
void initStage2( OverlayController* var_parent, QQuickWindow* var_widget );
@@ -64,9 +53,6 @@ public:
int alarmTimeHour() const;
int alarmTimeMinute() const;
- bool steamDesktopOverlayAvailable() const;
- float steamDesktopOverlayWidth() const;
-
public slots:
void sendKeyboardInput( QString input );
void sendKeyboardEnter();
@@ -86,18 +72,11 @@ public slots:
void modAlarmTimeHour( int value, bool notify = true );
void modAlarmTimeMinute( int value, bool notify = true );
- void setSteamDesktopOverlayWidth( float width,
- bool notify = true,
- bool notifyOpenVr = true );
-
signals:
void alarmEnabledChanged( bool enabled );
void alarmIsModalChanged( bool modal );
void alarmTimeHourChanged( int hour );
void alarmTimeMinuteChanged( int min );
-
- void steamDesktopOverlayAvailableChanged( bool available );
- void steamDesktopOverlayWidthChanged( float width );
};
} // namespace advsettings
diff --git a/src/tabcontrollers/keyboardinput/KeyboardInput.h b/src/tabcontrollers/keyboardinput/KeyboardInput.h
new file mode 100644
index 0000000..d1bff88
--- /dev/null
+++ b/src/tabcontrollers/keyboardinput/KeyboardInput.h
@@ -0,0 +1,18 @@
+#pragma once
+
+#include
+#include
+
+namespace keyboardinput
+{
+void sendKeyboardInput( QString input );
+void sendKeyboardEnter();
+void sendKeyboardBackspace( const int count );
+void sendKeyboardAltTab();
+void sendKeyboardAltEnter();
+void sendMediaNextSong();
+void sendMediaPreviousSong();
+void sendMediaPausePlay();
+void sendMediaStopSong();
+
+} // namespace keyboardinput
diff --git a/src/tabcontrollers/keyboardinput/KeyboardInputDummy.cpp b/src/tabcontrollers/keyboardinput/KeyboardInputDummy.cpp
index bb3f750..8bfa9bb 100644
--- a/src/tabcontrollers/keyboardinput/KeyboardInputDummy.cpp
+++ b/src/tabcontrollers/keyboardinput/KeyboardInputDummy.cpp
@@ -1,56 +1,56 @@
-#include "KeyboardInputDummy.h"
+#include "KeyboardInput.h"
// Used to get the compiler to shut up about C4100: unreferenced formal
// parameter. The cast is to get GCC to shut up about it.
#define UNREFERENCED_PARAMETER( P ) static_cast( ( P ) )
-namespace advsettings
+namespace keyboardinput
{
-void KeyboardInputDummy::sendKeyboardInput( QString input )
+void sendKeyboardInput( QString input )
{
// noop
UNREFERENCED_PARAMETER( input );
}
-void KeyboardInputDummy::sendKeyboardEnter()
+void sendKeyboardEnter()
{
// noop
}
-void KeyboardInputDummy::sendKeyboardBackspace( const int count )
+void sendKeyboardBackspace( const int count )
{
// noop
UNREFERENCED_PARAMETER( count );
}
-void KeyboardInputDummy::sendKeyboardAltTab()
+void sendKeyboardAltTab()
{
// noop
}
-void KeyboardInputDummy::sendKeyboardAltEnter()
+void sendKeyboardAltEnter()
{
// noop
}
-void KeyboardInputDummy::sendMediaNextSong()
+void sendMediaNextSong()
{
// noop
}
-void KeyboardInputDummy::sendMediaPreviousSong()
+void sendMediaPreviousSong()
{
// noop
}
-void KeyboardInputDummy::sendMediaPausePlay()
+void sendMediaPausePlay()
{
// noop
}
-void KeyboardInputDummy::sendMediaStopSong()
+void sendMediaStopSong()
{
// noop
}
-} // namespace advsettings
+} // namespace keyboardinput
diff --git a/src/tabcontrollers/keyboardinput/KeyboardInputDummy.h b/src/tabcontrollers/keyboardinput/KeyboardInputDummy.h
deleted file mode 100644
index f67882e..0000000
--- a/src/tabcontrollers/keyboardinput/KeyboardInputDummy.h
+++ /dev/null
@@ -1,25 +0,0 @@
-#ifndef KEYBOARDINPUTDUMMY_H
-#define KEYBOARDINPUTDUMMY_H
-
-#include "../KeyboardInput.h"
-
-// application namespace
-namespace advsettings
-{
-class KeyboardInputDummy : public KeyboardInput
-{
-public:
- virtual void sendKeyboardInput( QString input ) override;
- virtual void sendKeyboardEnter() override;
- virtual void sendKeyboardBackspace( const int count ) override;
- virtual void sendKeyboardAltTab() override;
- virtual void sendKeyboardAltEnter() override;
- virtual void sendMediaNextSong() override;
- virtual void sendMediaPreviousSong() override;
- virtual void sendMediaPausePlay() override;
- virtual void sendMediaStopSong() override;
-};
-
-} // namespace advsettings
-
-#endif // KEYBOARDINPUTDUMMY_H
diff --git a/src/tabcontrollers/keyboardinput/KeyboardInputWindows.cpp b/src/tabcontrollers/keyboardinput/KeyboardInputWindows.cpp
index b43d91e..586bef5 100644
--- a/src/tabcontrollers/keyboardinput/KeyboardInputWindows.cpp
+++ b/src/tabcontrollers/keyboardinput/KeyboardInputWindows.cpp
@@ -1,8 +1,8 @@
-#include "KeyboardInputWindows.h"
+#include "KeyboardInput.h"
#include
#include "easylogging++.h"
-namespace advsettings
+namespace keyboardinput
{
/*!
Represents the state of a keyboard button press. Can be either Up or Down.
@@ -127,7 +127,7 @@ void sendKeyPressAndRelease( const WORD virtualKeyCode )
sendKeyboardInputRaw( numberOfActions, actions );
}
-void KeyboardInputWindows::sendKeyboardInput( QString input )
+void sendKeyboardInput( QString input )
{
int len = input.length();
if ( len > 0 )
@@ -202,7 +202,7 @@ void KeyboardInputWindows::sendKeyboardInput( QString input )
/*!
Sends a single Enter keypress to Windows.
*/
-void KeyboardInputWindows::sendKeyboardEnter()
+void sendKeyboardEnter()
{
sendKeyPressAndRelease( VK_RETURN );
}
@@ -211,7 +211,7 @@ void KeyboardInputWindows::sendKeyboardEnter()
Sends count amount of backspaces to Windows. count of 0 or below will do
nothing.
*/
-void KeyboardInputWindows::sendKeyboardBackspace( const int count )
+void sendKeyboardBackspace( const int count )
{
// We can only send a positive amount of key presses.
if ( count <= 0 )
@@ -232,7 +232,7 @@ Used for tabbing out of game windows blocking other programs on desktop while in
VR. At least one use case was tabbing out of a fullscreen game to be able to use
a music player.
*/
-void KeyboardInputWindows::sendKeyboardAltTab()
+void sendKeyboardAltTab()
{
constexpr auto altKey = VK_MENU;
constexpr auto tabKey = VK_TAB;
@@ -256,7 +256,7 @@ Sends an Alt + Tab combination to Windows.
Used for toggling full screen on games and various applications that appear on
the desktop.
*/
-void KeyboardInputWindows::sendKeyboardAltEnter()
+void sendKeyboardAltEnter()
{
constexpr auto altKey = VK_MENU;
constexpr auto enterKey = VK_RETURN;
@@ -277,7 +277,7 @@ void KeyboardInputWindows::sendKeyboardAltEnter()
/*!
Sends a media key Next Song button to Windows.
*/
-void KeyboardInputWindows::sendMediaNextSong()
+void sendMediaNextSong()
{
sendKeyPressAndRelease( VK_MEDIA_NEXT_TRACK );
}
@@ -285,7 +285,7 @@ void KeyboardInputWindows::sendMediaNextSong()
/*!
Sends a media key Previous Song button to Windows.
*/
-void KeyboardInputWindows::sendMediaPreviousSong()
+void sendMediaPreviousSong()
{
sendKeyPressAndRelease( VK_MEDIA_PREV_TRACK );
}
@@ -293,7 +293,7 @@ void KeyboardInputWindows::sendMediaPreviousSong()
/*!
Sends a media key Play/Pause button to Windows.
*/
-void KeyboardInputWindows::sendMediaPausePlay()
+void sendMediaPausePlay()
{
sendKeyPressAndRelease( VK_MEDIA_PLAY_PAUSE );
}
@@ -301,9 +301,9 @@ void KeyboardInputWindows::sendMediaPausePlay()
/*!
Sends a media key Stop button to Windows.
*/
-void KeyboardInputWindows::sendMediaStopSong()
+void sendMediaStopSong()
{
sendKeyPressAndRelease( VK_MEDIA_STOP );
}
-} // namespace advsettings
+} // namespace keyboardinput
diff --git a/src/tabcontrollers/keyboardinput/KeyboardInputWindows.h b/src/tabcontrollers/keyboardinput/KeyboardInputWindows.h
deleted file mode 100644
index cfed120..0000000
--- a/src/tabcontrollers/keyboardinput/KeyboardInputWindows.h
+++ /dev/null
@@ -1,25 +0,0 @@
-#ifndef KEYBOARDINPUTWINDOWS_H
-#define KEYBOARDINPUTWINDOWS_H
-
-#include "../KeyboardInput.h"
-
-// application namespace
-namespace advsettings
-{
-class KeyboardInputWindows : public KeyboardInput
-{
-public:
- virtual void sendKeyboardInput( QString input ) override;
- virtual void sendKeyboardEnter() override;
- virtual void sendKeyboardBackspace( const int count ) override;
- virtual void sendKeyboardAltTab() override;
- virtual void sendKeyboardAltEnter() override;
- virtual void sendMediaNextSong() override;
- virtual void sendMediaPreviousSong() override;
- virtual void sendMediaPausePlay() override;
- virtual void sendMediaStopSong() override;
-};
-
-} // namespace advsettings
-
-#endif // KEYBOARDINPUTWINDOWS_H
diff --git a/src/utils/ChaperoneUtils.cpp b/src/utils/ChaperoneUtils.cpp
index 3945694..63d25a6 100644
--- a/src/utils/ChaperoneUtils.cpp
+++ b/src/utils/ChaperoneUtils.cpp
@@ -74,10 +74,21 @@ float ChaperoneUtils::_getDistanceToChaperone(
return distance;
}
-void ChaperoneUtils::loadChaperoneData()
+void ChaperoneUtils::loadChaperoneData( bool fromLiveBounds )
{
std::lock_guard lock( _mutex );
- vr::VRChaperoneSetup()->GetLiveCollisionBoundsInfo( nullptr, &_quadsCount );
+
+ if ( fromLiveBounds )
+ {
+ vr::VRChaperoneSetup()->GetLiveCollisionBoundsInfo( nullptr,
+ &_quadsCount );
+ }
+ else
+ {
+ vr::VRChaperoneSetup()->GetWorkingCollisionBoundsInfo( nullptr,
+ &_quadsCount );
+ }
+
if ( _quadsCount > 0 )
{
std::unique_ptr quadsBuffer(
@@ -86,8 +97,17 @@ void ChaperoneUtils::loadChaperoneData()
_corners.reset( reinterpret_cast(
new vr::HmdQuad_t[_quadsCount] ) );
vr::HmdVector3_t* _cornersPtr = _corners.get();
- vr::VRChaperoneSetup()->GetLiveCollisionBoundsInfo( quadsBufferPtr,
- &_quadsCount );
+ if ( fromLiveBounds )
+ {
+ vr::VRChaperoneSetup()->GetLiveCollisionBoundsInfo( quadsBufferPtr,
+ &_quadsCount );
+ }
+ else
+ {
+ vr::VRChaperoneSetup()->GetWorkingCollisionBoundsInfo(
+ quadsBufferPtr, &_quadsCount );
+ }
+
for ( uint32_t i = 0; i < _quadsCount; i++ )
{
_cornersPtr[i] = quadsBufferPtr[i].vCorners[0];
diff --git a/src/utils/ChaperoneUtils.h b/src/utils/ChaperoneUtils.h
index 9a1176e..636c344 100644
--- a/src/utils/ChaperoneUtils.h
+++ b/src/utils/ChaperoneUtils.h
@@ -32,7 +32,7 @@ public:
return _mutex;
}
- void loadChaperoneData();
+ void loadChaperoneData( bool fromLiveBounds = true );
float getDistanceToChaperone( const vr::HmdVector3_t& point,
vr::HmdVector3_t* projectedPoint = nullptr,
diff --git a/src/utils/setup.cpp b/src/utils/setup.cpp
index 95c7e59..6485fd9 100644
--- a/src/utils/setup.cpp
+++ b/src/utils/setup.cpp
@@ -7,28 +7,27 @@ void mainQtMessageHandler( QtMsgType type,
const QMessageLogContext& context,
const QString& msg )
{
+ // context contains null pointers on release builds. Cast to get rid of
+ // unreferenced formal parameter warnings.
+ static_cast( context );
+
QByteArray localMsg = msg.toLocal8Bit();
switch ( type )
{
case QtDebugMsg:
- LOG( DEBUG ) << localMsg.constData() << " (" << context.file << ":"
- << context.line << ")";
+ LOG( DEBUG ) << "QTMSGH: " << localMsg.constData();
break;
case QtInfoMsg:
- LOG( INFO ) << localMsg.constData() << " (" << context.file << ":"
- << context.line << ")";
+ LOG( INFO ) << "QTMSGH: " << localMsg.constData();
break;
case QtWarningMsg:
- LOG( WARNING ) << localMsg.constData() << " (" << context.file << ":"
- << context.line << ")";
+ LOG( WARNING ) << "QTMSGH: " << localMsg.constData();
break;
case QtCriticalMsg:
- LOG( ERROR ) << localMsg.constData() << " (" << context.file << ":"
- << context.line << ")";
+ LOG( ERROR ) << "QTMSGH: " << localMsg.constData();
break;
case QtFatalMsg:
- LOG( FATAL ) << localMsg.constData() << " (" << context.file << ":"
- << context.line << ")";
+ LOG( FATAL ) << "QTMSGH: " << localMsg.constData();
break;
}
}