From 93913b6e94095b5400f1169230d47a92a4c59198 Mon Sep 17 00:00:00 2001 From: Kung-vr Date: Sun, 29 Sep 2019 03:11:34 +0900 Subject: [PATCH] Add safeguards for exceeding new max OpenVR offsets --- .../MoveCenterTabController.cpp | 198 +++++++++++++++++- src/tabcontrollers/MoveCenterTabController.h | 5 + 2 files changed, 196 insertions(+), 7 deletions(-) diff --git a/src/tabcontrollers/MoveCenterTabController.cpp b/src/tabcontrollers/MoveCenterTabController.cpp index 16f2757..22d9ebd 100644 --- a/src/tabcontrollers/MoveCenterTabController.cpp +++ b/src/tabcontrollers/MoveCenterTabController.cpp @@ -244,6 +244,9 @@ void MoveCenterTabController::outputLogPoses() vr::HmdMatrix34_t hmdStanding = devicePosesStanding[0].mDeviceToAbsoluteTracking; + LOG( INFO ) << ""; + LOG( INFO ) << " ____Begin Matrices Log Ouput__________"; + LOG( INFO ) << "|"; LOG( INFO ) << "HMD POSE (standing universe)"; outputLogHmdMatrix( hmdStanding ); @@ -305,6 +308,9 @@ void MoveCenterTabController::outputLogPoses() LOG( INFO ) << "m_seatedCenterForReset"; outputLogHmdMatrix( m_seatedCenterForReset ); + + LOG( INFO ) << "|____End Matrices Log Ouput____________"; + LOG( INFO ) << ""; } void MoveCenterTabController::outputLogHmdMatrix( vr::HmdMatrix34_t hmdMatrix ) @@ -1120,6 +1126,83 @@ void MoveCenterTabController::reset() void MoveCenterTabController::zeroOffsets() { + // first we'll check if we're outside the max commit distance + + vr::HmdMatrix34_t currentCenter; + vr::VRChaperoneSetup()->GetWorkingStandingZeroPoseToRawTrackingPose( + ¤tCenter ); + double currentCenterYaw = static_cast( + std::atan2( currentCenter.m[0][2], currentCenter.m[2][2] ) ); + double currentCenterXyz[3] + = { static_cast( currentCenter.m[0][3] ), + static_cast( currentCenter.m[1][3] ), + static_cast( currentCenter.m[2][3] ) }; + // unrotate to get raw values of xyz + rotateCoordinates( currentCenterXyz, + currentCenterYaw + - ( m_rotation * k_centidegreesToRadians ) ); + if ( abs( currentCenterXyz[0] ) > k_maxOpenvrCommitOffset ) + { + LOG( INFO ) << "Attempted Zero Offsets out of commit bounds ( X: " + << currentCenterXyz[0] << " )"; + LOG( INFO ) << "GetWorkingStandingZeroPoseToRawTrackingPose"; + outputLogHmdMatrix( currentCenter ); + // if reset happens before init is complete we set the universe center + // to the raw tracking zero point + reset(); + if ( !m_chaperoneBasisAcquired ) + { + LOG( WARNING ) + << "<[!]><[!]>EXECUTED RESET BEFORE BASIS ACQUIRED<[!]><[!]> " + "Setting universe center to raw tracking zero point."; + } + else + { + LOG( INFO ) << "-Resetting offsets-"; + } + } + else if ( abs( currentCenterXyz[1] ) > k_maxOpenvrCommitOffset ) + { + LOG( INFO ) << "Attempted Zero Offsets out of commit bounds ( Y: " + << currentCenterXyz[1] << " )"; + LOG( INFO ) << "GetWorkingStandingZeroPoseToRawTrackingPose"; + outputLogHmdMatrix( currentCenter ); + // if reset happens before init is complete we set the universe center + // to the raw tracking zero point + reset(); + if ( !m_chaperoneBasisAcquired ) + { + LOG( WARNING ) + << "<[!]><[!]>EXECUTED RESET BEFORE BASIS ACQUIRED<[!]><[!]> " + "Setting universe center to raw tracking zero point."; + } + else + { + LOG( INFO ) << "-Resetting offsets-"; + } + } + else if ( abs( currentCenterXyz[2] ) > k_maxOpenvrCommitOffset ) + { + LOG( INFO ) << "Attempted Zero Offsets out of commit bounds ( Z: " + << currentCenterXyz[2] << " )"; + LOG( INFO ) << "GetWorkingStandingZeroPoseToRawTrackingPose"; + outputLogHmdMatrix( currentCenter ); + // if reset happens before init is complete we set the universe + // center to the raw tracking zero point + reset(); + if ( !m_chaperoneBasisAcquired ) + { + LOG( WARNING ) + << "<[!]><[!]>EXECUTED RESET BEFORE BASIS ACQUIRED<[!]><[!]> " + "Setting universe center to raw tracking zero point."; + } + else + { + LOG( INFO ) << "-Resetting offsets-"; + } + } + + // finished checking if out of bounds, proceed with normal zeroing offsets if ( vr::VRChaperone()->GetCalibrationState() == vr::ChaperoneCalibrationState_OK ) { @@ -1136,7 +1219,6 @@ void MoveCenterTabController::zeroOffsets() emit offsetZChanged( m_offsetZ ); emit rotationChanged( m_rotation ); updateChaperoneResetData(); - reset(); m_pendingZeroOffsets = false; if ( !m_chaperoneBasisAcquired ) { @@ -1236,7 +1318,6 @@ void MoveCenterTabController::updateSeatedResetData() void MoveCenterTabController::updateChaperoneResetData() { - vr::VRChaperoneSetup()->HideWorkingSetPreview(); vr::VRChaperoneSetup()->RevertWorkingCopy(); unsigned currentQuadCount = 0; vr::VRChaperoneSetup()->GetWorkingCollisionBoundsInfo( nullptr, @@ -2432,6 +2513,7 @@ void MoveCenterTabController::updateSpace() return; } + // reload from disk if we're at zero offsets and allow external edits if ( m_allowExternalEdits && m_oldOffsetX == 0.0f && m_oldOffsetY == 0.0f && m_oldOffsetZ == 0.0f && m_oldRotation == 0 ) { @@ -2478,6 +2560,67 @@ void MoveCenterTabController::updateSpace() offsetUniverseCenter.m[2][3] += m_universeCenterForReset.m[2][2] * m_offsetZ; + // check if we just pushed offsetUniverseCenter out of bounds (40km) + // (we reuse offsetUniverseCenterYaw to rotate the chaperone also) + double offsetUniverseCenterYaw = static_cast( std::atan2( + offsetUniverseCenter.m[0][2], offsetUniverseCenter.m[2][2] ) ); + double offsetUniverseCenterXyz[3] + = { static_cast( offsetUniverseCenter.m[0][3] ), + static_cast( offsetUniverseCenter.m[1][3] ), + static_cast( offsetUniverseCenter.m[2][3] ) }; + // unrotate to get raw values of xyz + rotateCoordinates( offsetUniverseCenterXyz, + offsetUniverseCenterYaw + - ( m_rotation * k_centidegreesToRadians ) ); + if ( abs( offsetUniverseCenterXyz[0] ) > k_maxOpenvrWorkingSetOffest + || ( abs( offsetUniverseCenterXyz[0] ) + > k_maxOvrasUniverseCenteredTurningOffset + && m_universeCenteredRotation ) ) + { + LOG( INFO ) << "Raw universe center out of bounds ( X: " + << offsetUniverseCenterXyz[0] << " )"; + vr::HmdMatrix34_t standingZero; + vr::VRChaperoneSetup()->GetWorkingStandingZeroPoseToRawTrackingPose( + &standingZero ); + LOG( INFO ) << "GetWorkingStandingZeroPoseToRawTrackingPose"; + outputLogHmdMatrix( standingZero ); + reset(); + LOG( INFO ) << "-Resetting offsets-"; + return; + } + if ( abs( offsetUniverseCenterXyz[1] ) > k_maxOpenvrWorkingSetOffest + || ( abs( offsetUniverseCenterXyz[1] ) + > k_maxOvrasUniverseCenteredTurningOffset + && m_universeCenteredRotation ) ) + { + LOG( INFO ) << "Raw universe center out of bounds ( Y: " + << offsetUniverseCenterXyz[1] << " )"; + vr::HmdMatrix34_t standingZero; + vr::VRChaperoneSetup()->GetWorkingStandingZeroPoseToRawTrackingPose( + &standingZero ); + LOG( INFO ) << "GetWorkingStandingZeroPoseToRawTrackingPose"; + outputLogHmdMatrix( standingZero ); + reset(); + LOG( INFO ) << "-Resetting offsets-"; + return; + } + if ( abs( offsetUniverseCenterXyz[2] ) > k_maxOpenvrWorkingSetOffest + || ( abs( offsetUniverseCenterXyz[2] ) + > k_maxOvrasUniverseCenteredTurningOffset + && m_universeCenteredRotation ) ) + { + LOG( INFO ) << "Raw universe center out of bounds ( Z: " + << offsetUniverseCenterXyz[2] << " )"; + vr::HmdMatrix34_t standingZero; + vr::VRChaperoneSetup()->GetWorkingStandingZeroPoseToRawTrackingPose( + &standingZero ); + LOG( INFO ) << "GetWorkingStandingZeroPoseToRawTrackingPose"; + outputLogHmdMatrix( standingZero ); + reset(); + LOG( INFO ) << "-Resetting offsets-"; + return; + } + // keep the seated origin synced with offsets if in seated mode if ( m_trackingUniverse == vr::TrackingUniverseSeated ) { @@ -2494,9 +2637,6 @@ void MoveCenterTabController::updateSpace() // make a copy of our bounds and // reorient relative to new universe center - float offsetUniverseCenterYaw = std::atan2( - offsetUniverseCenter.m[0][2], offsetUniverseCenter.m[2][2] ); - vr::HmdQuad_t* updatedBounds = new vr::HmdQuad_t[m_collisionBoundsCountForReset]; @@ -2535,8 +2675,9 @@ void MoveCenterTabController::updateSpace() - m_universeCenterForReset.m[2][3]; // rotate by universe center's yaw - rotateFloatCoordinates( updatedBounds[quad].vCorners[corner].v, - offsetUniverseCenterYaw ); + rotateFloatCoordinates( + updatedBounds[quad].vCorners[corner].v, + static_cast( offsetUniverseCenterYaw ) ); } } @@ -2550,6 +2691,49 @@ void MoveCenterTabController::updateSpace() if ( m_oldStyleMotion ) { + // check if universe center is outside of OpenVR commit bounds (1km) + if ( abs( offsetUniverseCenterXyz[0] ) > k_maxOpenvrCommitOffset ) + { + LOG( INFO ) << "COMMIT FAILED: Raw universe center out of commit " + "bounds ( X: " + << offsetUniverseCenterXyz[0] << " )"; + vr::HmdMatrix34_t standingZero; + vr::VRChaperoneSetup()->GetWorkingStandingZeroPoseToRawTrackingPose( + &standingZero ); + LOG( INFO ) << "GetWorkingStandingZeroPoseToRawTrackingPose"; + outputLogHmdMatrix( standingZero ); + reset(); + LOG( INFO ) << "-Resetting offsets-"; + return; + } + if ( abs( offsetUniverseCenterXyz[1] ) > k_maxOpenvrCommitOffset ) + { + LOG( INFO ) << "COMMIT FAILED: Raw universe center out of commit " + "bounds ( Y: " + << offsetUniverseCenterXyz[1] << " )"; + vr::HmdMatrix34_t standingZero; + vr::VRChaperoneSetup()->GetWorkingStandingZeroPoseToRawTrackingPose( + &standingZero ); + LOG( INFO ) << "GetWorkingStandingZeroPoseToRawTrackingPose"; + outputLogHmdMatrix( standingZero ); + reset(); + LOG( INFO ) << "-Resetting offsets-"; + return; + } + if ( abs( offsetUniverseCenterXyz[2] ) > k_maxOpenvrCommitOffset ) + { + LOG( INFO ) << "COMMIT FAILED: Raw universe center out of commit " + "bounds ( Z: " + << offsetUniverseCenterXyz[2] << " )"; + vr::HmdMatrix34_t standingZero; + vr::VRChaperoneSetup()->GetWorkingStandingZeroPoseToRawTrackingPose( + &standingZero ); + LOG( INFO ) << "GetWorkingStandingZeroPoseToRawTrackingPose"; + outputLogHmdMatrix( standingZero ); + reset(); + LOG( INFO ) << "-Resetting offsets-"; + return; + } vr::VRChaperoneSetup()->CommitWorkingCopy( vr::EChaperoneConfigFile_Live ); m_chaperoneCommitted = true; diff --git a/src/tabcontrollers/MoveCenterTabController.h b/src/tabcontrollers/MoveCenterTabController.h index 3ec93d8..df020ee 100644 --- a/src/tabcontrollers/MoveCenterTabController.h +++ b/src/tabcontrollers/MoveCenterTabController.h @@ -16,6 +16,11 @@ constexpr double k_radiansToCentidegrees = 18000.0 / M_PI; constexpr double k_quaternionInvalidValue = -1000.0; constexpr double k_quaternionUnderIsInvalidValueThreshold = -900.0; constexpr double k_terminalVelocity_mps = 50.0; +// give the max offset a buffer to avoid crossing when traveling at astronomical +// velocities +constexpr double k_maxOpenvrWorkingSetOffest = 39900.0; +constexpr double k_maxOpenvrCommitOffset = 990.0; +constexpr double k_maxOvrasUniverseCenteredTurningOffset = 25000.0; class OverlayController;