This repository has been archived on 2020-08-22. You can view files and clone it, but cannot push or open issues or pull requests.
flutter-unity-view-widget/example/unity/ARDemoApp/Library/PackageCache/com.unity.xr.arkit@3.0.0-pr.../Runtime/ARKitRaycastSubsystem.cs

79 lines
2.8 KiB
C#

using System.Runtime.InteropServices;
using Unity.Collections;
using Unity.Collections.LowLevel.Unsafe;
using UnityEngine.Scripting;
using UnityEngine.XR.ARSubsystems;
namespace UnityEngine.XR.ARKit
{
/// <summary>
/// ARKit implementation of the <c>XRRaycastSubsystem</c>. Do not create this directly. Use the <c>SubsystemManager</c> instead.
/// </summary>
[Preserve]
public sealed class ARKitRaycastSubsystem : XRRaycastSubsystem
{
protected override Provider CreateProvider() => new ARKitProvider();
class ARKitProvider : XRRaycastSubsystem.Provider
{
public override unsafe NativeArray<XRRaycastHit> Raycast(
XRRaycastHit defaultRaycastHit,
Vector2 screenPoint,
TrackableType trackableTypeMask,
Allocator allocator)
{
void* hitResults;
int count;
NativeApi.UnityARKit_raycast_acquireHitResults(
screenPoint,
trackableTypeMask,
out hitResults,
out count);
var results = new NativeArray<XRRaycastHit>(count, allocator);
NativeApi.UnityARKit_raycast_copyAndReleaseHitResults(
UnsafeUtility.AddressOf(ref defaultRaycastHit),
UnsafeUtility.SizeOf<XRRaycastHit>(),
hitResults,
results.GetUnsafePtr());
return results;
}
}
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
static void RegisterDescriptor()
{
#if UNITY_IOS && !UNITY_EDITOR
XRRaycastSubsystemDescriptor.RegisterDescriptor(new XRRaycastSubsystemDescriptor.Cinfo
{
id = "ARKit-Raycast",
subsystemImplementationType = typeof(ARKitRaycastSubsystem),
supportsViewportBasedRaycast = true,
supportsWorldBasedRaycast = false,
supportedTrackableTypes =
TrackableType.Planes |
TrackableType.FeaturePoint
});
#endif
}
static class NativeApi
{
[DllImport("__Internal")]
public static unsafe extern void UnityARKit_raycast_acquireHitResults(
Vector2 screenPoint,
TrackableType filter,
out void* hitResults,
out int hitCount);
[DllImport("__Internal")]
public static unsafe extern void UnityARKit_raycast_copyAndReleaseHitResults(
void* defaultHit,
int stride,
void* hitResults,
void* dstBuffer);
}
}
}