Загрузка PICO Unity OpenXR Integration SDK

This commit is contained in:
2024-12-21 10:28:02 +03:00
parent b2ecc77b2a
commit a2c2504d48
628 changed files with 68895 additions and 2 deletions

View File

@ -0,0 +1,165 @@
#if AR_FOUNDATION
using System;
using System.Collections;
using System.Collections.Generic;
using System.Threading.Tasks;
using Unity.Collections;
using UnityEngine;
using UnityEngine.XR.ARSubsystems;
namespace Unity.XR.PXR
{
public class PICOAnchorSubsystem : XRAnchorSubsystem
{
internal const string k_SubsystemId = "PICOAnchorSubsystem";
class AnchorProvider : Provider
{
private Dictionary<TrackableId, ulong> trackableIdToHandleMap;
private Dictionary<ulong, XRAnchor> handleToXRAnchorMap;
private HashSet<ulong> managedAnchorHandles;
private Dictionary<Guid, ulong> lastAnchorToTime;
private bool isInit = false;
public override void Start()
{
StartSpatialAnchorProvider();
}
private async void StartSpatialAnchorProvider()
{
var result = await PXR_MixedReality.StartSenseDataProvider(PxrSenseDataProviderType.SpatialAnchor);
if (result == PxrResult.SUCCESS)
{
if (!isInit)
{
trackableIdToHandleMap = new Dictionary<TrackableId, ulong>();
handleToXRAnchorMap = new Dictionary<ulong, XRAnchor>();
managedAnchorHandles = new HashSet<ulong>();
isInit = true;
}
}
else
{
Debug.LogError("Spatial Anchor Provider Start Failed:" + result);
}
}
public override void Stop()
{
var result = PXR_MixedReality.StopSenseDataProvider(PxrSenseDataProviderType.SpatialAnchor);
if (result == PxrResult.SUCCESS)
{
}
else
{
Debug.LogError("Spatial Anchor Provider Stop Failed:" + result);
}
}
public override void Destroy()
{
}
public override TrackableChanges<XRAnchor> GetChanges(XRAnchor defaultAnchor, Allocator allocator)
{
return new TrackableChanges<XRAnchor>();
}
public override bool TryAddAnchor(Pose pose, out XRAnchor anchor)
{
var tcs = new TaskCompletionSource<(PxrResult result, ulong anchorHandle, Guid uuid)>();
var tcs2 = new TaskCompletionSource<PxrResult>();
Task.Run(() =>
{
var (pxrResult, handle, guid) = PXR_MixedReality.CreateSpatialAnchorAsync(pose.position, pose.rotation).Result;
tcs.SetResult((pxrResult, handle, guid));
});
var (result, anchorHandle, uuid) = tcs.Task.Result;
if (result == PxrResult.SUCCESS)
{
Task.Run(() =>
{
var pxrResult = PXR_MixedReality.PersistSpatialAnchorAsync(anchorHandle).Result;
tcs2.SetResult(pxrResult);
});
var result2 = tcs2.Task.Result;
if (result2 == PxrResult.SUCCESS)
{
var bytes = uuid.ToByteArray();
var trackabledId = new TrackableId(BitConverter.ToUInt64(bytes, 0), BitConverter.ToUInt64(bytes, 8));
var nativePtr = new IntPtr((long)anchorHandle);
anchor = new XRAnchor(trackabledId, pose, TrackingState.Tracking, nativePtr);
trackableIdToHandleMap[trackabledId] = anchorHandle;
handleToXRAnchorMap[anchorHandle] = anchor;
return true;
}
else
{
anchor = XRAnchor.defaultValue;
return false;
}
}
else
{
anchor = XRAnchor.defaultValue;
return false;
}
}
public async Task<bool> QuerySpatialAnchors()
{
return false;
}
public override bool TryRemoveAnchor(TrackableId anchorId)
{
var anchorHandle = trackableIdToHandleMap[anchorId];
var result = PXR_MixedReality.DestroyAnchor(anchorHandle);
if (result == PxrResult.SUCCESS)
{
var tcs = new TaskCompletionSource<PxrResult>();
Task.Run(() =>
{
var pxrResult = PXR_MixedReality.UnPersistSpatialAnchorAsync(anchorHandle).Result;
tcs.SetResult(pxrResult);
});
var result1 = tcs.Task.Result;
if (result1 == PxrResult.SUCCESS)
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
}
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
static void RegisterDescriptor()
{
var cInfo = new XRAnchorSubsystemDescriptor.Cinfo()
{
id = k_SubsystemId,
providerType = typeof(AnchorProvider),
subsystemTypeOverride = typeof(PICOAnchorSubsystem),
supportsTrackableAttachments = false
};
XRAnchorSubsystemDescriptor.Create(cInfo);
}
}
}
#endif

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 3fc1ceb510674152beda5a7148d8a52d
timeCreated: 1723083100

View File

@ -0,0 +1,70 @@
#if AR_FOUNDATION
using UnityEngine;
using UnityEngine.XR.ARSubsystems;
namespace Unity.XR.OpenXR.Features.PICOSupport
{
public class PICOCameraSubsystem: XRCameraSubsystem
{
internal const string k_SubsystemId = "PICOCameraSubsystem";
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
static void RegisterDescriptor()
{
var cameraSubsystemCinfo = new XRCameraSubsystemCinfo
{
id = k_SubsystemId,
providerType = typeof(PICOOpenXRProvider),
subsystemTypeOverride = typeof(PICOCameraSubsystem),
supportsAverageBrightness = false,
supportsAverageColorTemperature = false,
supportsColorCorrection = false,
supportsDisplayMatrix = false,
supportsProjectionMatrix = false,
supportsTimestamp = false,
supportsCameraConfigurations = false,
supportsCameraImage = false,
supportsAverageIntensityInLumens = false,
supportsFocusModes = false,
supportsFaceTrackingAmbientIntensityLightEstimation = false,
supportsFaceTrackingHDRLightEstimation = false,
supportsWorldTrackingAmbientIntensityLightEstimation = false,
supportsWorldTrackingHDRLightEstimation = false,
supportsCameraGrain = false,
};
if (!XRCameraSubsystem.Register(cameraSubsystemCinfo))
{
PLog.e($"Failed to register the {k_SubsystemId} subsystem.");
}
}
class PICOOpenXRProvider : Provider
{
/// <summary>
/// Construct the camera functionality provider for Meta.
/// </summary>
public PICOOpenXRProvider()
{
}
/// <summary>
/// Start the camera functionality.
/// </summary>
public override void Start() => PassthroughFeature.EnableSeeThroughManual(true);
/// <summary>
/// Stop the camera functionality.
/// </summary>
public override void Stop() => PassthroughFeature.EnableSeeThroughManual(false);
/// <summary>
/// Destroy any resources required for the camera functionality.
/// </summary>
public override void Destroy() => PassthroughFeature.Destroy();
}
}
}
#endif

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 871b6ba16680eb74d9d891e95cf83bdc
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,114 @@
#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

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 98b3f31743cc4f1bb07a6c05b82dcd10
timeCreated: 1723083167