SW 중심대학 OSS GIT 서버 박건태, 이승준, 고기완, 이준호 새로운 배포
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

78 lines
2.7 KiB

4 years ago
  1. using System.Runtime.InteropServices;
  2. using Unity.Collections;
  3. using Unity.Collections.LowLevel.Unsafe;
  4. using UnityEngine.Scripting;
  5. using UnityEngine.XR.ARSubsystems;
  6. namespace UnityEngine.XR.ARKit
  7. {
  8. /// <summary>
  9. /// ARKit implementation of the <c>XRRaycastSubsystem</c>. Do not create this directly. Use the <c>SubsystemManager</c> instead.
  10. /// </summary>
  11. [Preserve]
  12. public sealed class ARKitRaycastSubsystem : XRRaycastSubsystem
  13. {
  14. protected override Provider CreateProvider() => new ARKitProvider();
  15. class ARKitProvider : XRRaycastSubsystem.Provider
  16. {
  17. public override unsafe NativeArray<XRRaycastHit> Raycast(
  18. XRRaycastHit defaultRaycastHit,
  19. Vector2 screenPoint,
  20. TrackableType trackableTypeMask,
  21. Allocator allocator)
  22. {
  23. void* hitResults;
  24. int count;
  25. NativeApi.UnityARKit_raycast_acquireHitResults(
  26. screenPoint,
  27. trackableTypeMask,
  28. out hitResults,
  29. out count);
  30. var results = new NativeArray<XRRaycastHit>(count, allocator);
  31. NativeApi.UnityARKit_raycast_copyAndReleaseHitResults(
  32. UnsafeUtility.AddressOf(ref defaultRaycastHit),
  33. UnsafeUtility.SizeOf<XRRaycastHit>(),
  34. hitResults,
  35. results.GetUnsafePtr());
  36. return results;
  37. }
  38. }
  39. [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
  40. static void RegisterDescriptor()
  41. {
  42. #if UNITY_IOS && !UNITY_EDITOR
  43. XRRaycastSubsystemDescriptor.RegisterDescriptor(new XRRaycastSubsystemDescriptor.Cinfo
  44. {
  45. id = "ARKit-Raycast",
  46. subsystemImplementationType = typeof(ARKitRaycastSubsystem),
  47. supportsViewportBasedRaycast = true,
  48. supportsWorldBasedRaycast = false,
  49. supportedTrackableTypes =
  50. TrackableType.Planes |
  51. TrackableType.FeaturePoint
  52. });
  53. #endif
  54. }
  55. static class NativeApi
  56. {
  57. [DllImport("__Internal")]
  58. public static unsafe extern void UnityARKit_raycast_acquireHitResults(
  59. Vector2 screenPoint,
  60. TrackableType filter,
  61. out void* hitResults,
  62. out int hitCount);
  63. [DllImport("__Internal")]
  64. public static unsafe extern void UnityARKit_raycast_copyAndReleaseHitResults(
  65. void* defaultHit,
  66. int stride,
  67. void* hitResults,
  68. void* dstBuffer);
  69. }
  70. }
  71. }