ARKitRaycastSubsystem.cs
2.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
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);
}
}
}