VR4RoboticArm2/VR4RoboticArm/Library/PackageCache/com.meta.xr.sdk.movement/Runtime/Native/Scripts/Utils/HMDRemountRestartTracking.cs
IonutMocanu 48cccc22ad Main2
2025-09-08 11:13:29 +03:00

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;
}
}
}