Rework seated-universe motion

This commit is contained in:
Kung-vr
2019-10-16 15:47:05 +09:00
parent 6f5d7504a9
commit 17e038bf1d
10 changed files with 127 additions and 174 deletions
+89 -137
View File
@@ -153,12 +153,6 @@ void MoveCenterTabController::initStage1()
{
m_universeCenteredRotation = value.toBool();
}
value = settings->value( "enableSeatedOffsetsRecenter",
m_enableSeatedOffsetsRecenter );
if ( value.isValid() && !value.isNull() )
{
m_enableSeatedOffsetsRecenter = value.toBool();
}
value = settings->value( "enableSeatedMotion", m_enableSeatedMotion );
if ( value.isValid() && !value.isNull() )
{
@@ -353,10 +347,6 @@ void MoveCenterTabController::outputLogSettings()
{
LOG( INFO ) << "LOADED SETTINGS: Universe-Centered Rotation Enabled";
}
if ( m_enableSeatedOffsetsRecenter )
{
LOG( INFO ) << "LOADED SETTINGS: Seated Offsets Recenter Enabled";
}
if ( m_enableSeatedMotion )
{
LOG( INFO ) << "LOADED SETTINGS: Seated Motion Enabled";
@@ -1191,30 +1181,6 @@ void MoveCenterTabController::setUniverseCenteredRotation( bool value,
<< m_universeCenteredRotation;
}
bool MoveCenterTabController::enableSeatedOffsetsRecenter() const
{
return m_enableSeatedOffsetsRecenter;
}
void MoveCenterTabController::setEnableSeatedOffsetsRecenter( bool value,
bool notify )
{
m_enableSeatedOffsetsRecenter = value;
auto settings = OverlayController::appSettings();
settings->beginGroup( "playspaceSettings" );
settings->setValue( "enableSeatedOffsetsRecenter",
m_enableSeatedOffsetsRecenter );
settings->endGroup();
settings->sync();
if ( notify )
{
emit enableSeatedOffsetsRecenterChanged(
m_enableSeatedOffsetsRecenter );
}
LOG( INFO ) << "CHANGED SETTINGS: Enable Seated Offsets Recenter Set: "
<< m_enableSeatedOffsetsRecenter;
}
bool MoveCenterTabController::isInitComplete() const
{
return m_initComplete;
@@ -1285,11 +1251,6 @@ void MoveCenterTabController::shutdown()
void MoveCenterTabController::incomingSeatedReset()
{
if ( parent->enableDebug() && parent->debugState() == 2 )
{
return;
}
if ( m_enableSeatedMotion )
{
updateSeatedResetData();
@@ -1304,6 +1265,12 @@ void MoveCenterTabController::reset()
"basis is acquired!";
return;
}
if ( m_pendingSeatedRecenter )
{
vr::VRChaperoneSetup()->GetWorkingSeatedZeroPoseToRawTrackingPose(
&m_seatedCenterForReset );
m_pendingSeatedRecenter = false;
}
vr::VRChaperoneSetup()->HideWorkingSetPreview();
m_heightToggle = false;
emit heightToggleChanged( m_heightToggle );
@@ -1468,6 +1435,11 @@ void MoveCenterTabController::zeroOffsets()
}
}
void MoveCenterTabController::sendSeatedRecenter()
{
vr::VRSystem()->ResetSeatedZeroPose();
}
double MoveCenterTabController::getHmdYawTotal()
{
return m_hmdYawTotal;
@@ -1492,88 +1464,24 @@ void MoveCenterTabController::clampVelocity( double* velocity )
void MoveCenterTabController::updateSeatedResetData()
{
if ( !( parent->enableDebug() && parent->debugState() == 1 ) )
{
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<int>( 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;
if ( m_enableSeatedOffsetsRecenter )
{
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 );
}
if ( parent->enableDebug() )
{
switch ( parent->debugState() )
{
case 3:
{
vr::VRChaperoneSetup()->GetWorkingStandingZeroPoseToRawTrackingPose(
&m_seatedCenterForReset );
}
break;
case 4:
{
vr::VRChaperoneSetup()->GetWorkingSeatedZeroPoseToRawTrackingPose(
&m_seatedCenterForReset );
}
break;
case 5:
{
vr::VRChaperoneSetup()->GetLiveSeatedZeroPoseToRawTrackingPose(
&m_seatedCenterForReset );
}
break;
case 6:
{
m_seatedCenterForReset
= vr::VRSystem()
->GetSeatedZeroPoseToStandingAbsoluteTrackingPose();
}
break;
}
}
unsigned checkQuadCount = 0;
vr::VRChaperoneSetup()->GetWorkingCollisionBoundsInfo( nullptr,
&checkQuadCount );
if ( checkQuadCount > 0 )
{
parent->chaperoneUtils().loadChaperoneData( false );
}
m_heightToggle = false;
emit heightToggleChanged( m_heightToggle );
m_oldOffsetX = 0.0f;
m_oldOffsetY = 0.0f;
m_oldOffsetZ = 0.0f;
m_oldRotation = 0;
m_offsetX = 0.0f;
m_offsetY = 0.0f;
m_offsetZ = 0.0f;
m_rotation = 0;
emit offsetXChanged( m_offsetX );
emit offsetYChanged( m_offsetY );
emit offsetZChanged( m_offsetZ );
emit rotationChanged( m_rotation );
vr::VRChaperoneSetup()->ReloadFromDisk( vr::EChaperoneConfigFile_Live );
// set pending update here, will be processed on next instance of motion or
// running the reset() function.
m_pendingSeatedRecenter = true;
}
void MoveCenterTabController::updateChaperoneResetData()
@@ -1590,19 +1498,8 @@ void MoveCenterTabController::updateChaperoneResetData()
vr::VRChaperoneSetup()->GetWorkingStandingZeroPoseToRawTrackingPose(
&m_universeCenterForReset );
// 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;
vr::VRChaperoneSetup()->GetWorkingSeatedZeroPoseToRawTrackingPose(
&m_seatedCenterForReset );
if ( m_collisionBoundsCountForReset > 0 )
{
@@ -2506,7 +2403,23 @@ void MoveCenterTabController::updateHandDrag(
return;
}
vr::TrackedDevicePose_t* movePose = devicePoses + moveHandId;
vr::TrackedDevicePose_t* movePose;
if ( m_seatedModeDetected )
{
vr::TrackedDevicePose_t
seatedDevicePoses[vr::k_unMaxTrackedDeviceCount];
vr::VRSystem()->GetDeviceToAbsoluteTrackingPose(
vr::TrackingUniverseSeated,
0.0f,
seatedDevicePoses,
vr::k_unMaxTrackedDeviceCount );
movePose = seatedDevicePoses + moveHandId;
}
else
{
movePose = devicePoses + moveHandId;
}
if ( !movePose->bPoseIsValid || !movePose->bDeviceIsConnected
|| movePose->eTrackingResult != vr::TrackingResult_Running_OK )
{
@@ -2783,6 +2696,17 @@ void MoveCenterTabController::updateSpace()
updateChaperoneResetData();
}
// do a late on-demand setting of seated center basis when we need it for
// motion. This gives the reload from disk a little more time to complete
// before we apply the new seated basis.
if ( m_pendingSeatedRecenter )
{
vr::VRChaperoneSetup()->GetWorkingSeatedZeroPoseToRawTrackingPose(
&m_seatedCenterForReset );
m_pendingSeatedRecenter = false;
}
vr::HmdMatrix34_t offsetUniverseCenter;
// set offsetUniverseCenter to the current angle
@@ -2884,9 +2808,37 @@ void MoveCenterTabController::updateSpace()
// keep the seated origin synced with offsets if in seated mode
if ( m_trackingUniverse == vr::TrackingUniverseSeated )
{
vr::HmdMatrix34_t offsetSeatedCenter = offsetUniverseCenter;
vr::HmdMatrix34_t offsetSeatedCenter;
offsetSeatedCenter.m[1][3] += m_seatedHeight;
// set offsetSeatedCenter to the current angle
utils::matMul33(
offsetSeatedCenter, rotationMatrix, m_seatedCenterForReset );
// fill in matrix coordinates for basis universe zero point
offsetSeatedCenter.m[0][3] = m_seatedCenterForReset.m[0][3];
offsetSeatedCenter.m[1][3] = m_seatedCenterForReset.m[1][3];
offsetSeatedCenter.m[2][3] = m_seatedCenterForReset.m[2][3];
// move offsetSeatedCenter to the current offsets
offsetSeatedCenter.m[0][3]
+= m_seatedCenterForReset.m[0][0] * m_offsetX;
offsetSeatedCenter.m[1][3]
+= m_seatedCenterForReset.m[1][0] * m_offsetX;
offsetSeatedCenter.m[2][3]
+= m_seatedCenterForReset.m[2][0] * m_offsetX;
offsetSeatedCenter.m[0][3]
+= m_seatedCenterForReset.m[0][1] * m_offsetY;
offsetSeatedCenter.m[1][3]
+= m_seatedCenterForReset.m[1][1] * m_offsetY;
offsetSeatedCenter.m[2][3]
+= m_seatedCenterForReset.m[2][1] * m_offsetY;
offsetSeatedCenter.m[0][3]
+= m_seatedCenterForReset.m[0][2] * m_offsetZ;
offsetSeatedCenter.m[1][3]
+= m_seatedCenterForReset.m[1][2] * m_offsetZ;
offsetSeatedCenter.m[2][3]
+= m_seatedCenterForReset.m[2][2] * m_offsetZ;
vr::VRChaperoneSetup()->SetWorkingSeatedZeroPoseToRawTrackingPose(
&offsetSeatedCenter );