NREmulatorTrackableProvider.cs 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. /****************************************************************************
  2. * Copyright 2019 Nreal Techonology Limited. All rights reserved.
  3. *
  4. * This file is part of NRSDK.
  5. *
  6. * https://www.nreal.ai/
  7. *
  8. *****************************************************************************/
  9. namespace NRKernal
  10. {
  11. using System;
  12. using System.Collections.Generic;
  13. using UnityEngine;
  14. #if UNITY_EDITOR
  15. public class NREmulatorTrackableProvider : ITrackableDataProvider
  16. {
  17. public class TrackableInfo
  18. {
  19. public Vector3 position;
  20. public Quaternion rotation;
  21. public float X;
  22. public float Z;
  23. public UInt32 identify;
  24. public ulong handler;
  25. public TrackingState trackingState;
  26. public TrackableType trackableType;
  27. }
  28. protected static Dictionary<UInt32, TrackableInfo> m_TrackablePlaneDict = new Dictionary<uint, TrackableInfo>();
  29. protected static Dictionary<UInt32, TrackableInfo> m_TrackableImageDict = new Dictionary<uint, TrackableInfo>();
  30. private static ulong trackableHandlerIndex = 1;
  31. public uint GetIdentify(ulong trackable_handle)
  32. {
  33. foreach (var item in m_TrackableImageDict)
  34. {
  35. if (item.Value.handler == trackable_handle)
  36. {
  37. return item.Value.identify;
  38. }
  39. }
  40. foreach (var item in m_TrackablePlaneDict)
  41. {
  42. if (item.Value.handler == trackable_handle)
  43. {
  44. return item.Value.identify;
  45. }
  46. }
  47. return 0;
  48. }
  49. public TrackableType GetTrackableType(ulong trackable_handle)
  50. {
  51. var info = GetTrackableInfo(trackable_handle);
  52. if (info != null)
  53. {
  54. return info.trackableType;
  55. }
  56. return TrackableType.TRACKABLE_BASE;
  57. }
  58. public TrackingState GetTrackingState(ulong trackable_handle)
  59. {
  60. var info = GetTrackableInfo(trackable_handle);
  61. if (info != null)
  62. {
  63. return info.trackingState;
  64. }
  65. return TrackingState.Stopped;
  66. }
  67. public TrackableInfo GetTrackableInfo(ulong trackable_handle)
  68. {
  69. foreach (var item in m_TrackableImageDict)
  70. {
  71. if (item.Value.handler == trackable_handle)
  72. {
  73. return item.Value;
  74. }
  75. }
  76. foreach (var item in m_TrackablePlaneDict)
  77. {
  78. if (item.Value.handler == trackable_handle)
  79. {
  80. return item.Value;
  81. }
  82. }
  83. return null;
  84. }
  85. public bool UpdateTrackables(TrackableType trackable_type, List<ulong> trackables)
  86. {
  87. if (trackables == null)
  88. {
  89. trackables = new List<ulong>();
  90. }
  91. trackables.Clear();
  92. if (trackable_type == TrackableType.TRACKABLE_IMAGE)
  93. {
  94. foreach (var item in m_TrackableImageDict)
  95. {
  96. trackables.Add(item.Value.handler);
  97. }
  98. }
  99. else if (trackable_type == TrackableType.TRACKABLE_PLANE)
  100. {
  101. foreach (var item in m_TrackablePlaneDict)
  102. {
  103. trackables.Add(item.Value.handler);
  104. }
  105. }
  106. return true;
  107. }
  108. public static bool UpdateTrackableImageData(Vector3 centerPos, Quaternion centerQua, float extentX, float extentZ, UInt32 id, TrackingState state)
  109. {
  110. TrackableInfo info;
  111. if (m_TrackableImageDict.TryGetValue(id, out info))
  112. {
  113. info.position = centerPos;
  114. info.rotation = centerQua;
  115. info.X = extentX;
  116. info.Z = extentZ;
  117. info.identify = id;
  118. info.trackingState = state;
  119. }
  120. else
  121. {
  122. m_TrackableImageDict.Add(id, new TrackableInfo()
  123. {
  124. position = centerPos,
  125. rotation = centerQua,
  126. X = extentX,
  127. Z = extentZ,
  128. identify = id,
  129. handler = trackableHandlerIndex++,
  130. trackableType = TrackableType.TRACKABLE_IMAGE,
  131. trackingState = state
  132. });
  133. }
  134. return true;
  135. }
  136. public static bool UpdateTrackablePlaneData(Vector3 centerPos, Quaternion centerQua, float extentX, float extentZ, UInt32 identifier, TrackingState state)
  137. {
  138. TrackableInfo info;
  139. if (m_TrackablePlaneDict.TryGetValue(identifier, out info))
  140. {
  141. info.position = centerPos;
  142. info.rotation = centerQua;
  143. info.X = extentX;
  144. info.Z = extentZ;
  145. info.identify = identifier;
  146. info.trackingState = state;
  147. }
  148. else
  149. {
  150. m_TrackablePlaneDict.Add(identifier, new TrackableInfo()
  151. {
  152. position = centerPos,
  153. rotation = centerQua,
  154. X = extentX,
  155. Z = extentZ,
  156. identify = identifier,
  157. handler = trackableHandlerIndex++,
  158. trackableType = TrackableType.TRACKABLE_PLANE,
  159. trackingState = state
  160. });
  161. }
  162. return true;
  163. }
  164. public static bool UpdateTrackableData<T>(Vector3 centerPos, Quaternion centerQua, float extentX, float extentZ, System.UInt32 identifier, TrackingState state) where T : NRTrackable
  165. {
  166. if (typeof(T).Equals(typeof(NRTrackableImage)))
  167. {
  168. return UpdateTrackableImageData(centerPos, centerQua, extentX, extentZ, identifier, state);
  169. }
  170. else if (typeof(T).Equals(typeof(NRTrackablePlane)))
  171. {
  172. return UpdateTrackablePlaneData(centerPos, centerQua, extentX, extentZ, identifier, state);
  173. }
  174. return false;
  175. }
  176. }
  177. public class NREmulatorTrackPlaneProvider : NREmulatorTrackableProvider, ITrackablePlaneDataProvider
  178. {
  179. public void GetBoundaryPolygon(ulong trackable_handle, List<Vector3> polygonList)
  180. {
  181. }
  182. public Pose GetCenterPose(ulong trackable_handle)
  183. {
  184. var info = GetTrackableInfo(trackable_handle);
  185. if (info != null)
  186. {
  187. return new Pose(info.position, info.rotation);
  188. }
  189. return Pose.identity;
  190. }
  191. public float GetExtentX(ulong trackable_handle)
  192. {
  193. var info = GetTrackableInfo(trackable_handle);
  194. if (info != null)
  195. {
  196. return info.X;
  197. }
  198. return 0;
  199. }
  200. public float GetExtentZ(ulong trackable_handle)
  201. {
  202. var info = GetTrackableInfo(trackable_handle);
  203. if (info != null)
  204. {
  205. return info.Z;
  206. }
  207. return 0;
  208. }
  209. public TrackablePlaneType GetPlaneType(ulong trackable_handle)
  210. {
  211. return TrackablePlaneType.HORIZONTAL;
  212. }
  213. }
  214. public class NREmulatorTrackImageProvider : NREmulatorTrackableProvider, ITrackableImageDataProvider
  215. {
  216. public ulong CreateDataBase()
  217. {
  218. return 0;
  219. }
  220. public bool DestroyDataBase(ulong database_handle)
  221. {
  222. return true;
  223. }
  224. public Pose GetCenterPose(ulong trackable_handle)
  225. {
  226. var info = GetTrackableInfo(trackable_handle);
  227. if (info != null)
  228. {
  229. return new Pose(info.position, info.rotation);
  230. }
  231. return Pose.identity;
  232. }
  233. public Vector2 GetSize(ulong trackable_handle)
  234. {
  235. var info = GetTrackableInfo(trackable_handle);
  236. if (info != null)
  237. {
  238. return new Vector2(info.X, info.Z);
  239. }
  240. return Vector2.zero;
  241. }
  242. public bool LoadDataBase(ulong database_handle, string path)
  243. {
  244. return true;
  245. }
  246. }
  247. #endif
  248. }