| 340 | } |
| 341 | |
| 342 | OVR_PUBLIC_FUNCTION(ovrResult) ovr_SpecifyTrackingOrigin(ovrSession session, ovrPosef originPose) |
| 343 | { |
| 344 | vr::ChaperoneCalibrationState calibrationState = vr::VRChaperone()->GetCalibrationState(); |
| 345 | if (calibrationState >= vr::ChaperoneCalibrationState_Error) |
| 346 | return ovrSuccess_BoundaryInvalid; |
| 347 | |
| 348 | float yaw = 0.0f; |
| 349 | OVR::Posef(originPose).Rotation.GetYawPitchRoll(&yaw, nullptr, nullptr); |
| 350 | if (yaw == 0.0f && OVR::Posef(originPose).Rotation != OVR::Quatf::Identity()) |
| 351 | return ovrError_InvalidParameter; |
| 352 | |
| 353 | vr::HmdMatrix34_t workingPose; |
| 354 | vr::ETrackingUniverseOrigin origin = vr::VRCompositor()->GetTrackingSpace(); |
| 355 | vr::VRChaperoneSetup()->RevertWorkingCopy(); |
| 356 | if (origin == vr::TrackingUniverseOrigin::TrackingUniverseSeated) |
| 357 | vr::VRChaperoneSetup()->GetWorkingSeatedZeroPoseToRawTrackingPose(&workingPose); |
| 358 | else |
| 359 | vr::VRChaperoneSetup()->GetWorkingStandingZeroPoseToRawTrackingPose(&workingPose); |
| 360 | |
| 361 | workingPose = REV::Matrix4f(OVR::Matrix4f::RotationY(yaw) * REV::Matrix4f(workingPose) * |
| 362 | OVR::Matrix4f::Translation(originPose.Position)); |
| 363 | |
| 364 | if (origin == vr::TrackingUniverseOrigin::TrackingUniverseSeated) |
| 365 | vr::VRChaperoneSetup()->SetWorkingSeatedZeroPoseToRawTrackingPose(&workingPose); |
| 366 | else |
| 367 | vr::VRChaperoneSetup()->SetWorkingStandingZeroPoseToRawTrackingPose(&workingPose); |
| 368 | vr::VRChaperoneSetup()->CommitWorkingCopy(vr::EChaperoneConfigFile_Live); |
| 369 | return ovrSuccess; |
| 370 | } |
| 371 | |
| 372 | OVR_PUBLIC_FUNCTION(void) ovr_ClearShouldRecenterFlag(ovrSession session) |
| 373 | { |