// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
using System;
using System.Runtime.InteropServices;
using UnityEngine;
namespace Microsoft.MixedReality.OpenXR
{
///
/// Interop functions for Windows Perception APIs
///
public static class PerceptionInterop
{
private static MixedRealityFeaturePlugin Feature => OpenXRFeaturePlugin.Feature;
///
/// Get a COM wrapper object of a Windows.Perception.Spatial.SpatialCoordinateSystem object
/// located at the given pose in the current Unity scene.
/// If failed, the function returns nullptr.
/// The application should acquire a new one when session origin is changed or tracking mode is changed
/// by listening to XRInputSubsystem.trackingOriginUpdated and monitoring ARSession.currentTrackingMode.
///
/// The pose of returned coordinate system in the current Unity scene.
/// If input Pose.identity, the returned coordinate system will be at the origin of the current Unity scene.
/// Returns a COM wrapper C# object of type Windows.Perception.Spatial.SpatialCoordinateSystem.
/// Returns null if such coordinate system cannot be found at the moment.
public static object GetSceneCoordinateSystem(Pose poseInScene)
{
if (Feature.IsValidAndEnabled() && OpenXRContext.Current.IsSessionRunning)
{
IntPtr unknown = NativeLib.TryAcquireSceneCoordinateSystem(poseInScene);
if (unknown != IntPtr.Zero)
{
object result = Marshal.GetObjectForIUnknown(unknown);
Marshal.Release(unknown); // Balance the ref count because "feature.TryAcquire" increment it on return.
return result;
}
}
return null;
}
}
}