From f9cf2880cd8ca188f0b2e48ba92b285fe0aa513f Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Wed, 14 Mar 2018 16:48:10 +0100 Subject: [PATCH 01/16] initial work on virtual move shortcut --- src/overlaycontroller.cpp | 2 +- .../MoveCenterTabController.cpp | 42 ++++++++++++++++++- src/tabcontrollers/MoveCenterTabController.h | 6 ++- 3 files changed, 47 insertions(+), 3 deletions(-) diff --git a/src/overlaycontroller.cpp b/src/overlaycontroller.cpp index 3b095485..55fbd45a 100644 --- a/src/overlaycontroller.cpp +++ b/src/overlaycontroller.cpp @@ -453,7 +453,7 @@ void OverlayController::OnTimeoutPumpEvents() { fixFloorTabController.eventLoopTick(devicePoses); statisticsTabController.eventLoopTick(devicePoses, leftSpeed, rightSpeed); - moveCenterTabController.eventLoopTick(vr::VRCompositor()->GetTrackingSpace()); + moveCenterTabController.eventLoopTick(vr::VRCompositor()->GetTrackingSpace(), devicePoses); steamVRTabController.eventLoopTick(); chaperoneTabController.eventLoopTick(devicePoses, leftSpeed, rightSpeed, hmdSpeed); settingsTabController.eventLoopTick(); diff --git a/src/tabcontrollers/MoveCenterTabController.cpp b/src/tabcontrollers/MoveCenterTabController.cpp index 26977d22..5dd539a9 100644 --- a/src/tabcontrollers/MoveCenterTabController.cpp +++ b/src/tabcontrollers/MoveCenterTabController.cpp @@ -192,12 +192,52 @@ void MoveCenterTabController::reset() { emit rotationChanged(m_rotation); } -void MoveCenterTabController::eventLoopTick(vr::ETrackingUniverseOrigin universe) { +void MoveCenterTabController::eventLoopTick(vr::ETrackingUniverseOrigin universe, vr::TrackedDevicePose_t* devicePoses) { if (settingsUpdateCounter >= 50) { setTrackingUniverse((int)universe); settingsUpdateCounter = 0; } else { settingsUpdateCounter++; + + auto rightId = vr::VRSystem()->GetTrackedDeviceIndexForControllerRole(vr::TrackedControllerRole_RightHand); + if (rightId == vr::k_unTrackedDeviceIndexInvalid) { + return; + } + vr::TrackedDevicePose_t* rightPose = devicePoses + rightId; + vr::VRControllerState_t state; + if (vr::VRSystem()->GetControllerState(rightId, &state, sizeof(vr::VRControllerState_t))) { + if (state.ulButtonPressed & vr::ButtonMaskFromId(vr::k_EButton_ApplicationMenu)) { + float newControllerX = rightPose->mDeviceToAbsoluteTracking.m[0][3]; + float newControllerY = rightPose->mDeviceToAbsoluteTracking.m[1][3]; + float newControllerZ = rightPose->mDeviceToAbsoluteTracking.m[2][3]; + if (m_moveActive) { + float diffX = newControllerX - m_lastControllerX; + float diffY = newControllerY - m_lastControllerY; + float diffZ = newControllerZ - m_lastControllerZ; + vr::VRChaperoneSetup()->RevertWorkingCopy(); + parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 0, diffX, m_adjustChaperone, false); + parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 1, diffY, m_adjustChaperone, false); + parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 2, diffZ, m_adjustChaperone, false); + vr::VRChaperoneSetup()->CommitWorkingCopy(vr::EChaperoneConfigFile_Live); + m_offsetX += diffX; + m_offsetY += diffY; + m_offsetZ += diffZ; + } + m_moveActive = true; + m_lastControllerX = newControllerX; + m_lastControllerY = newControllerY; + m_lastControllerZ = newControllerZ; + } + else { + if (m_moveActive) { + emit offsetXChanged(m_offsetX); + emit offsetYChanged(m_offsetY); + emit offsetZChanged(m_offsetZ); + } + m_moveActive = false; + return; + } + } } } diff --git a/src/tabcontrollers/MoveCenterTabController.h b/src/tabcontrollers/MoveCenterTabController.h index 270582e5..3d05e2c5 100644 --- a/src/tabcontrollers/MoveCenterTabController.h +++ b/src/tabcontrollers/MoveCenterTabController.h @@ -31,6 +31,10 @@ class MoveCenterTabController : public QObject { float m_offsetZ = 0.0f; int m_rotation = 0; bool m_adjustChaperone = true; + bool m_moveActive = false; + float m_lastControllerX = 0.0f; + float m_lastControllerY = 0.0f; + float m_lastControllerZ = 0.0f; unsigned settingsUpdateCounter = 0; @@ -38,7 +42,7 @@ class MoveCenterTabController : public QObject { void initStage1(); void initStage2(OverlayController* parent, QQuickWindow* widget); - void eventLoopTick(vr::ETrackingUniverseOrigin universe); + void eventLoopTick(vr::ETrackingUniverseOrigin universe, vr::TrackedDevicePose_t* devicePoses); float offsetX() const; float offsetY() const; From a185c7a318f9b8865d6aff3871f725adae312f33 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Mon, 19 Mar 2018 01:47:10 +0100 Subject: [PATCH 02/16] fix jitter while moving --- src/tabcontrollers/MoveCenterTabController.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/tabcontrollers/MoveCenterTabController.cpp b/src/tabcontrollers/MoveCenterTabController.cpp index 5dd539a9..0f7a7e32 100644 --- a/src/tabcontrollers/MoveCenterTabController.cpp +++ b/src/tabcontrollers/MoveCenterTabController.cpp @@ -207,13 +207,13 @@ void MoveCenterTabController::eventLoopTick(vr::ETrackingUniverseOrigin universe vr::VRControllerState_t state; if (vr::VRSystem()->GetControllerState(rightId, &state, sizeof(vr::VRControllerState_t))) { if (state.ulButtonPressed & vr::ButtonMaskFromId(vr::k_EButton_ApplicationMenu)) { - float newControllerX = rightPose->mDeviceToAbsoluteTracking.m[0][3]; - float newControllerY = rightPose->mDeviceToAbsoluteTracking.m[1][3]; - float newControllerZ = rightPose->mDeviceToAbsoluteTracking.m[2][3]; + float newControllerX = rightPose->mDeviceToAbsoluteTracking.m[0][3] + m_offsetX; + float newControllerY= rightPose->mDeviceToAbsoluteTracking.m[1][3] + m_offsetY; + float newControllerZ= rightPose->mDeviceToAbsoluteTracking.m[2][3] + m_offsetZ; if (m_moveActive) { - float diffX = newControllerX - m_lastControllerX; - float diffY = newControllerY - m_lastControllerY; - float diffZ = newControllerZ - m_lastControllerZ; + float diffX = (newControllerX - m_lastControllerX); + float diffY = (newControllerY - m_lastControllerY); + float diffZ = (newControllerZ - m_lastControllerZ); vr::VRChaperoneSetup()->RevertWorkingCopy(); parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 0, diffX, m_adjustChaperone, false); parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 1, diffY, m_adjustChaperone, false); From df7948293d9e18efb4c8cd9528b6b9c54967a4c9 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Mon, 19 Mar 2018 20:38:19 +0100 Subject: [PATCH 03/16] deal with rotated playspace while moving --- .../MoveCenterTabController.cpp | 60 ++++++++++++++----- src/tabcontrollers/MoveCenterTabController.h | 4 +- 2 files changed, 46 insertions(+), 18 deletions(-) diff --git a/src/tabcontrollers/MoveCenterTabController.cpp b/src/tabcontrollers/MoveCenterTabController.cpp index 0f7a7e32..94bd275e 100644 --- a/src/tabcontrollers/MoveCenterTabController.cpp +++ b/src/tabcontrollers/MoveCenterTabController.cpp @@ -2,6 +2,18 @@ #include #include "../overlaycontroller.h" +void rotateCoordinates(float coordinates[3], float angle) { + if (angle == 0) { + return; + } + float s = sin(angle); + float c = cos(angle); + float newX = coordinates[0] * c - coordinates[2] * s; + float newZ = coordinates[0] * s + coordinates[2] * c; + coordinates[0] = newX; + coordinates[2] = newZ; +} + // application namespace namespace advsettings { @@ -207,26 +219,44 @@ void MoveCenterTabController::eventLoopTick(vr::ETrackingUniverseOrigin universe vr::VRControllerState_t state; if (vr::VRSystem()->GetControllerState(rightId, &state, sizeof(vr::VRControllerState_t))) { if (state.ulButtonPressed & vr::ButtonMaskFromId(vr::k_EButton_ApplicationMenu)) { - float newControllerX = rightPose->mDeviceToAbsoluteTracking.m[0][3] + m_offsetX; - float newControllerY= rightPose->mDeviceToAbsoluteTracking.m[1][3] + m_offsetY; - float newControllerZ= rightPose->mDeviceToAbsoluteTracking.m[2][3] + m_offsetZ; + float relativeControllerPosition[] = { + rightPose->mDeviceToAbsoluteTracking.m[0][3], + rightPose->mDeviceToAbsoluteTracking.m[1][3], + rightPose->mDeviceToAbsoluteTracking.m[2][3] + }; + + auto angle = m_rotation * 2 * M_PI / 360.0; + rotateCoordinates(relativeControllerPosition, -angle); + float absoluteControllerPosition[] = { + relativeControllerPosition[0] + m_offsetX, + relativeControllerPosition[1] + m_offsetY, + relativeControllerPosition[2] + m_offsetZ, + }; + if (m_moveActive) { - float diffX = (newControllerX - m_lastControllerX); - float diffY = (newControllerY - m_lastControllerY); - float diffZ = (newControllerZ - m_lastControllerZ); + float diff[3] = { + absoluteControllerPosition[0] - m_lastControllerPosition[0], + absoluteControllerPosition[1] - m_lastControllerPosition[1], + absoluteControllerPosition[2] - m_lastControllerPosition[2], + }; + + // offset is un-rotated coordinates + m_offsetX += diff[0]; + m_offsetY += diff[1]; + m_offsetZ += diff[2]; + + rotateCoordinates(diff, angle); + vr::VRChaperoneSetup()->RevertWorkingCopy(); - parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 0, diffX, m_adjustChaperone, false); - parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 1, diffY, m_adjustChaperone, false); - parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 2, diffZ, m_adjustChaperone, false); + parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 0, diff[0], m_adjustChaperone, false); + parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 1, diff[1], m_adjustChaperone, false); + parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 2, diff[2], m_adjustChaperone, false); vr::VRChaperoneSetup()->CommitWorkingCopy(vr::EChaperoneConfigFile_Live); - m_offsetX += diffX; - m_offsetY += diffY; - m_offsetZ += diffZ; } m_moveActive = true; - m_lastControllerX = newControllerX; - m_lastControllerY = newControllerY; - m_lastControllerZ = newControllerZ; + m_lastControllerPosition[0] = absoluteControllerPosition[0]; + m_lastControllerPosition[1] = absoluteControllerPosition[1]; + m_lastControllerPosition[2] = absoluteControllerPosition[2]; } else { if (m_moveActive) { diff --git a/src/tabcontrollers/MoveCenterTabController.h b/src/tabcontrollers/MoveCenterTabController.h index 3d05e2c5..debcb860 100644 --- a/src/tabcontrollers/MoveCenterTabController.h +++ b/src/tabcontrollers/MoveCenterTabController.h @@ -32,9 +32,7 @@ class MoveCenterTabController : public QObject { int m_rotation = 0; bool m_adjustChaperone = true; bool m_moveActive = false; - float m_lastControllerX = 0.0f; - float m_lastControllerY = 0.0f; - float m_lastControllerZ = 0.0f; + float m_lastControllerPosition[3]; unsigned settingsUpdateCounter = 0; From e77b2bf658816de16c29d057857994d95927baa3 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Tue, 20 Mar 2018 20:47:24 +0100 Subject: [PATCH 04/16] use external checkbox image --- bin/win64/res/qml/.gitignore | 1 + bin/win64/res/qml/MyToggleButton.qml | 27 +++++++++++++++++++-------- bin/win64/res/qml/check.svg | 1 + 3 files changed, 21 insertions(+), 8 deletions(-) create mode 100644 bin/win64/res/qml/.gitignore create mode 100644 bin/win64/res/qml/check.svg diff --git a/bin/win64/res/qml/.gitignore b/bin/win64/res/qml/.gitignore new file mode 100644 index 00000000..86950b3e --- /dev/null +++ b/bin/win64/res/qml/.gitignore @@ -0,0 +1 @@ +*.qmlc diff --git a/bin/win64/res/qml/MyToggleButton.qml b/bin/win64/res/qml/MyToggleButton.qml index 85629b6b..0dd69617 100644 --- a/bin/win64/res/qml/MyToggleButton.qml +++ b/bin/win64/res/qml/MyToggleButton.qml @@ -4,22 +4,33 @@ import "." // QTBUG-34418, singletons require explicit import to load qmldir fil CheckBox { - hoverEnabled: true - spacing: 12 + checkState: Qt.Checked + tristate: false + hoverEnabled: true + spacing: 12 indicator: Rectangle { implicitWidth: 28 implicitHeight: 28 x: parent.leftPadding y: parent.height / 2 - height / 2 - color: parent.enabled ? (parent.down ? "#e0e0e0" : "#ffffff") : "#a0a0a0" - border.width: 0 + color: parent.enabled ? (parent.down ? "#e0e0e0" : "#ffffff") : "#a0a0a0" + border.width: 0 + Path { + startX: 0 + startY: 0 + PathLine { + x: 40 + y: 40 + } + } + Image { - width: 38 - height: 38 + width: 28 + height: 28 x: (parent.width - width) / 2 y: (parent.height - height) / 2 - source: "image://default/check/#2c435d" + source: "check.svg" sourceSize.width: width sourceSize.height: height visible: parent.parent.checked @@ -36,7 +47,7 @@ CheckBox { background: Rectangle { color: "#2c435d" - opacity: parent.activeFocus ? 1.0 : 0.0 + opacity: parent.activeFocus ? 1.0 : 0 } onHoveredChanged: { diff --git a/bin/win64/res/qml/check.svg b/bin/win64/res/qml/check.svg new file mode 100644 index 00000000..6a6f37f7 --- /dev/null +++ b/bin/win64/res/qml/check.svg @@ -0,0 +1 @@ + \ No newline at end of file From d3ba00c01dfaddf834a1c59767940c27ae84d195 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Tue, 20 Mar 2018 21:53:42 +0100 Subject: [PATCH 05/16] add move shortcut settings and deal with double handed moves --- bin/win64/res/qml/PlayspacePage.qml | 44 ++++- .../MoveCenterTabController.cpp | 181 +++++++++++++----- src/tabcontrollers/MoveCenterTabController.h | 17 +- 3 files changed, 191 insertions(+), 51 deletions(-) diff --git a/bin/win64/res/qml/PlayspacePage.qml b/bin/win64/res/qml/PlayspacePage.qml index 62ad039b..1f1f4390 100644 --- a/bin/win64/res/qml/PlayspacePage.qml +++ b/bin/win64/res/qml/PlayspacePage.qml @@ -265,6 +265,40 @@ MyStackViewPage { } } + GroupBox { + Layout.fillWidth: true + + label: MyText { + leftPadding: 10 + text: "Virtual Move Shortcut" + bottomPadding: -10 + } + background: Rectangle { + color: "transparent" + border.color: "#ffffff" + radius: 8 + } + RowLayout { + anchors.fill: parent + + MyToggleButton { + id: moveShortcutRight + text: "Left Menu Button" + onCheckedChanged: { + MoveCenterTabController.moveShortcutRight = this.checked + } + } + + MyToggleButton { + id: moveShortcutLeft + text: "Right Menu Button" + onCheckedChanged: { + MoveCenterTabController.moveShortcutLeft = this.checked + } + } + } + } + MyToggleButton { id: playspaceAdjustChaperoneToggle text: "Adjust Chaperone" @@ -290,6 +324,8 @@ MyStackViewPage { playSpaceMoveYText.text = MoveCenterTabController.offsetY.toFixed(2) playSpaceMoveZText.text = MoveCenterTabController.offsetZ.toFixed(2) playspaceRotationSlider.value = MoveCenterTabController.rotation + moveShortcutRight.checked = MoveCenterTabController.moveShortcutRight; + moveShortcutLeft.checked = MoveCenterTabController.moveShortcutLeft; if (MoveCenterTabController.trackingUniverse === 0) { playspaceModeText.text = "Sitting" playSpaceRotationPlusButton.enabled = false @@ -322,7 +358,13 @@ MyStackViewPage { playspaceRotationSlider.value = MoveCenterTabController.rotation } onAdjustChaperoneChanged: { - playspaceAdjustChaperoneToggle = value + playspaceAdjustChaperoneToggle.checked = MoveCenterTabController.adjustChaperone + } + onMoveShortcutRightChanged: { + moveShortcutRight.checked = MoveCenterTabController.moveShortcutRight + } + onMoveShortcutLeftChanged: { + moveShortcutLeft.checked = MoveCenterTabController.moveShortcutLeft } onTrackingUniverseChanged: { if (MoveCenterTabController.trackingUniverse === 0) { diff --git a/src/tabcontrollers/MoveCenterTabController.cpp b/src/tabcontrollers/MoveCenterTabController.cpp index 94bd275e..85ee22a7 100644 --- a/src/tabcontrollers/MoveCenterTabController.cpp +++ b/src/tabcontrollers/MoveCenterTabController.cpp @@ -22,10 +22,18 @@ void MoveCenterTabController::initStage1() { auto settings = OverlayController::appSettings(); settings->beginGroup("playspaceSettings"); auto value = settings->value("adjustChaperone", m_adjustChaperone); - settings->endGroup(); if (value.isValid() && !value.isNull()) { m_adjustChaperone = value.toBool(); } + value = settings->value("moveShortcutRight", m_moveShortcutRightEnabled); + if (value.isValid() && !value.isNull()) { + m_moveShortcutRightEnabled = value.toBool(); + } + value = settings->value("moveShortcutLeft", m_moveShortcutLeftEnabled); + if (value.isValid() && !value.isNull()) { + m_moveShortcutLeftEnabled = value.toBool(); + } + settings->endGroup(); } void MoveCenterTabController::initStage2(OverlayController * parent, QQuickWindow * widget) { @@ -147,6 +155,39 @@ void MoveCenterTabController::setAdjustChaperone(bool value, bool notify) { } } + +bool MoveCenterTabController::moveShortcutRight() const { + return m_moveShortcutRightEnabled; +} + +void MoveCenterTabController::setMoveShortcutRight(bool value, bool notify) { + m_moveShortcutRightEnabled = value; + auto settings = OverlayController::appSettings(); + settings->beginGroup("playspaceSettings"); + settings->setValue("moveShortcutRight", m_moveShortcutRightEnabled); + settings->endGroup(); + settings->sync(); + if (notify) { + emit moveShortcutRightChanged(m_moveShortcutRightEnabled); + } +} + +bool MoveCenterTabController::moveShortcutLeft() const { + return m_moveShortcutLeftEnabled; +} + +void MoveCenterTabController::setMoveShortcutLeft(bool value, bool notify) { + m_moveShortcutLeftEnabled = value; + auto settings = OverlayController::appSettings(); + settings->beginGroup("playspaceSettings"); + settings->setValue("moveShortcutLeft", m_moveShortcutLeftEnabled); + settings->endGroup(); + settings->sync(); + if (notify) { + emit moveShortcutLeftChanged(m_moveShortcutLeftEnabled); + } +} + void MoveCenterTabController::modOffsetX(float value, bool notify) { if (m_rotation == 0) { parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 0, value, m_adjustChaperone); @@ -204,6 +245,50 @@ void MoveCenterTabController::reset() { emit rotationChanged(m_rotation); } +bool isMoveShortCutPressed(vr::ETrackedControllerRole hand) { + auto handId = vr::VRSystem()->GetTrackedDeviceIndexForControllerRole(hand); + if (handId == vr::k_unTrackedDeviceIndexInvalid) { + return false; + } + + vr::VRControllerState_t state; + if (vr::VRSystem()->GetControllerState(handId, &state, sizeof(vr::VRControllerState_t))) { + return state.ulButtonPressed & vr::ButtonMaskFromId(vr::k_EButton_ApplicationMenu); + } + + return false; +} + +vr::ETrackedControllerRole MoveCenterTabController::getMoveShortcutHand() { + auto activeHand = m_activeMoveController; + + bool rightPressed = m_moveShortcutRightEnabled && isMoveShortCutPressed(vr::TrackedControllerRole_RightHand); + bool leftPressed = m_moveShortcutLeftEnabled && isMoveShortCutPressed(vr::TrackedControllerRole_LeftHand); + + // if we start pressing the shortcut on a controller we set the active one to it + if (rightPressed && !m_moveShortcutRightPressed) { + activeHand = vr::TrackedControllerRole_RightHand; + } + if (leftPressed && !m_moveShortcutLeftPressed) { + activeHand = vr::TrackedControllerRole_LeftHand; + } + + // if we let down of a shortcut we set the active hand to any remaining pressed down hand + if (!rightPressed && m_moveShortcutRightPressed) { + activeHand = leftPressed ? vr::TrackedControllerRole_LeftHand : vr::TrackedControllerRole_Invalid; + } + if (!leftPressed && m_moveShortcutLeftPressed) { + activeHand = rightPressed ? vr::TrackedControllerRole_RightHand : vr::TrackedControllerRole_Invalid; + } + + m_activeMoveController = activeHand; + m_moveShortcutRightPressed = rightPressed; + m_moveShortcutLeftPressed = leftPressed; + + return activeHand; +} + + void MoveCenterTabController::eventLoopTick(vr::ETrackingUniverseOrigin universe, vr::TrackedDevicePose_t* devicePoses) { if (settingsUpdateCounter >= 50) { setTrackingUniverse((int)universe); @@ -211,62 +296,60 @@ void MoveCenterTabController::eventLoopTick(vr::ETrackingUniverseOrigin universe } else { settingsUpdateCounter++; - auto rightId = vr::VRSystem()->GetTrackedDeviceIndexForControllerRole(vr::TrackedControllerRole_RightHand); - if (rightId == vr::k_unTrackedDeviceIndexInvalid) { + auto oldMoveHand = m_activeMoveController; + auto newMoveHand = getMoveShortcutHand(); + auto handId = vr::VRSystem()->GetTrackedDeviceIndexForControllerRole(newMoveHand); + if (handId == vr::k_unTrackedDeviceIndexInvalid) { return; } - vr::TrackedDevicePose_t* rightPose = devicePoses + rightId; + vr::TrackedDevicePose_t* pose = devicePoses + handId; vr::VRControllerState_t state; - if (vr::VRSystem()->GetControllerState(rightId, &state, sizeof(vr::VRControllerState_t))) { - if (state.ulButtonPressed & vr::ButtonMaskFromId(vr::k_EButton_ApplicationMenu)) { - float relativeControllerPosition[] = { - rightPose->mDeviceToAbsoluteTracking.m[0][3], - rightPose->mDeviceToAbsoluteTracking.m[1][3], - rightPose->mDeviceToAbsoluteTracking.m[2][3] - }; + if (vr::VRSystem()->GetControllerState(handId, &state, sizeof(vr::VRControllerState_t))) { + float relativeControllerPosition[] = { + pose->mDeviceToAbsoluteTracking.m[0][3], + pose->mDeviceToAbsoluteTracking.m[1][3], + pose->mDeviceToAbsoluteTracking.m[2][3] + }; + + auto angle = m_rotation * 2 * M_PI / 360.0; + rotateCoordinates(relativeControllerPosition, -angle); + float absoluteControllerPosition[] = { + relativeControllerPosition[0] + m_offsetX, + relativeControllerPosition[1] + m_offsetY, + relativeControllerPosition[2] + m_offsetZ, + }; - auto angle = m_rotation * 2 * M_PI / 360.0; - rotateCoordinates(relativeControllerPosition, -angle); - float absoluteControllerPosition[] = { - relativeControllerPosition[0] + m_offsetX, - relativeControllerPosition[1] + m_offsetY, - relativeControllerPosition[2] + m_offsetZ, + if (oldMoveHand == newMoveHand) { + + float diff[3] = { + absoluteControllerPosition[0] - m_lastControllerPosition[0], + absoluteControllerPosition[1] - m_lastControllerPosition[1], + absoluteControllerPosition[2] - m_lastControllerPosition[2], }; - if (m_moveActive) { - float diff[3] = { - absoluteControllerPosition[0] - m_lastControllerPosition[0], - absoluteControllerPosition[1] - m_lastControllerPosition[1], - absoluteControllerPosition[2] - m_lastControllerPosition[2], - }; - - // offset is un-rotated coordinates - m_offsetX += diff[0]; - m_offsetY += diff[1]; - m_offsetZ += diff[2]; - - rotateCoordinates(diff, angle); - - vr::VRChaperoneSetup()->RevertWorkingCopy(); - parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 0, diff[0], m_adjustChaperone, false); - parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 1, diff[1], m_adjustChaperone, false); - parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 2, diff[2], m_adjustChaperone, false); - vr::VRChaperoneSetup()->CommitWorkingCopy(vr::EChaperoneConfigFile_Live); - } - m_moveActive = true; - m_lastControllerPosition[0] = absoluteControllerPosition[0]; - m_lastControllerPosition[1] = absoluteControllerPosition[1]; - m_lastControllerPosition[2] = absoluteControllerPosition[2]; + // offset is un-rotated coordinates + m_offsetX += diff[0]; + m_offsetY += diff[1]; + m_offsetZ += diff[2]; + + rotateCoordinates(diff, angle); + + vr::VRChaperoneSetup()->RevertWorkingCopy(); + parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 0, diff[0], m_adjustChaperone, false); + parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 1, diff[1], m_adjustChaperone, false); + parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 2, diff[2], m_adjustChaperone, false); + vr::VRChaperoneSetup()->CommitWorkingCopy(vr::EChaperoneConfigFile_Live); } - else { - if (m_moveActive) { - emit offsetXChanged(m_offsetX); - emit offsetYChanged(m_offsetY); - emit offsetZChanged(m_offsetZ); - } - m_moveActive = false; - return; + m_lastControllerPosition[0] = absoluteControllerPosition[0]; + m_lastControllerPosition[1] = absoluteControllerPosition[1]; + m_lastControllerPosition[2] = absoluteControllerPosition[2]; + }else { + if (newMoveHand == vr::TrackedControllerRole_Invalid) { + emit offsetXChanged(m_offsetX); + emit offsetYChanged(m_offsetY); + emit offsetZChanged(m_offsetZ); } + return; } } } diff --git a/src/tabcontrollers/MoveCenterTabController.h b/src/tabcontrollers/MoveCenterTabController.h index debcb860..4c356400 100644 --- a/src/tabcontrollers/MoveCenterTabController.h +++ b/src/tabcontrollers/MoveCenterTabController.h @@ -20,6 +20,8 @@ class MoveCenterTabController : public QObject { Q_PROPERTY(float offsetZ READ offsetZ WRITE setOffsetZ NOTIFY offsetZChanged) Q_PROPERTY(int rotation READ rotation WRITE setRotation NOTIFY rotationChanged) Q_PROPERTY(bool adjustChaperone READ adjustChaperone WRITE setAdjustChaperone NOTIFY adjustChaperoneChanged) + Q_PROPERTY(bool moveShortcutRight READ moveShortcutRight WRITE setMoveShortcutRight NOTIFY moveShortcutRightChanged) + Q_PROPERTY(bool moveShortcutLeft READ moveShortcutLeft WRITE setMoveShortcutLeft NOTIFY moveShortcutLeftChanged) private: OverlayController* parent; @@ -31,11 +33,17 @@ class MoveCenterTabController : public QObject { float m_offsetZ = 0.0f; int m_rotation = 0; bool m_adjustChaperone = true; - bool m_moveActive = false; + bool m_moveShortcutRightPressed = false; + bool m_moveShortcutLeftPressed = false; + vr::ETrackedControllerRole m_activeMoveController; float m_lastControllerPosition[3]; + bool m_moveShortcutRightEnabled = false; + bool m_moveShortcutLeftEnabled = false; unsigned settingsUpdateCounter = 0; + vr::ETrackedControllerRole getMoveShortcutHand(); + public: void initStage1(); void initStage2(OverlayController* parent, QQuickWindow* widget); @@ -47,6 +55,8 @@ class MoveCenterTabController : public QObject { float offsetZ() const; int rotation() const; bool adjustChaperone() const; + bool moveShortcutRight() const; + bool moveShortcutLeft() const; public slots: int trackingUniverse() const; @@ -60,6 +70,9 @@ public slots: void setAdjustChaperone(bool value, bool notify = true); + void setMoveShortcutRight(bool value, bool notify = true); + void setMoveShortcutLeft(bool value, bool notify = true); + void modOffsetX(float value, bool notify = true); void modOffsetY(float value, bool notify = true); void modOffsetZ(float value, bool notify = true); @@ -72,6 +85,8 @@ public slots: void offsetZChanged(float value); void rotationChanged(int value); void adjustChaperoneChanged(bool value); + void moveShortcutRightChanged(bool value); + void moveShortcutLeftChanged(bool value); }; } // namespace advsettings From 433d56d2b5db9cedb7a22b710fc9417b7e4e904b Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Tue, 20 Mar 2018 22:11:34 +0100 Subject: [PATCH 06/16] fix shortcut settings being wrong way around --- bin/win64/res/qml/PlayspacePage.qml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/bin/win64/res/qml/PlayspacePage.qml b/bin/win64/res/qml/PlayspacePage.qml index 1f1f4390..741121f1 100644 --- a/bin/win64/res/qml/PlayspacePage.qml +++ b/bin/win64/res/qml/PlayspacePage.qml @@ -282,18 +282,18 @@ MyStackViewPage { anchors.fill: parent MyToggleButton { - id: moveShortcutRight + id: moveShortcutLeft text: "Left Menu Button" onCheckedChanged: { - MoveCenterTabController.moveShortcutRight = this.checked + MoveCenterTabController.moveShortcutLeft = this.checked } } MyToggleButton { - id: moveShortcutLeft + id: moveShortcutRight text: "Right Menu Button" onCheckedChanged: { - MoveCenterTabController.moveShortcutLeft = this.checked + MoveCenterTabController.moveShortcutRight = this.checked } } } From f425dccd4060404c224019c7c613fe26e2c6996f Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Wed, 21 Mar 2018 21:11:41 +0100 Subject: [PATCH 07/16] fix playspace offset not updating in ui when using move shortcut --- src/tabcontrollers/MoveCenterTabController.cpp | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/tabcontrollers/MoveCenterTabController.cpp b/src/tabcontrollers/MoveCenterTabController.cpp index 85ee22a7..45d60827 100644 --- a/src/tabcontrollers/MoveCenterTabController.cpp +++ b/src/tabcontrollers/MoveCenterTabController.cpp @@ -299,7 +299,12 @@ void MoveCenterTabController::eventLoopTick(vr::ETrackingUniverseOrigin universe auto oldMoveHand = m_activeMoveController; auto newMoveHand = getMoveShortcutHand(); auto handId = vr::VRSystem()->GetTrackedDeviceIndexForControllerRole(newMoveHand); - if (handId == vr::k_unTrackedDeviceIndexInvalid) { + if (newMoveHand == vr::TrackedControllerRole_Invalid || handId == vr::k_unTrackedDeviceIndexInvalid) { + if (oldMoveHand != vr::TrackedControllerRole_Invalid) { + emit offsetXChanged(m_offsetX); + emit offsetYChanged(m_offsetY); + emit offsetZChanged(m_offsetZ); + } return; } vr::TrackedDevicePose_t* pose = devicePoses + handId; @@ -343,13 +348,6 @@ void MoveCenterTabController::eventLoopTick(vr::ETrackingUniverseOrigin universe m_lastControllerPosition[0] = absoluteControllerPosition[0]; m_lastControllerPosition[1] = absoluteControllerPosition[1]; m_lastControllerPosition[2] = absoluteControllerPosition[2]; - }else { - if (newMoveHand == vr::TrackedControllerRole_Invalid) { - emit offsetXChanged(m_offsetX); - emit offsetYChanged(m_offsetY); - emit offsetZChanged(m_offsetZ); - } - return; } } } From 5fc0cc8fcb2c26aa94188309dec920be1eab4c95 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Wed, 21 Mar 2018 21:35:53 +0100 Subject: [PATCH 08/16] offset all 3 axis in one go --- src/overlaycontroller.cpp | 33 +++++++++++++++---- src/overlaycontroller.h | 2 ++ .../MoveCenterTabController.cpp | 6 +--- 3 files changed, 30 insertions(+), 11 deletions(-) diff --git a/src/overlaycontroller.cpp b/src/overlaycontroller.cpp index 55fbd45a..e1835223 100644 --- a/src/overlaycontroller.cpp +++ b/src/overlaycontroller.cpp @@ -475,7 +475,13 @@ void OverlayController::OnTimeoutPumpEvents() { } void OverlayController::AddOffsetToUniverseCenter(vr::ETrackingUniverseOrigin universe, unsigned axisId, float offset, bool adjustBounds, bool commit) { - if (offset != 0.0f) { + float offsetArray[3] = { 0,0,0 }; + offsetArray[axisId] = offset; + AddOffsetToUniverseCenter(universe, offsetArray, adjustBounds, commit); +} + +void OverlayController::AddOffsetToUniverseCenter(vr::ETrackingUniverseOrigin universe, float offset[3], bool adjustBounds, bool commit) { + if (offset[0] != 0.0f || offset[1] != 0.0f || offset[2] != 0.0f) { if (commit) { vr::VRChaperoneSetup()->RevertWorkingCopy(); } @@ -485,16 +491,23 @@ void OverlayController::AddOffsetToUniverseCenter(vr::ETrackingUniverseOrigin un } else { vr::VRChaperoneSetup()->GetWorkingSeatedZeroPoseToRawTrackingPose(&curPos); } - curPos.m[0][3] += curPos.m[0][axisId] * offset; - curPos.m[1][3] += curPos.m[1][axisId] * offset; - curPos.m[2][3] += curPos.m[2][axisId] * offset; + for (int i = 0; i < 3; i++) { + curPos.m[0][3] += curPos.m[0][i] * offset[i]; + curPos.m[1][3] += curPos.m[1][i] * offset[i]; + curPos.m[2][3] += curPos.m[2][i] * offset[i]; + } if (universe == vr::TrackingUniverseStanding) { vr::VRChaperoneSetup()->SetWorkingStandingZeroPoseToRawTrackingPose(&curPos); } else { vr::VRChaperoneSetup()->SetWorkingSeatedZeroPoseToRawTrackingPose(&curPos); } if (adjustBounds && universe == vr::TrackingUniverseStanding) { - AddOffsetToCollisionBounds(axisId, -offset, false); + float collisionOffset[] = { + -offset[0], + -offset[1], + -offset[2] + }; + AddOffsetToCollisionBounds(collisionOffset, false); } if (commit) { vr::VRChaperoneSetup()->CommitWorkingCopy(vr::EChaperoneConfigFile_Live); @@ -537,6 +550,12 @@ void OverlayController::RotateUniverseCenter(vr::ETrackingUniverseOrigin univers void OverlayController::AddOffsetToCollisionBounds(unsigned axisId, float offset, bool commit) { + float offsetArray[3] = { 0,0,0 }; + offsetArray[axisId] = offset; + AddOffsetToCollisionBounds(offsetArray, commit); +} + +void OverlayController::AddOffsetToCollisionBounds(float offset[3], bool commit) { // Apparently Valve sanity-checks the y-coordinates of the collision bounds (and only the y-coordinates) // I can move the bounds on the xz-plane, I can make the "ceiling" of the chaperone cage lower/higher, but when I // dare to set one single lower corner to something non-zero, every corner gets its y-coordinates reset to the defaults. @@ -551,7 +570,9 @@ void OverlayController::AddOffsetToCollisionBounds(unsigned axisId, float offset vr::VRChaperoneSetup()->GetWorkingCollisionBoundsInfo(collisionBounds, &collisionBoundsCount); for (unsigned b = 0; b < collisionBoundsCount; b++) { for (unsigned c = 0; c < 4; c++) { - collisionBounds[b].vCorners[c].v[axisId] += offset; + collisionBounds[b].vCorners[c].v[0] += offset[0]; + collisionBounds[b].vCorners[c].v[2] += offset[1]; + collisionBounds[b].vCorners[c].v[1] += offset[2]; } } vr::VRChaperoneSetup()->SetWorkingCollisionBoundsInfo(collisionBounds, collisionBoundsCount); diff --git a/src/overlaycontroller.h b/src/overlaycontroller.h index 793a7d78..f3aead51 100644 --- a/src/overlaycontroller.h +++ b/src/overlaycontroller.h @@ -105,8 +105,10 @@ class OverlayController : public QObject { void SetWidget(QQuickItem* quickItem, const std::string& name, const std::string& key = ""); void AddOffsetToUniverseCenter(vr::ETrackingUniverseOrigin universe, unsigned axisId, float offset, bool adjustBounds = true, bool commit = true); + void AddOffsetToUniverseCenter(vr::ETrackingUniverseOrigin universe, float offset[3], bool adjustBounds = true, bool commit = true); void RotateUniverseCenter(vr::ETrackingUniverseOrigin universe, float yAngle, bool adjustBounds = true, bool commit = true); // around y axis void AddOffsetToCollisionBounds(unsigned axisId, float offset, bool commit = true); + void AddOffsetToCollisionBounds(float offset[3], bool commit = true); void RotateCollisionBounds(float angle, bool commit = true); // around y axis bool isDesktopMode() { return desktopMode; }; diff --git a/src/tabcontrollers/MoveCenterTabController.cpp b/src/tabcontrollers/MoveCenterTabController.cpp index 45d60827..a483cf14 100644 --- a/src/tabcontrollers/MoveCenterTabController.cpp +++ b/src/tabcontrollers/MoveCenterTabController.cpp @@ -339,11 +339,7 @@ void MoveCenterTabController::eventLoopTick(vr::ETrackingUniverseOrigin universe rotateCoordinates(diff, angle); - vr::VRChaperoneSetup()->RevertWorkingCopy(); - parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 0, diff[0], m_adjustChaperone, false); - parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 1, diff[1], m_adjustChaperone, false); - parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 2, diff[2], m_adjustChaperone, false); - vr::VRChaperoneSetup()->CommitWorkingCopy(vr::EChaperoneConfigFile_Live); + parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, diff, m_adjustChaperone); } m_lastControllerPosition[0] = absoluteControllerPosition[0]; m_lastControllerPosition[1] = absoluteControllerPosition[1]; From d0e6dffe387ba61bfea2949d12b46c01d4b4de53 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Mon, 26 Mar 2018 23:37:17 +0200 Subject: [PATCH 09/16] fix chaperone moving --- src/overlaycontroller.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/overlaycontroller.cpp b/src/overlaycontroller.cpp index e1835223..b7a70f3c 100644 --- a/src/overlaycontroller.cpp +++ b/src/overlaycontroller.cpp @@ -571,8 +571,8 @@ void OverlayController::AddOffsetToCollisionBounds(float offset[3], bool commit) for (unsigned b = 0; b < collisionBoundsCount; b++) { for (unsigned c = 0; c < 4; c++) { collisionBounds[b].vCorners[c].v[0] += offset[0]; - collisionBounds[b].vCorners[c].v[2] += offset[1]; - collisionBounds[b].vCorners[c].v[1] += offset[2]; + collisionBounds[b].vCorners[c].v[1] += offset[1]; + collisionBounds[b].vCorners[c].v[2] += offset[2]; } } vr::VRChaperoneSetup()->SetWorkingCollisionBoundsInfo(collisionBounds, collisionBoundsCount); From 1a260fbceb5ed8c95358a3819d3485a0ef9b07d9 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Tue, 27 Mar 2018 00:03:48 +0200 Subject: [PATCH 10/16] only revert working copy once --- src/tabcontrollers/MoveCenterTabController.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/tabcontrollers/MoveCenterTabController.cpp b/src/tabcontrollers/MoveCenterTabController.cpp index a483cf14..84e51fe4 100644 --- a/src/tabcontrollers/MoveCenterTabController.cpp +++ b/src/tabcontrollers/MoveCenterTabController.cpp @@ -306,6 +306,8 @@ void MoveCenterTabController::eventLoopTick(vr::ETrackingUniverseOrigin universe emit offsetZChanged(m_offsetZ); } return; + } else if (newMoveHand != vr::TrackedControllerRole_Invalid) { + vr::VRChaperoneSetup()->RevertWorkingCopy(); } vr::TrackedDevicePose_t* pose = devicePoses + handId; vr::VRControllerState_t state; @@ -339,7 +341,8 @@ void MoveCenterTabController::eventLoopTick(vr::ETrackingUniverseOrigin universe rotateCoordinates(diff, angle); - parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, diff, m_adjustChaperone); + parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, diff, m_adjustChaperone, false); + vr::VRChaperoneSetup()->CommitWorkingCopy(vr::EChaperoneConfigFile_Live); } m_lastControllerPosition[0] = absoluteControllerPosition[0]; m_lastControllerPosition[1] = absoluteControllerPosition[1]; From 8374eb930c5224805115eaaa6a615699c29898c7 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Wed, 28 Mar 2018 19:24:48 +0200 Subject: [PATCH 11/16] simplify move playspace code --- .../MoveCenterTabController.cpp | 76 +++++++------------ 1 file changed, 26 insertions(+), 50 deletions(-) diff --git a/src/tabcontrollers/MoveCenterTabController.cpp b/src/tabcontrollers/MoveCenterTabController.cpp index 84e51fe4..f8426d30 100644 --- a/src/tabcontrollers/MoveCenterTabController.cpp +++ b/src/tabcontrollers/MoveCenterTabController.cpp @@ -110,37 +110,20 @@ void MoveCenterTabController::setAdjustChaperone(bool value, bool notify) { m_adjustChaperone = value; if (m_trackingUniverse == vr::TrackingUniverseStanding) { vr::VRChaperoneSetup()->RevertWorkingCopy(); - float offsetdir; - if (m_adjustChaperone) { - offsetdir = -1.0; - } else { - offsetdir = 1.0; - } + auto angle = m_rotation * 2 * M_PI / 360.0; + float offsetdir = m_adjustChaperone ? -1.0 : 1.0; + float offset[3] = { + offsetdir * m_offsetX, + offsetdir * m_offsetY, + offsetdir * m_offsetZ + }; + rotateCoordinates(offset, angle); + + parent->AddOffsetToCollisionBounds(offset, false); - if (m_offsetX != 0.0f) { - if (m_adjustChaperone || m_rotation == 0) { - parent->AddOffsetToCollisionBounds(0, offsetdir * m_offsetX, false); - } else { - auto angle = m_rotation * 2 * M_PI / 360.0; - parent->AddOffsetToCollisionBounds(0, offsetdir * m_offsetX * std::cos(angle), false); - parent->AddOffsetToCollisionBounds(2, offsetdir * m_offsetX * std::sin(angle), false); - } - } - if (m_offsetY != 0.0f) { - parent->AddOffsetToCollisionBounds(1, offsetdir * m_offsetY, false); - } - if (m_offsetZ != 0.0f) { - if (m_adjustChaperone || m_rotation == 0) { - parent->AddOffsetToCollisionBounds(2, offsetdir * m_offsetZ, false); - } else { - auto angle = m_rotation * 2 * M_PI / 360.0; - parent->AddOffsetToCollisionBounds(2, offsetdir * m_offsetZ * std::cos(angle), false); - parent->AddOffsetToCollisionBounds(0, -offsetdir * m_offsetZ * std::sin(angle), false); - } - } if (m_rotation != 0) { float angle = m_rotation * 2 * M_PI / 360.0; - parent->RotateCollisionBounds(offsetdir * angle, false); + //parent->RotateCollisionBounds(offsetdir * angle, false); } vr::VRChaperoneSetup()->CommitWorkingCopy(vr::EChaperoneConfigFile_Live); } @@ -189,15 +172,10 @@ void MoveCenterTabController::setMoveShortcutLeft(bool value, bool notify) { } void MoveCenterTabController::modOffsetX(float value, bool notify) { - if (m_rotation == 0) { - parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 0, value, m_adjustChaperone); - } else { - auto angle = m_rotation * 2 * M_PI / 360.0; - vr::VRChaperoneSetup()->RevertWorkingCopy(); - parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 0, value * std::cos(angle), m_adjustChaperone, false); - parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 2, value * std::sin(angle), m_adjustChaperone, false); - vr::VRChaperoneSetup()->CommitWorkingCopy(vr::EChaperoneConfigFile_Live); - } + auto angle = m_rotation * 2 * M_PI / 360.0; + float offset[3] = { value, 0, 0 }; + rotateCoordinates(offset, angle); + parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, offset, m_adjustChaperone); m_offsetX += value; if (notify) { emit offsetXChanged(m_offsetX); @@ -213,15 +191,10 @@ void MoveCenterTabController::modOffsetY(float value, bool notify) { } void MoveCenterTabController::modOffsetZ(float value, bool notify) { - if (m_rotation == 0) { - parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 2, value, m_adjustChaperone); - } else { - auto angle = m_rotation * 2 * M_PI / 360.0; - vr::VRChaperoneSetup()->RevertWorkingCopy(); - parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 2, value * std::cos(angle), m_adjustChaperone, false); - parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 0, -value * std::sin(angle), m_adjustChaperone, false); - vr::VRChaperoneSetup()->CommitWorkingCopy(vr::EChaperoneConfigFile_Live); - } + auto angle = m_rotation * 2 * M_PI / 360.0; + float offset[3] = { 0, 0, value }; + rotateCoordinates(offset, angle); + parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, offset, m_adjustChaperone); m_offsetZ += value; if (notify) { emit offsetZChanged(m_offsetZ); @@ -231,9 +204,12 @@ void MoveCenterTabController::modOffsetZ(float value, bool notify) { void MoveCenterTabController::reset() { vr::VRChaperoneSetup()->RevertWorkingCopy(); parent->RotateUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, -m_rotation * 2 * M_PI / 360.0, m_adjustChaperone, false); - parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 0, -m_offsetX, m_adjustChaperone, false); - parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 1, -m_offsetY, m_adjustChaperone, false); - parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 2, -m_offsetZ, m_adjustChaperone, false); + float offset[3] = { + -m_offsetX, + -m_offsetY, + -m_offsetZ + }; + parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, offset, m_adjustChaperone, false); vr::VRChaperoneSetup()->CommitWorkingCopy(vr::EChaperoneConfigFile_Live); m_offsetX = 0.0f; m_offsetY = 0.0f; @@ -306,7 +282,7 @@ void MoveCenterTabController::eventLoopTick(vr::ETrackingUniverseOrigin universe emit offsetZChanged(m_offsetZ); } return; - } else if (newMoveHand != vr::TrackedControllerRole_Invalid) { + } else if (newMoveHand != vr::TrackedControllerRole_Invalid && oldMoveHand == vr::TrackedControllerRole_Invalid) { vr::VRChaperoneSetup()->RevertWorkingCopy(); } vr::TrackedDevicePose_t* pose = devicePoses + handId; From a66dd5911c1f15df2ac7273f8aac822c0d919224 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Wed, 28 Mar 2018 19:28:01 +0200 Subject: [PATCH 12/16] add gitignores --- .gitignore | 9 +++++++++ bin/win64/.gitignore | 6 ++++++ 2 files changed, 15 insertions(+) create mode 100644 .gitignore create mode 100644 bin/win64/.gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..395028d1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +debug +release +assets +*.vcxproj* +*.log +*.vs +*.stash +*.appxmanifest +*.user diff --git a/bin/win64/.gitignore b/bin/win64/.gitignore new file mode 100644 index 00000000..fb345079 --- /dev/null +++ b/bin/win64/.gitignore @@ -0,0 +1,6 @@ +*.log +*.exe +*.dll +*.pdb +qtdata +!openvr_api.dll From 2f97eacdbf596adbe8e5a89eda1ee9fa057bede0 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Mon, 2 Apr 2018 02:14:52 +0200 Subject: [PATCH 13/16] fix toggle adjust chaperone with rotation --- src/tabcontrollers/MoveCenterTabController.cpp | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/tabcontrollers/MoveCenterTabController.cpp b/src/tabcontrollers/MoveCenterTabController.cpp index f8426d30..a67447bd 100644 --- a/src/tabcontrollers/MoveCenterTabController.cpp +++ b/src/tabcontrollers/MoveCenterTabController.cpp @@ -119,13 +119,7 @@ void MoveCenterTabController::setAdjustChaperone(bool value, bool notify) { }; rotateCoordinates(offset, angle); - parent->AddOffsetToCollisionBounds(offset, false); - - if (m_rotation != 0) { - float angle = m_rotation * 2 * M_PI / 360.0; - //parent->RotateCollisionBounds(offsetdir * angle, false); - } - vr::VRChaperoneSetup()->CommitWorkingCopy(vr::EChaperoneConfigFile_Live); + parent->AddOffsetToCollisionBounds(offset); } auto settings = OverlayController::appSettings(); settings->beginGroup("playspaceSettings"); From 3901115fa399c3bfe074c1f2aa91af98f210711b Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Mon, 2 Apr 2018 02:15:39 +0200 Subject: [PATCH 14/16] fix move button sometimes getting suck --- src/tabcontrollers/MoveCenterTabController.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/tabcontrollers/MoveCenterTabController.cpp b/src/tabcontrollers/MoveCenterTabController.cpp index a67447bd..a1a218cf 100644 --- a/src/tabcontrollers/MoveCenterTabController.cpp +++ b/src/tabcontrollers/MoveCenterTabController.cpp @@ -250,6 +250,10 @@ vr::ETrackedControllerRole MoveCenterTabController::getMoveShortcutHand() { if (!leftPressed && m_moveShortcutLeftPressed) { activeHand = rightPressed ? vr::TrackedControllerRole_RightHand : vr::TrackedControllerRole_Invalid; } + + if (!leftPressed && !rightPressed) { + activeHand = vr::TrackedControllerRole_Invalid; + } m_activeMoveController = activeHand; m_moveShortcutRightPressed = rightPressed; From 8cbc37de2b3452aea0deca0f40d7c091c2735b21 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Mon, 2 Apr 2018 02:16:25 +0200 Subject: [PATCH 15/16] use temp chaperone config during move --- src/tabcontrollers/MoveCenterTabController.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/tabcontrollers/MoveCenterTabController.cpp b/src/tabcontrollers/MoveCenterTabController.cpp index a1a218cf..dcf9fa41 100644 --- a/src/tabcontrollers/MoveCenterTabController.cpp +++ b/src/tabcontrollers/MoveCenterTabController.cpp @@ -109,7 +109,6 @@ void MoveCenterTabController::setAdjustChaperone(bool value, bool notify) { if (m_adjustChaperone != value) { m_adjustChaperone = value; if (m_trackingUniverse == vr::TrackingUniverseStanding) { - vr::VRChaperoneSetup()->RevertWorkingCopy(); auto angle = m_rotation * 2 * M_PI / 360.0; float offsetdir = m_adjustChaperone ? -1.0 : 1.0; float offset[3] = { @@ -269,7 +268,6 @@ void MoveCenterTabController::eventLoopTick(vr::ETrackingUniverseOrigin universe settingsUpdateCounter = 0; } else { settingsUpdateCounter++; - auto oldMoveHand = m_activeMoveController; auto newMoveHand = getMoveShortcutHand(); auto handId = vr::VRSystem()->GetTrackedDeviceIndexForControllerRole(newMoveHand); @@ -278,10 +276,9 @@ void MoveCenterTabController::eventLoopTick(vr::ETrackingUniverseOrigin universe emit offsetXChanged(m_offsetX); emit offsetYChanged(m_offsetY); emit offsetZChanged(m_offsetZ); + vr::VRChaperoneSetup()->CommitWorkingCopy(vr::EChaperoneConfigFile_Live); } return; - } else if (newMoveHand != vr::TrackedControllerRole_Invalid && oldMoveHand == vr::TrackedControllerRole_Invalid) { - vr::VRChaperoneSetup()->RevertWorkingCopy(); } vr::TrackedDevicePose_t* pose = devicePoses + handId; vr::VRControllerState_t state; @@ -316,7 +313,7 @@ void MoveCenterTabController::eventLoopTick(vr::ETrackingUniverseOrigin universe rotateCoordinates(diff, angle); parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, diff, m_adjustChaperone, false); - vr::VRChaperoneSetup()->CommitWorkingCopy(vr::EChaperoneConfigFile_Live); + vr::VRChaperoneSetup()->CommitWorkingCopy(vr::EChaperoneConfigFile_Temp); } m_lastControllerPosition[0] = absoluteControllerPosition[0]; m_lastControllerPosition[1] = absoluteControllerPosition[1]; From 3d59a68de7c5cc70f9b85b7ed073fa2d61dc1064 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Mon, 2 Apr 2018 11:57:40 +0200 Subject: [PATCH 16/16] verify pose during virtual move --- .../MoveCenterTabController.cpp | 76 ++++++++++--------- 1 file changed, 40 insertions(+), 36 deletions(-) diff --git a/src/tabcontrollers/MoveCenterTabController.cpp b/src/tabcontrollers/MoveCenterTabController.cpp index dcf9fa41..aeea6638 100644 --- a/src/tabcontrollers/MoveCenterTabController.cpp +++ b/src/tabcontrollers/MoveCenterTabController.cpp @@ -216,7 +216,7 @@ void MoveCenterTabController::reset() { bool isMoveShortCutPressed(vr::ETrackedControllerRole hand) { auto handId = vr::VRSystem()->GetTrackedDeviceIndexForControllerRole(hand); - if (handId == vr::k_unTrackedDeviceIndexInvalid) { + if (handId == vr::k_unTrackedDeviceIndexInvalid || handId >= vr::k_unMaxTrackedDeviceCount) { return false; } @@ -270,55 +270,59 @@ void MoveCenterTabController::eventLoopTick(vr::ETrackingUniverseOrigin universe settingsUpdateCounter++; auto oldMoveHand = m_activeMoveController; auto newMoveHand = getMoveShortcutHand(); + if (newMoveHand == vr::TrackedControllerRole_Invalid) { + emit offsetXChanged(m_offsetX); + emit offsetYChanged(m_offsetY); + emit offsetZChanged(m_offsetZ); + return; + } auto handId = vr::VRSystem()->GetTrackedDeviceIndexForControllerRole(newMoveHand); - if (newMoveHand == vr::TrackedControllerRole_Invalid || handId == vr::k_unTrackedDeviceIndexInvalid) { + if (newMoveHand == vr::TrackedControllerRole_Invalid || handId == vr::k_unTrackedDeviceIndexInvalid || handId >= vr::k_unMaxTrackedDeviceCount) { if (oldMoveHand != vr::TrackedControllerRole_Invalid) { emit offsetXChanged(m_offsetX); emit offsetYChanged(m_offsetY); emit offsetZChanged(m_offsetZ); - vr::VRChaperoneSetup()->CommitWorkingCopy(vr::EChaperoneConfigFile_Live); } return; } vr::TrackedDevicePose_t* pose = devicePoses + handId; - vr::VRControllerState_t state; - if (vr::VRSystem()->GetControllerState(handId, &state, sizeof(vr::VRControllerState_t))) { - float relativeControllerPosition[] = { - pose->mDeviceToAbsoluteTracking.m[0][3], - pose->mDeviceToAbsoluteTracking.m[1][3], - pose->mDeviceToAbsoluteTracking.m[2][3] - }; - - auto angle = m_rotation * 2 * M_PI / 360.0; - rotateCoordinates(relativeControllerPosition, -angle); - float absoluteControllerPosition[] = { - relativeControllerPosition[0] + m_offsetX, - relativeControllerPosition[1] + m_offsetY, - relativeControllerPosition[2] + m_offsetZ, + if (!pose->bPoseIsValid || !pose->bDeviceIsConnected || pose->eTrackingResult != vr::TrackingResult_Running_OK) { + return; + } + float relativeControllerPosition[] = { + pose->mDeviceToAbsoluteTracking.m[0][3], + pose->mDeviceToAbsoluteTracking.m[1][3], + pose->mDeviceToAbsoluteTracking.m[2][3] + }; + + auto angle = m_rotation * 2 * M_PI / 360.0; + rotateCoordinates(relativeControllerPosition, -angle); + float absoluteControllerPosition[] = { + relativeControllerPosition[0] + m_offsetX, + relativeControllerPosition[1] + m_offsetY, + relativeControllerPosition[2] + m_offsetZ, + }; + + if (oldMoveHand == newMoveHand) { + + float diff[3] = { + absoluteControllerPosition[0] - m_lastControllerPosition[0], + absoluteControllerPosition[1] - m_lastControllerPosition[1], + absoluteControllerPosition[2] - m_lastControllerPosition[2], }; - if (oldMoveHand == newMoveHand) { - - float diff[3] = { - absoluteControllerPosition[0] - m_lastControllerPosition[0], - absoluteControllerPosition[1] - m_lastControllerPosition[1], - absoluteControllerPosition[2] - m_lastControllerPosition[2], - }; + // offset is un-rotated coordinates + m_offsetX += diff[0]; + m_offsetY += diff[1]; + m_offsetZ += diff[2]; - // offset is un-rotated coordinates - m_offsetX += diff[0]; - m_offsetY += diff[1]; - m_offsetZ += diff[2]; + rotateCoordinates(diff, angle); - rotateCoordinates(diff, angle); - - parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, diff, m_adjustChaperone, false); - vr::VRChaperoneSetup()->CommitWorkingCopy(vr::EChaperoneConfigFile_Temp); - } - m_lastControllerPosition[0] = absoluteControllerPosition[0]; - m_lastControllerPosition[1] = absoluteControllerPosition[1]; - m_lastControllerPosition[2] = absoluteControllerPosition[2]; + parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, diff, m_adjustChaperone); } + m_lastControllerPosition[0] = absoluteControllerPosition[0]; + m_lastControllerPosition[1] = absoluteControllerPosition[1]; + m_lastControllerPosition[2] = absoluteControllerPosition[2]; } }