114 lines
3.4 KiB
C#
114 lines
3.4 KiB
C#
#if AR_FOUNDATION
|
|
using Unity.XR.OpenXR.Features.PICOSupport;
|
|
using Unity.XR.PXR;
|
|
using UnityEngine;
|
|
using UnityEngine.XR.ARSubsystems;
|
|
|
|
public class PICOSessionSubsystem : XRSessionSubsystem
|
|
{
|
|
internal const string k_SubsystemId = "PICOSessionSubsystem";
|
|
|
|
internal static PICOSessionSubsystem instance { get; private set; }
|
|
|
|
/// <summary>
|
|
/// Do not call this directly. Call create on a valid <see cref="XRSessionSubsystemDescriptor"/> instead.
|
|
/// </summary>
|
|
public PICOSessionSubsystem()
|
|
{
|
|
instance = this;
|
|
}
|
|
|
|
internal void OnSessionStateChange(int newState)
|
|
=> ((SessionProvider)provider).OnSessionStateChange(newState);
|
|
|
|
class SessionProvider : Provider
|
|
{
|
|
XrSessionState m_SessionState;
|
|
|
|
/// <inheritdoc/>
|
|
public override TrackingState trackingState
|
|
{
|
|
get
|
|
{
|
|
switch (m_SessionState)
|
|
{
|
|
case XrSessionState.Idle:
|
|
case XrSessionState.Ready:
|
|
case XrSessionState.Synchronized:
|
|
return TrackingState.Limited;
|
|
|
|
case XrSessionState.Visible:
|
|
case XrSessionState.Focused:
|
|
return TrackingState.Tracking;
|
|
|
|
case XrSessionState.Unknown:
|
|
case XrSessionState.Stopping:
|
|
case XrSessionState.LossPending:
|
|
case XrSessionState.Exiting:
|
|
default:
|
|
return TrackingState.None;
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <inheritdoc/>
|
|
public override NotTrackingReason notTrackingReason
|
|
{
|
|
get
|
|
{
|
|
switch (m_SessionState)
|
|
{
|
|
case XrSessionState.Idle:
|
|
case XrSessionState.Ready:
|
|
case XrSessionState.Synchronized:
|
|
return NotTrackingReason.Initializing;
|
|
|
|
case XrSessionState.Visible:
|
|
case XrSessionState.Focused:
|
|
return NotTrackingReason.None;
|
|
|
|
case XrSessionState.Unknown:
|
|
case XrSessionState.Stopping:
|
|
case XrSessionState.LossPending:
|
|
case XrSessionState.Exiting:
|
|
default:
|
|
return NotTrackingReason.Unsupported;
|
|
}
|
|
}
|
|
}
|
|
|
|
public void OnSessionStateChange(int newState)
|
|
{
|
|
m_SessionState = (XrSessionState)newState;
|
|
PLog.i(k_SubsystemId, $" OnSessionStateChange m_SessionState:{m_SessionState}");
|
|
}
|
|
}
|
|
|
|
enum XrSessionState
|
|
{
|
|
Unknown = 0,
|
|
Idle = 1,
|
|
Ready = 2,
|
|
Synchronized = 3,
|
|
Visible = 4,
|
|
Focused = 5,
|
|
Stopping = 6,
|
|
LossPending = 7,
|
|
Exiting = 8,
|
|
}
|
|
|
|
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
|
|
static void RegisterDescriptor()
|
|
{
|
|
XRSessionSubsystemDescriptor.RegisterDescriptor(new XRSessionSubsystemDescriptor.Cinfo
|
|
{
|
|
id = k_SubsystemId,
|
|
providerType = typeof(SessionProvider),
|
|
subsystemTypeOverride = typeof(PICOSessionSubsystem),
|
|
supportsInstall = false,
|
|
supportsMatchFrameRate = false
|
|
});
|
|
}
|
|
|
|
}
|
|
#endif |