using System;
using System.Runtime.InteropServices;
using Unity.Collections;
using UnityEngine.Scripting;
using UnityEngine.XR.ARSubsystems;
namespace UnityEngine.XR.ARKit
{
///
/// An ARKit-specific implementation of the XRObjectTrackingSubsystem. Do not create this directly. Use the SubsystemManager instead.
///
[Obsolete("ARKitXRObjectTrackingSubsystem has been deprecated in Apple ARKit XR Plug-in 6.0. Use ARKitObjectTrackingSubsystem instead (UnityUpgradable) -> UnityEngine.XR.ARKit.ARKitObjectTrackingSubsystem", true)]
public sealed class ARKitXRObjectTrackingSubsystem : XRObjectTrackingSubsystem
{
internal void AddReferenceObject(XRReferenceObjectLibrary library, ARReferenceObject referenceObject)
{
if (library == null)
throw new ArgumentNullException(nameof(library));
if (referenceObject == null)
throw new ArgumentNullException(nameof(referenceObject));
if (this.library == library)
{
ARKitProvider.AddReferenceObject(referenceObject);
}
}
class ARKitProvider : Provider
{
///
/// Invoked when Start is called on the subsystem. This method is only called if the subsystem was not previously running.
///
public override void Start() { }
///
/// Invoked when Stop is called on the subsystem. This method is only called if the subsystem was previously running.
///
public override void Stop() { }
#if UNITY_XR_ARKIT_LOADER_ENABLED
[DllImport("__Internal")]
static extern void UnityARKit_ObjectTracking_Initialize();
[DllImport("__Internal")]
static extern void UnityARKit_ObjectTracking_Shutdown();
[DllImport("__Internal")]
static extern void UnityARKit_ObjectTracking_Stop();
[DllImport("__Internal", EntryPoint = "UnityARKit_ObjectTracking_SetLibrary")]
static extern void SetLibrary(IntPtr referenceObjects);
[DllImport("__Internal")]
static extern unsafe void* UnityARKit_ObjectTracking_AcquireChanges(
out void* addedPtr, out int addedLength,
out void* updatedPtr, out int updatedLength,
out void* removedPtr, out int removedLength,
out int elementSize);
[DllImport("__Internal")]
static extern unsafe void UnityARKit_ObjectTracking_ReleaseChanges(void* changes);
[DllImport("__Internal", EntryPoint = "UnityARKit_ObjectTracking_AddReferenceObject")]
public static extern void AddReferenceObject(ARReferenceObject referenceObject);
#else
static readonly string k_ExceptionMsg = "Apple ARKit XR Plug-in Provider not enabled in project settings.";
static void UnityARKit_ObjectTracking_Initialize()
{
throw new System.NotImplementedException(k_ExceptionMsg);
}
static void UnityARKit_ObjectTracking_Shutdown()
{
throw new System.NotImplementedException(k_ExceptionMsg);
}
static void UnityARKit_ObjectTracking_Stop()
{
throw new System.NotImplementedException(k_ExceptionMsg);
}
static void SetLibrary(IntPtr referenceObjects)
{
throw new System.NotImplementedException(k_ExceptionMsg);
}
static unsafe void* UnityARKit_ObjectTracking_AcquireChanges(
out void* addedPtr, out int addedLength,
out void* updatedPtr, out int updatedLength,
out void* removedPtr, out int removedLength,
out int elementSize)
{
throw new System.NotImplementedException(k_ExceptionMsg);
}
static unsafe void UnityARKit_ObjectTracking_ReleaseChanges(void* changes)
{
throw new System.NotImplementedException(k_ExceptionMsg);
}
public static void AddReferenceObject(ARReferenceObject referenceObject)
{
throw new System.NotImplementedException(k_ExceptionMsg);
}
#endif
public override unsafe XRReferenceObjectLibrary library
{
set
{
if (value == null)
{
UnityARKit_ObjectTracking_Stop();
}
else
{
var referenceObjects = new NSMutableSet(NSObject.Initialization.Default);
try
{
foreach (var obj in value)
{
var entry = obj.FindEntry();
if (entry)
{
var referenceObject = entry.GetARKitReferenceObject(obj);
if (referenceObject != null)
{
referenceObjects.Add(referenceObject);
}
}
}
SetLibrary(referenceObjects.AsIntPtr());
}
finally
{
referenceObjects.Dispose();
}
}
}
}
public override unsafe TrackableChanges GetChanges(
XRTrackedObject defaultTrackedObject,
Allocator allocator)
{
int addedLength, updatedLength, removedLength, elementSize;
void* addedPtr, updatedPtr, removedPtr;
var context = UnityARKit_ObjectTracking_AcquireChanges(
out addedPtr, out addedLength,
out updatedPtr, out updatedLength,
out removedPtr, out removedLength,
out elementSize);
try
{
return new TrackableChanges(
addedPtr, addedLength,
updatedPtr, updatedLength,
removedPtr, removedLength,
defaultTrackedObject, elementSize,
allocator);
}
finally
{
UnityARKit_ObjectTracking_ReleaseChanges(context);
}
}
public override void Destroy() => UnityARKit_ObjectTracking_Shutdown();
public ARKitProvider() => UnityARKit_ObjectTracking_Initialize();
}
}
}