From 2a63525fba72cf4682b4e31c2c8dc037c781d4ae Mon Sep 17 00:00:00 2001 From: Kung-vr Date: Mon, 21 Oct 2019 13:55:21 +0900 Subject: [PATCH] Make double recenter behavior default and cleanup debug code This also adds the option "simpleRecenter" which can be set to true in the ini playspace settings to get single (non loop) recenter behavior back. --- src/res/qml/SettingsPage.qml | 2 + src/tabcontrollers/ChaperoneTabController.cpp | 2 +- .../MoveCenterTabController.cpp | 106 ++++++------------ src/tabcontrollers/MoveCenterTabController.h | 9 +- 4 files changed, 44 insertions(+), 75 deletions(-) diff --git a/src/res/qml/SettingsPage.qml b/src/res/qml/SettingsPage.qml index aadd826..138e5ae 100644 --- a/src/res/qml/SettingsPage.qml +++ b/src/res/qml/SettingsPage.qml @@ -167,6 +167,8 @@ MyStackViewPage { RowLayout { Layout.fillWidth: true + // set visible to true here in builds when we need a debug toggle checkbox, otherwise false when on master branch. + visible: false Item { Layout.fillWidth: true diff --git a/src/tabcontrollers/ChaperoneTabController.cpp b/src/tabcontrollers/ChaperoneTabController.cpp index 5192ef9..e708fcf 100644 --- a/src/tabcontrollers/ChaperoneTabController.cpp +++ b/src/tabcontrollers/ChaperoneTabController.cpp @@ -632,7 +632,7 @@ void ChaperoneTabController::eventLoopTick( if ( m_updateTicksChaperoneReload >= 500 ) { m_updateTicksChaperoneReload = 0; - LOG( WARNING ) << "Attempting to Reloading Chaperone Data"; + LOG( WARNING ) << "Attempting to reload chaperone data"; parent->chaperoneUtils().loadChaperoneData(); } } diff --git a/src/tabcontrollers/MoveCenterTabController.cpp b/src/tabcontrollers/MoveCenterTabController.cpp index eeff2e7..bb7d200 100644 --- a/src/tabcontrollers/MoveCenterTabController.cpp +++ b/src/tabcontrollers/MoveCenterTabController.cpp @@ -158,6 +158,11 @@ void MoveCenterTabController::initStage1() { m_enableSeatedMotion = value.toBool(); } + value = settings->value( "simpleRecenter", m_simpleRecenter ); + if ( value.isValid() && !value.isNull() ) + { + m_simpleRecenter = value.toBool(); + } settings->endGroup(); reloadOffsetProfiles(); m_lastDragUpdateTimePoint = std::chrono::steady_clock::now(); @@ -351,6 +356,10 @@ void MoveCenterTabController::outputLogSettings() { LOG( INFO ) << "LOADED SETTINGS: Seated Motion Enabled"; } + if ( m_simpleRecenter ) + { + LOG( INFO ) << "LOADED SETTINGS: Simple Recenter Enabled"; + } if ( m_dragBounds ) { LOG( INFO ) << "LOADED SETTINGS: Space Drag Force Bounds Enabled"; @@ -1207,6 +1216,27 @@ void MoveCenterTabController::setEnableSeatedMotion( bool value, bool notify ) << m_enableSeatedMotion; } +bool MoveCenterTabController::simpleRecenter() const +{ + return m_simpleRecenter; +} + +void MoveCenterTabController::setSimpleRecenter( bool value, bool notify ) +{ + m_simpleRecenter = value; + auto settings = OverlayController::appSettings(); + settings->beginGroup( "playspaceSettings" ); + settings->setValue( "simpleRecenter", m_simpleRecenter ); + settings->endGroup(); + settings->sync(); + if ( notify ) + { + emit simpleRecenterChanged( m_simpleRecenter ); + } + LOG( INFO ) << "CHANGED SETTINGS: Simple Recenter Set: " + << m_simpleRecenter; +} + void MoveCenterTabController::modOffsetX( float value, bool notify ) { if ( !m_lockXToggle ) @@ -1253,7 +1283,10 @@ void MoveCenterTabController::incomingSeatedReset() { if ( m_enableSeatedMotion ) { - if ( !m_selfRequestedSeatedRecenter ) + // if we didn't send the request from OVRAS, we need to send another + // ResetSeatedZeroPose(). It seems that only after this is sent from + // OVRAS does ReloadFromDisk return valid info on WMR. + if ( !m_selfRequestedSeatedRecenter && !m_simpleRecenter ) { m_selfRequestedSeatedRecenter = true; vr::VRSystem()->ResetSeatedZeroPose(); @@ -1263,35 +1296,6 @@ void MoveCenterTabController::incomingSeatedReset() updateSeatedResetData(); } } - else if ( parent->enableDebug() && parent->debugState() == 1 ) - { - vr::VRChaperoneSetup()->ReloadFromDisk( vr::EChaperoneConfigFile_Live ); - } - else if ( parent->enableDebug() && parent->debugState() == 2 ) - { - std::this_thread::sleep_for( std::chrono::milliseconds( 20 ) ); - vr::VRChaperoneSetup()->ReloadFromDisk( vr::EChaperoneConfigFile_Live ); - } - else if ( parent->enableDebug() && parent->debugState() == 3 ) - { - std::this_thread::sleep_for( std::chrono::milliseconds( 100 ) ); - vr::VRChaperoneSetup()->ReloadFromDisk( vr::EChaperoneConfigFile_Live ); - } - else if ( parent->enableDebug() && parent->debugState() == 4 ) - { - std::this_thread::sleep_for( std::chrono::milliseconds( 200 ) ); - vr::VRChaperoneSetup()->ReloadFromDisk( vr::EChaperoneConfigFile_Live ); - } - else if ( parent->enableDebug() && parent->debugState() == 5 ) - { - std::this_thread::sleep_for( std::chrono::milliseconds( 500 ) ); - vr::VRChaperoneSetup()->ReloadFromDisk( vr::EChaperoneConfigFile_Live ); - } - else if ( parent->enableDebug() && parent->debugState() == 6 ) - { - std::this_thread::sleep_for( std::chrono::milliseconds( 1000 ) ); - vr::VRChaperoneSetup()->ReloadFromDisk( vr::EChaperoneConfigFile_Live ); - } } void MoveCenterTabController::reset() @@ -1474,10 +1478,6 @@ void MoveCenterTabController::zeroOffsets() void MoveCenterTabController::sendSeatedRecenter() { - if ( parent->enableDebug() && parent->debugState() == 7 ) - { - m_selfRequestedSeatedRecenter = true; - } vr::VRSystem()->ResetSeatedZeroPose(); } @@ -1519,15 +1519,7 @@ void MoveCenterTabController::updateSeatedResetData() emit offsetYChanged( m_offsetY ); emit offsetZChanged( m_offsetZ ); emit rotationChanged( m_rotation ); - if ( parent->enableDebug() && parent->debugState() >= 100 ) - { - m_lastSeatedRecenterTimePoint = std::chrono::steady_clock::now(); - m_pendingSeatedReloadFromDisk = true; - } - else - { - vr::VRChaperoneSetup()->ReloadFromDisk( vr::EChaperoneConfigFile_Live ); - } + vr::VRChaperoneSetup()->ReloadFromDisk( vr::EChaperoneConfigFile_Live ); // done with this recenter, so set self request back to false for next time. m_selfRequestedSeatedRecenter = false; // set pending update here, will be processed on next instance of motion or @@ -3151,34 +3143,6 @@ void MoveCenterTabController::eventLoopTick( return; } - if ( parent->enableDebug() && parent->debugState() >= 100 ) - { - if ( m_pendingSeatedReloadFromDisk ) - { - double secondsSinceLastRecenter - = std::chrono::duration( - std::chrono::steady_clock::now() - - m_lastSeatedRecenterTimePoint ) - .count(); - - if ( secondsSinceLastRecenter - >= ( static_cast( parent->debugState() ) - 100.0 ) - / 1000.0 ) - { - vr::VRChaperoneSetup()->ReloadFromDisk( - vr::EChaperoneConfigFile_Live ); - m_pendingSeatedReloadFromDisk = false; - } - // stop for one loop tick even if it's time to - // ReloadFromDisk to give it a little extra time before we - // might process motion. - - // if still m_pendingSeatedReloadFromDisk we'll remain waiting - // here until it's time, stopping before processing motion. - return; - } - } - // only update dynamic motion if the dash is closed if ( !parent->isDashboardVisible() ) { diff --git a/src/tabcontrollers/MoveCenterTabController.h b/src/tabcontrollers/MoveCenterTabController.h index 9f90ecf..9d3d000 100644 --- a/src/tabcontrollers/MoveCenterTabController.h +++ b/src/tabcontrollers/MoveCenterTabController.h @@ -100,6 +100,8 @@ class MoveCenterTabController : public QObject setUniverseCenteredRotation NOTIFY universeCenteredRotationChanged ) Q_PROPERTY( bool enableSeatedMotion READ enableSeatedMotion WRITE setEnableSeatedMotion NOTIFY enableSeatedMotionChanged ) + Q_PROPERTY( bool simpleRecenter READ simpleRecenter WRITE setSimpleRecenter + NOTIFY simpleRecenterChanged ) private: OverlayController* parent; @@ -136,7 +138,6 @@ 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; @@ -175,7 +176,6 @@ private: bool m_chaperoneCommitted = true; bool m_pendingZeroOffsets = true; bool m_pendingSeatedRecenter = false; - bool m_pendingSeatedReloadFromDisk = false; bool m_selfRequestedSeatedRecenter = false; bool m_dashWasOpenPreviousFrame = false; bool m_roomSetupModeDetected = false; @@ -185,6 +185,7 @@ private: bool m_oldStyleMotion = false; bool m_universeCenteredRotation = false; bool m_enableSeatedMotion = false; + bool m_simpleRecenter = false; unsigned settingsUpdateCounter = 0; int m_hmdRotationStatsUpdateCounter = 0; unsigned m_dragComfortFrameSkipCounter = 0; @@ -192,7 +193,6 @@ private: double m_velocity[3] = { 0.0, 0.0, 0.0 }; std::chrono::steady_clock::time_point m_lastGravityUpdateTimePoint; std::chrono::steady_clock::time_point m_lastDragUpdateTimePoint; - std::chrono::steady_clock::time_point m_lastSeatedRecenterTimePoint; vr::HmdQuad_t* m_collisionBoundsForReset; uint32_t m_collisionBoundsCountForReset = 0; vr::HmdMatrix34_t m_universeCenterForReset @@ -258,6 +258,7 @@ public: bool oldStyleMotion() const; bool universeCenteredRotation() const; bool enableSeatedMotion() const; + bool simpleRecenter() const; bool isInitComplete() const; double getHmdYawTotal(); void resetHmdYawTotal(); @@ -334,6 +335,7 @@ public slots: void setOldStyleMotion( bool value, bool notify = true ); void setUniverseCenteredRotation( bool value, bool notify = true ); void setEnableSeatedMotion( bool value, bool notify = true ); + void setSimpleRecenter( bool value, bool notify = true ); void shutdown(); void reset(); @@ -378,6 +380,7 @@ signals: void oldStyleMotionChanged( bool value ); void universeCenteredRotationChanged( bool value ); void enableSeatedMotionChanged( bool value ); + void simpleRecenterChanged( bool value ); void offsetProfilesUpdated(); };