From f9cf2880cd8ca188f0b2e48ba92b285fe0aa513f Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Wed, 14 Mar 2018 16:48:10 +0100 Subject: [PATCH] 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 3b09548..55fbd45 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 26977d2..5dd539a 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 270582e..3d05e2c 100644 --- a/src/tabcontrollers/MoveCenterTabController.h +++ b/src/tabcontrollers/MoveCenterTabController.h @@ -31,6 +31,10 @@ private: 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 @@ public: 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;