64 lines
2.1 KiB
C#
64 lines
2.1 KiB
C#
// Copyright (c) Meta Platforms, Inc. and affiliates. All rights reserved.
|
|
|
|
using UnityEngine;
|
|
|
|
namespace Meta.XR.Movement.Utils
|
|
{
|
|
/// <summary>
|
|
/// Allows restarting tracking after the HMD is unmounted and remounted.
|
|
/// This can be used to resolve body tracking errors that might be seen after
|
|
/// remounting the HMD.
|
|
/// </summary>
|
|
public class HMDRemountRestartTracking : MonoBehaviour
|
|
{
|
|
private bool _wasUnmountedBefore = false;
|
|
|
|
private void Start()
|
|
{
|
|
OVRManager.HMDMounted += HandleHMDMounted;
|
|
OVRManager.HMDUnmounted += HandleHMDUnmounted;
|
|
}
|
|
|
|
private void OnDestroy()
|
|
{
|
|
OVRManager.HMDMounted -= HandleHMDMounted;
|
|
OVRManager.HMDUnmounted -= HandleHMDUnmounted;
|
|
}
|
|
|
|
private void HandleHMDMounted()
|
|
{
|
|
// If the HMD was removed before a mount event, attempt a reboot of tracking.
|
|
// Otherwise, don't bother.
|
|
if (!_wasUnmountedBefore)
|
|
{
|
|
return;
|
|
}
|
|
|
|
Debug.Log("Rebooting body tracking after HMD remounted. Stopping...");
|
|
OVRPlugin.StopBodyTracking();
|
|
|
|
Debug.Log("Starting body tracking.");
|
|
var currentJointSet = OVRRuntimeSettings.GetRuntimeSettings().BodyTrackingJointSet;
|
|
if (!OVRPlugin.StartBodyTracking2(currentJointSet))
|
|
{
|
|
Debug.LogWarning(
|
|
$"Failed to start body tracking with joint set {currentJointSet} after remounting HMD.");
|
|
}
|
|
|
|
var currentFidelity = OVRRuntimeSettings.GetRuntimeSettings().BodyTrackingFidelity;
|
|
bool fidelityChangeSuccessful = OVRPlugin.RequestBodyTrackingFidelity(currentFidelity);
|
|
if (!fidelityChangeSuccessful)
|
|
{
|
|
Debug.LogWarning($"Failed to set Body Tracking fidelity to: {currentFidelity} after remounting HMD.");
|
|
}
|
|
|
|
_wasUnmountedBefore = false;
|
|
}
|
|
|
|
private void HandleHMDUnmounted()
|
|
{
|
|
_wasUnmountedBefore = true;
|
|
}
|
|
}
|
|
}
|