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.

63 lines
1.9 KiB

4 years ago
  1. using System;
  2. using System.Runtime.InteropServices;
  3. using UnityEngine.XR.ARSubsystems;
  4. namespace UnityEngine.XR.ARCore
  5. {
  6. [StructLayout(LayoutKind.Sequential)]
  7. internal struct ManagedReferenceImage : IDisposable
  8. {
  9. public ManagedReferenceImage(XRReferenceImage referenceImage)
  10. {
  11. guid = referenceImage.guid;
  12. textureGuid = referenceImage.textureGuid;
  13. size = referenceImage.specifySize ? referenceImage.size : Vector2.zero;
  14. name = GCHandle.ToIntPtr(GCHandle.Alloc(referenceImage.name));
  15. texture = GCHandle.ToIntPtr(GCHandle.Alloc(referenceImage.texture));
  16. }
  17. public unsafe XRReferenceImage ToReferenceImage()
  18. {
  19. Vector2? maybeSize;
  20. if (size.x > 0)
  21. {
  22. maybeSize = size;
  23. }
  24. else
  25. {
  26. maybeSize = null;
  27. }
  28. return new XRReferenceImage(
  29. AsSerializedGuid(guid),
  30. AsSerializedGuid(textureGuid),
  31. maybeSize,
  32. ResolveGCHandle<string>(name),
  33. ResolveGCHandle<Texture2D>(texture));
  34. }
  35. public void Dispose()
  36. {
  37. GCHandle.FromIntPtr(texture).Free();
  38. texture = IntPtr.Zero;
  39. GCHandle.FromIntPtr(name).Free();
  40. name = IntPtr.Zero;
  41. }
  42. unsafe SerializableGuid AsSerializedGuid(Guid guid)
  43. {
  44. TrackableId trackableId;
  45. *(Guid*)&trackableId = guid;
  46. return new SerializableGuid(trackableId.subId1, trackableId.subId2);
  47. }
  48. static T ResolveGCHandle<T>(IntPtr ptr) where T : class => (ptr == IntPtr.Zero) ? null : GCHandle.FromIntPtr(ptr).Target as T;
  49. public Guid guid;
  50. public Guid textureGuid;
  51. public Vector2 size;
  52. public IntPtr name;
  53. public IntPtr texture;
  54. }
  55. }