API_GSXR_Slam.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585
  1. using SC.XR.Unity;
  2. using System;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using UnityEngine;
  6. public class API_GSXR_Slam
  7. {
  8. public static OpenXRCamera OpenXRManager
  9. {
  10. get
  11. {
  12. return OpenXRCamera.Instance;
  13. }
  14. }
  15. public static GSXRManager SlamManager
  16. {
  17. get
  18. {
  19. return GSXRManager.Instance;
  20. }
  21. }
  22. public static GSXRPlugin plugin
  23. {
  24. get
  25. {
  26. return GSXRPlugin.Instance;
  27. }
  28. }
  29. ///API-No.1
  30. /// <summary>
  31. /// 设置眼镜进入模式,运行过程中可修改
  32. /// </summary>
  33. public static void GSXR_Set_TrackMode(TrackMode mode)
  34. {
  35. if (API_GSXR_Slam.SlamManager != null)
  36. {
  37. int trackingMode = API_GSXR_Slam.plugin.GetTrackingMode();
  38. if (mode == TrackMode.Mode_6Dof)
  39. {
  40. trackingMode |= (int)GSXRPlugin.TrackingMode.kTrackingPosition;
  41. }
  42. else
  43. {
  44. trackingMode &= (int)(~(1 << 1));
  45. }
  46. API_GSXR_Slam.plugin.SetTrackingMode(trackingMode);
  47. }
  48. }
  49. ///API-No.2
  50. /// <summary>
  51. /// Slam系统是否在运行
  52. /// </summary>
  53. /// <returns>true表示在运行,false表示未运行(Pause时为false)</returns>
  54. public static bool GSXR_Is_SlamRunning() {
  55. if (API_GSXR_Slam.SlamManager != null) {
  56. return API_GSXR_Slam.SlamManager.status.running;
  57. }
  58. return false;
  59. }
  60. ///API-No.3
  61. /// <summary>
  62. /// Slam系统是否初始化完成
  63. /// </summary>
  64. /// <returns></returns>
  65. public static bool GSXR_Is_SlamInitialized() {
  66. if (API_GSXR_Slam.SlamManager != null) {
  67. return API_GSXR_Slam.SlamManager.status.initialized;
  68. }
  69. return false;
  70. }
  71. ///API-No.4
  72. /// <summary>
  73. /// 设置Slam初始化完成时的回调
  74. /// </summary>
  75. /// <param name="action"></param>
  76. public static void GSXR_Add_InitializedCallBack(Action action)
  77. {
  78. GSXRManager.SlamInitializedCallBack += action;
  79. }
  80. ///API-No.5
  81. public static void GSXR_Remove_InitializedCallBack(Action action)
  82. {
  83. GSXRManager.SlamInitializedCallBack -= action;
  84. }
  85. ///API-No.6
  86. /// <summary>
  87. /// 设置渲染帧率,只能在Start中调用
  88. /// </summary>
  89. /// <param name="frameRate">默认-1表示系统默认帧率,设置范围0-200</param>
  90. public static void GSXR_Set_RenderFrame(int frameRate = -1)
  91. {
  92. if (API_GSXR_Slam.SlamManager != null)
  93. {
  94. if (frameRate == -1)
  95. {
  96. API_GSXR_Slam.plugin.SetVSyncCount((int)(API_GSXR_Slam.SlamManager.settings.vSyncCount = GSXRManager.SlamSettings.eVSyncCount.k1));
  97. QualitySettings.vSyncCount = (int)(API_GSXR_Slam.SlamManager.settings.vSyncCount = GSXRManager.SlamSettings.eVSyncCount.k1);//Vsync
  98. }
  99. else
  100. {
  101. API_GSXR_Slam.plugin.SetVSyncCount((int)(API_GSXR_Slam.SlamManager.settings.vSyncCount = GSXRManager.SlamSettings.eVSyncCount.k0));
  102. QualitySettings.vSyncCount = (int)(API_GSXR_Slam.SlamManager.settings.vSyncCount = GSXRManager.SlamSettings.eVSyncCount.k0);//Don't sync
  103. Application.targetFrameRate = (frameRate >= 0 && frameRate < 200) ? frameRate : 75;
  104. }
  105. }
  106. }
  107. ///API-No.7
  108. /// <summary>
  109. /// 获取左右眼摄像头
  110. /// </summary>
  111. /// <returns>List[0]左眼 List[1]右眼,空表示系统未启动完成</returns>
  112. public static List<Camera> GSXR_Get_EyeCameras()
  113. {
  114. List<Camera> cameraList = new List<Camera>(2);
  115. if (API_GSXR_Slam.SlamManager != null && API_GSXR_Slam.SlamManager.status.running == true)
  116. {
  117. cameraList.Add(Camera.main);
  118. cameraList.Add(API_GSXR_Slam.SlamManager.rightCamera);
  119. }
  120. return cameraList;
  121. }
  122. ///API-No.8
  123. /// <summary>
  124. /// 获取左右眼渲染的画面,为获取当前帧的渲染结果,当前帧结束时调用
  125. /// </summary>
  126. /// <returns>List[0]左眼 List[1]右眼,空表示系统未启动完成</returns>
  127. public static List<RenderTexture> GSXR_Get_RenderTexure()
  128. {
  129. List<Camera> cameraList = GSXR_Get_EyeCameras();
  130. List<RenderTexture> RTList = new List<RenderTexture>(2);
  131. foreach (var item in cameraList)
  132. {
  133. RTList.Add(item.targetTexture);
  134. }
  135. return RTList;
  136. }
  137. ///API-No.9
  138. /// <summary>
  139. /// 获取头部物体,如果想获取头部的旋转移动等数据,在LateUpdate方法里调用
  140. /// </summary>
  141. /// <returns>空表示系统未启动完成</returns>
  142. public static Transform GSXR_Get_Head()
  143. {
  144. if (API_GSXR_Slam.SlamManager != null && API_GSXR_Slam.SlamManager.status.running == true)
  145. {
  146. return Camera.main.transform;
  147. }
  148. return null;
  149. }
  150. ///API-No.10
  151. /// <summary>
  152. /// 设置瞳距,Awake时调用,Start后调用无效
  153. /// </summary>
  154. /// <param name="offset">瞳距的偏移量,单位米</param>
  155. public static void GSXR_Set_PD(float offset = 0)
  156. {
  157. if (API_GSXR_Slam.SlamManager != null) {
  158. API_GSXR_Slam.plugin.GSXR_SetMeshOffset(0, offset / 2);
  159. API_GSXR_Slam.plugin.GSXR_SetMeshOffset(2, offset / 2);
  160. //Camera.mainOffsetPostion += offset / 2 * Vector3.left;
  161. //API_GSXR_Slam.SlamManager.rightCameraOffsetPostion += offset / 2 * Vector3.right;
  162. }
  163. }
  164. ///API-No.11
  165. /// <summary>
  166. /// 获取瞳距,
  167. /// </summary>
  168. /// <param name="type">右眼类型:2,左眼类型:0</param>
  169. public static float GSXR_Get_PD(int type)
  170. {
  171. if (API_GSXR_Slam.SlamManager != null)
  172. {
  173. return API_GSXR_Slam.plugin.GSXR_GetMeshOffset(type)+0.064f;
  174. }
  175. return -1;
  176. }
  177. ///API-No.12
  178. /// <summary>
  179. /// 重定位,若无效果,表示系统初始化未完成,且只有在眼镜上有效
  180. /// </summary>
  181. public static void GSXR_RecenterTracking()
  182. {
  183. if (API_GSXR_Slam.SlamManager != null)
  184. {
  185. API_GSXR_Slam.SlamManager.RecenterTracking();
  186. }
  187. }
  188. ///API-No.13
  189. /// <summary>
  190. /// StartSlam
  191. /// </summary>
  192. public static void GSXR_Start_Slam()
  193. {
  194. if (API_GSXR_Slam.SlamManager != null)
  195. {
  196. API_GSXR_Slam.SlamManager.StartSlam();
  197. }
  198. }
  199. ///API-No.14
  200. /// <summary>
  201. /// StopSlam
  202. /// When a StartSlam is running (not completed), calling StopSlam will not work
  203. /// </summary>
  204. public static void GSXR_Stop_Slam()
  205. {
  206. if (API_GSXR_Slam.SlamManager != null)
  207. {
  208. API_GSXR_Slam.SlamManager.StopSlam();
  209. }
  210. }
  211. ///API-No.15
  212. /// <summary>
  213. /// ResetSlam
  214. /// </summary>
  215. public static void GSXR_Reset_Slam()
  216. {
  217. if (API_GSXR_Slam.SlamManager != null)
  218. {
  219. API_GSXR_Slam.SlamManager.ResetSlam();
  220. }
  221. }
  222. public static void GSXR_Reset_Slam_V2()
  223. {
  224. GSXR_ResaveMap("resetslam");
  225. }
  226. ///API-No.16
  227. /// <summary>
  228. /// IS Slam 6Dof DataLost
  229. /// </summary>
  230. public static bool GSXR_Is_SlamDataLost
  231. {
  232. get
  233. {
  234. if (API_GSXR_Slam.SlamManager != null)
  235. {
  236. return API_GSXR_Slam.SlamManager.IsTrackingValid;
  237. }
  238. return true;
  239. }
  240. }
  241. ///API-No.17
  242. /// <summary>
  243. /// Get FishEye Data
  244. /// </summary>
  245. public static int GSXR_Get_LatestFishEyeBinocularData(ref bool outBUdate, ref uint outCurrFrameIndex, ref ulong outFrameExposureNano, byte[] outLeftFrameData, byte[] outRightFrameData)
  246. {
  247. if (API_GSXR_Slam.plugin != null)
  248. {
  249. PermissionRequest.getInstance.GetPerssion(UnityEngine.Android.Permission.Camera);
  250. return API_GSXR_Slam.plugin.GSXR_Get_LatestFishEyeBinocularData(ref outBUdate, ref outCurrFrameIndex, ref outFrameExposureNano, outLeftFrameData, outRightFrameData);
  251. }
  252. return 0;
  253. }
  254. static bool isOpen=false;
  255. public static bool GSXR_Is_EnablePointCloudData()
  256. {
  257. return isOpen;
  258. }
  259. public static void GSXR_Set_PointCloudData(bool _isOpen)
  260. {
  261. isOpen = _isOpen;
  262. }
  263. public static int GSXR_Get_PointCloudData(ref int dataNum, ref ulong dataTimestamp, float[] dataArray)
  264. {
  265. if (isOpen == false) {
  266. dataNum = 0;
  267. return 0;
  268. }
  269. if (API_GSXR_Slam.plugin != null)
  270. {
  271. return API_GSXR_Slam.plugin.GSXR_Get_PointCloudData(ref dataNum, ref dataTimestamp, dataArray);
  272. }
  273. return 0;
  274. }
  275. public static int GSXR_Get_OfflineMapRelocState()
  276. {
  277. if (API_GSXR_Slam.plugin != null)
  278. {
  279. return API_GSXR_Slam.plugin.GSXR_Get_OfflineMapRelocState();
  280. }
  281. return 0;
  282. }
  283. public static int GSXR_ResaveMap(string path)
  284. {
  285. if (API_GSXR_Slam.plugin != null)
  286. {
  287. return API_GSXR_Slam.plugin.GSXR_ResaveMap(path);
  288. }
  289. return 0;
  290. }
  291. public static void GSXR_SaveMap()
  292. {
  293. if (API_GSXR_Slam.plugin != null) {
  294. API_GSXR_Slam.plugin.GSXR_SaveMap();
  295. }
  296. }
  297. public static int GSXR_Get_Gnss(ref double dt, float[] gnss)
  298. {
  299. if (API_GSXR_Slam.plugin != null)
  300. {
  301. return API_GSXR_Slam.plugin.GSXR_Get_Gnss(ref dt, gnss);
  302. }
  303. return 0;
  304. }
  305. public static int GSXR_Get_PanelNum()
  306. {
  307. if (API_GSXR_Slam.plugin != null)
  308. {
  309. return API_GSXR_Slam.plugin.GSXR_Get_PanelNum();
  310. }
  311. return -1;
  312. }
  313. public static int GSXR_Get_PanelInfo(float[] info)
  314. {
  315. if (API_GSXR_Slam.plugin != null)
  316. {
  317. return API_GSXR_Slam.plugin.GSXR_Get_PanelInfo(info);
  318. }
  319. return -1;
  320. }
  321. public static int GSXR_Set_HeadOrigin(Vector3 postion) {
  322. if (API_GSXR_Slam.plugin != null) {
  323. API_GSXR_Slam.SlamManager.transform.position = (API_GSXR_Slam.SlamManager.transform.position - Camera.main.transform.position) + postion;
  324. return 1;
  325. }
  326. return -1;
  327. }
  328. public static int GSXR_Set_WorldOrigin(Vector3 postion) {
  329. if (API_GSXR_Slam.plugin != null) {
  330. API_GSXR_Slam.SlamManager.transform.position = Matrix4x4.TRS(-postion, Quaternion.identity, Vector3.one).MultiplyPoint(API_GSXR_Slam.SlamManager.transform.position);
  331. return 1;
  332. }
  333. return -1;
  334. }
  335. #region Old KS API
  336. /// <summary>
  337. /// Controller Vibrate
  338. /// </summary>
  339. /// <param name="index">0-LeftController 1-RightController</param>
  340. /// <param name="isOn"></param>
  341. /// <param name="vibrateOnType"></param>
  342. /// <param name="time"></param>
  343. public static void GSXR_Set_ControllerVibrate(int index, bool isOn, GSXRManager.VibrateOnType vibrateOnType = GSXRManager.VibrateOnType.OneShot, float time = 0.1f) {
  344. if (API_GSXR_Slam.plugin != null) {
  345. API_GSXR_Slam.SlamManager.GSXR_Set_ControllerVibrate(index, isOn, vibrateOnType, time);
  346. }
  347. }
  348. /// <summary>
  349. /// GSXR_Get_ControllerVibrateStatus
  350. /// </summary>
  351. /// <param name="index">0-LeftController 1-RightController</param>
  352. /// <returns></returns>
  353. public static bool GSXR_Get_ControllerVibrateStatus(int index)
  354. {
  355. if (API_GSXR_Slam.plugin != null)
  356. {
  357. return API_GSXR_Slam.SlamManager.GSXR_Get_ControllerVibrateStatus(index);
  358. }
  359. return false;
  360. }
  361. #endregion
  362. #region NEW KS Controller API
  363. /// <summary>
  364. /// Controller Vibrate
  365. /// </summary>
  366. /// <param name="index"></param>
  367. /// <param name="isOn"></param>
  368. /// <param name="amplitude"></param>
  369. /// <param name="frequency"></param>
  370. /// <param name="time"></param>
  371. /// <returns></returns>
  372. public static int GSXR_Set_ControllerVibrate(int index, bool isOn, float amplitude, float frequency, float time)
  373. {
  374. if (API_GSXR_Slam.plugin != null)
  375. {
  376. return API_GSXR_Slam.SlamManager.GSXR_Set_ControllerVibrate(index, isOn, amplitude, frequency, time);
  377. }
  378. return -1;
  379. }
  380. [Obsolete("Please Use NEW KS Vibrate GSXR_Set_ControllerVibrate(int index, bool isOn, float amplitude, float frequency, float time)")]
  381. public static int GSXR_Set_ControllerVibrate(int index, bool isOn, int amplitude, int frequency, int time)
  382. {
  383. if (API_GSXR_Slam.plugin != null)
  384. {
  385. return API_GSXR_Slam.SlamManager.GSXR_Set_ControllerVibrate(index, isOn, amplitude/15f, frequency/15f, time/10f);
  386. }
  387. return -1;
  388. }
  389. /// <summary>
  390. /// GSXR_Get_ControllerVibrateState,
  391. /// return:"0" is false ,"1" is true
  392. /// </summary>
  393. /// <param name="index">0-LeftController 1-RightController</param>
  394. /// <returns></returns>
  395. public static int GSXR_Get_ControllerVibrateState(int index)
  396. {
  397. if (API_GSXR_Slam.plugin != null)
  398. {
  399. return API_GSXR_Slam.SlamManager.GSXR_Get_ControllerVibrateState(index);
  400. }
  401. return -1;
  402. }
  403. #endregion
  404. #region Other API
  405. /// <summary>
  406. /// GSXR_Set_OnFloorOrOnHead
  407. /// </summary>
  408. /// <param name="type">0-Head, 1-Floor</param>
  409. public static void GSXR_Set_OnFloorOrOnHead(int type)
  410. {
  411. if (API_GSXR_Slam.plugin != null)
  412. {
  413. API_GSXR_Slam.SlamManager.GSXR_Set_OnFloorOrOnHead(type);
  414. }
  415. }
  416. public static void GSXR_Bind_Controller(int index,int type)
  417. {
  418. if (API_GSXR_Slam.plugin != null)
  419. {
  420. API_GSXR_Slam.SlamManager.GSXR_Bind_Controller(index, type);
  421. }
  422. }
  423. public static void GSXR_Unbind_Controller(int index, int type)
  424. {
  425. if (API_GSXR_Slam.plugin != null)
  426. {
  427. API_GSXR_Slam.SlamManager.GSXR_Unbind_Controller(index, type);
  428. }
  429. }
  430. public static int GSXR_Get_ControllerBondState()
  431. {
  432. if (API_GSXR_Slam.plugin != null)
  433. {
  434. return API_GSXR_Slam.SlamManager.GSXR_Get_ControllerBondState();
  435. }
  436. return -2;
  437. }
  438. /// <summary>
  439. /// Whether to Enable the Controller binding status callback interface
  440. /// </summary>
  441. public static void GSXR_Set_ControllerBondEventCallback(bool isEnable)
  442. {
  443. if (API_GSXR_Slam.plugin != null)
  444. {
  445. API_GSXR_Slam.SlamManager.GSXR_Set_ControllerBondEventCallback(isEnable);
  446. }
  447. }
  448. /// <summary>
  449. /// Add Controller binding state callback event
  450. /// </summary>
  451. /// <param name="callback"></param>
  452. public static void GSXR_Add_ControllerBondEventCallback(Action<int> callback)
  453. {
  454. if (API_GSXR_Slam.plugin != null)
  455. {
  456. API_GSXR_Slam.SlamManager.GSXR_Add_ControllerBondEventCallback(callback);
  457. }
  458. }
  459. /// <summary>
  460. /// Remove Controller binding state callback event
  461. /// </summary>
  462. /// <param name="callback"></param>
  463. public static void GSXR_Remove_ControllerBondEventCallback(Action<int> callback)
  464. {
  465. if (API_GSXR_Slam.plugin != null)
  466. {
  467. API_GSXR_Slam.SlamManager.GSXR_Remove_ControllerBondEventCallback(callback);
  468. }
  469. }
  470. #endregion
  471. #region SeeThrough API
  472. /// <summary>
  473. /// GSXR_StartSeeThrough
  474. /// </summary>
  475. public static void GSXR_StartSeeThrough()
  476. {
  477. if (API_GSXR_Slam.plugin != null)
  478. {
  479. API_GSXR_Slam.plugin.GSXR_StartSeeThrough();
  480. }
  481. }
  482. /// <summary>
  483. /// GSXR_StopSeeThrough
  484. /// </summary>
  485. public static void GSXR_StopSeeThrough()
  486. {
  487. if (API_GSXR_Slam.plugin != null)
  488. {
  489. API_GSXR_Slam.plugin.GSXR_StopSeeThrough();
  490. }
  491. }
  492. public static void GSXR_Add_SeeThrough_Callback(Action<bool> callback)
  493. {
  494. if (API_GSXR_Slam.plugin != null)
  495. {
  496. API_GSXR_Slam.plugin.GSXR_Regist_SeeThrough_Callback(callback);
  497. }
  498. }
  499. public static void GSXR_Remove_SeeThrough_Callback(Action<bool> callback)
  500. {
  501. if (API_GSXR_Slam.plugin != null)
  502. {
  503. API_GSXR_Slam.plugin.GSXR_UnRegist_SeeThrough_Callbak(callback);
  504. }
  505. }
  506. #endregion
  507. /// <summary>
  508. /// GSXR_Add_SlamPauseCallback
  509. /// </summary>
  510. /// <param name="callback"></param>
  511. public static void GSXR_Add_SlamPauseCallback(GSXRManager.OnApplicationPauseDele callback)
  512. {
  513. GSXRManager.onApplicationPauseDele += callback;
  514. }
  515. /// <summary>
  516. ///
  517. /// </summary>
  518. /// <param name="callback"></param>
  519. public static void GSXR_Remove_SlamPauseCallback(GSXRManager.OnApplicationPauseDele callback)
  520. {
  521. GSXRManager.onApplicationPauseDele -= callback;
  522. }
  523. }