OVR_PUBLIC_FUNCTION(ovrTrackingState) ovr_GetTrackingState(ovrSession session, double absTime, ovrBool latencyMarker) { ovrTrackingState state = { 0 }; if (!session) return state; // Gain focus for the compositor float time = (float)ovr_GetTimeInSeconds(); // Get the absolute tracking poses vr::TrackedDevicePose_t* poses = session->poses; // Convert the head pose state.HeadPose = REV_TrackedDevicePoseToOVRPose(poses[vr::k_unTrackedDeviceIndex_Hmd], time); state.StatusFlags = REV_TrackedDevicePoseToOVRStatusFlags(poses[vr::k_unTrackedDeviceIndex_Hmd]); // Convert the hand poses vr::TrackedDeviceIndex_t hands[] = { g_VRSystem->GetTrackedDeviceIndexForControllerRole(vr::TrackedControllerRole_LeftHand), g_VRSystem->GetTrackedDeviceIndexForControllerRole(vr::TrackedControllerRole_RightHand) }; for (int i = 0; i < ovrHand_Count; i++) { vr::TrackedDeviceIndex_t deviceIndex = hands[i]; if (deviceIndex == vr::k_unTrackedDeviceIndexInvalid) { state.HandPoses[i].ThePose = OVR::Posef::Identity(); continue; } state.HandPoses[i] = REV_TrackedDevicePoseToOVRPose(poses[deviceIndex], time); state.HandStatusFlags[i] = REV_TrackedDevicePoseToOVRStatusFlags(poses[deviceIndex]); } OVR::Matrix4f origin = REV_HmdMatrixToOVRMatrix(g_VRSystem->GetSeatedZeroPoseToStandingAbsoluteTrackingPose()); // The calibrated origin should be the location of the seated origin relative to the absolute tracking space. // It currently describes the location of the absolute origin relative to the seated origin, so we have to invert it. origin.Invert(); state.CalibratedOrigin.Orientation = OVR::Quatf(origin); state.CalibratedOrigin.Position = origin.GetTranslation(); return state; }
OVR_PUBLIC_FUNCTION(ovrTrackingState) ovr_GetTrackingState(ovrSession session, double absTime, ovrBool latencyMarker) { ovrTrackingState state = { 0 }; // Gain focus for the compositor float time = (float)ovr_GetTimeInSeconds(); // Get the absolute tracking poses vr::TrackedDevicePose_t* poses = session->gamePoses; // Convert the head pose state.HeadPose = REV_TrackedDevicePoseToOVRPose(poses[vr::k_unTrackedDeviceIndex_Hmd], time); state.StatusFlags = REV_TrackedDevicePoseToOVRStatusFlags(poses[vr::k_unTrackedDeviceIndex_Hmd]); // Convert the hand poses vr::TrackedDeviceIndex_t hands[] = { g_VRSystem->GetTrackedDeviceIndexForControllerRole(vr::TrackedControllerRole_LeftHand), g_VRSystem->GetTrackedDeviceIndexForControllerRole(vr::TrackedControllerRole_RightHand) }; for (int i = 0; i < ovrHand_Count; i++) { vr::TrackedDeviceIndex_t deviceIndex = hands[i]; if (deviceIndex == (uint32_t)-1) { state.HandPoses[i].ThePose = OVR::Posef::Identity(); continue; } state.HandPoses[i] = REV_TrackedDevicePoseToOVRPose(poses[deviceIndex], time); state.HandStatusFlags[i] = REV_TrackedDevicePoseToOVRStatusFlags(poses[deviceIndex]); } // TODO: It looks like this should be set to GetSeatedZeroPoseToStandingAbsoluteTrackingPose()? state.CalibratedOrigin.Orientation = OVR::Quatf(); state.CalibratedOrigin.Position = OVR::Vector3f(); return state; }