GSXRPlugin.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376
  1. using UnityEngine;
  2. using System;
  3. using System.Collections;
  4. using System.Runtime.InteropServices;
  5. using SC.XR.Unity;
  6. using SC.XR.Unity.Module_Device;
  7. public abstract class GSXRPlugin
  8. {
  9. private static GSXRPlugin instance;
  10. public static GSXRPlugin Instance
  11. {
  12. get
  13. {
  14. if (instance == null)
  15. {
  16. if(!Application.isEditor && Application.platform == RuntimePlatform.Android)
  17. {
  18. if (API_Module_Device.CurrentAndroid != null && API_Module_Device.CurrentAndroid.type == AndroidDeviceType.Other) {
  19. instance = GSXRPluginAndroidOther.Create();
  20. } else {
  21. if (GSXRManager.Instance != null) {
  22. if (GSXRManager.Instance.specificationType == GSXRManager.SpecificationType.GSXR) {
  23. instance = GSXRPluginAndroid.Create();
  24. } else {
  25. instance = SvrPluginAndroid.Create();
  26. }
  27. }
  28. }
  29. }
  30. else
  31. {
  32. instance = GSXRPluginWin.Create();
  33. }
  34. }
  35. return instance;
  36. }
  37. }
  38. public GSXRManager svrCamera = null;
  39. public GSXREye[] eyes = null;
  40. public GSXROverlay[] overlays = null;
  41. public DeviceInfo deviceInfo;
  42. public string SN = "";
  43. public enum PerfLevel
  44. {
  45. kPerfSystem = 0,
  46. kPerfMaximum = 1,
  47. kPerfNormal = 2,
  48. kPerfMinimum = 3
  49. }
  50. public enum TrackingMode
  51. {
  52. kTrackingOrientation = (1 << 0),
  53. kTrackingPosition = (1 << 1),
  54. kTrackingEye = (1 << 2),
  55. }
  56. public enum EyePoseStatus
  57. {
  58. kGazePointValid = (1 << 0),
  59. kGazeVectorValid = (1 << 1),
  60. kEyeOpennessValid = (1 << 2),
  61. kEyePupilDilationValid = (1 << 3),
  62. kEyePositionGuideValid = (1 << 4)
  63. };
  64. public enum FrameOption
  65. {
  66. kDisableDistortionCorrection = (1 << 0), //!< Disables the lens distortion correction (useful for debugging)
  67. kDisableReprojection = (1 << 1), //!< Disables re-projection
  68. kEnableMotionToPhoton = (1 << 2), //!< Enables motion to photon testing
  69. kDisableChromaticCorrection = (1 << 3) //!< Disables the lens chromatic aberration correction (performance optimization)
  70. };
  71. public struct HeadPose
  72. {
  73. public Vector3 position;
  74. public Quaternion orientation;
  75. }
  76. public struct EyePose
  77. {
  78. public int leftStatus; //!< Bit field (svrEyePoseStatus) indicating left eye pose status
  79. public int rightStatus; //!< Bit field (svrEyePoseStatus) indicating right eye pose status
  80. public int combinedStatus; //!< Bit field (svrEyePoseStatus) indicating combined eye pose status
  81. public Vector3 leftPosition; //!< Left Eye Gaze Point
  82. public Vector3 rightPosition; //!< Right Eye Gaze Point
  83. public Vector3 combinedPosition; //!< Combined Eye Gaze Point (HMD center-eye point)
  84. public Vector3 leftDirection; //!< Left Eye Gaze Point
  85. public Vector3 rightDirection; //!< Right Eye Gaze Point
  86. public Vector3 combinedDirection; //!< Comnbined Eye Gaze Vector (HMD center-eye point)
  87. public float leftOpenness; //!< Left eye value between 0.0 and 1.0 where 1.0 means fully open and 0.0 closed.
  88. public float rightOpenness; //!< Right eye value between 0.0 and 1.0 where 1.0 means fully open and 0.0 closed.
  89. //public float leftDilation; //!< Left eye value in millimeters indicating the pupil dilation
  90. //public float rightDilation; //!< Right eye value in millimeters indicating the pupil dilation
  91. //public Vector3 leftGuide; //!< Position of the inner corner of the left eye in meters from the HMD center-eye coordinate system's origin.
  92. //public Vector3 rightGuide; //!< Position of the inner corner of the right eye in meters from the HMD center-eye coordinate system's origin.
  93. }
  94. public struct ViewFrustum
  95. {
  96. public float left; //!< Left Plane of Frustum
  97. public float right; //!< Right Plane of Frustum
  98. public float top; //!< Top Plane of Frustum
  99. public float bottom; //!< Bottom Plane of Frustum
  100. public float near; //!< Near Plane of Frustum
  101. public float far; //!< Far Plane of Frustum (Arbitrary)
  102. }
  103. public struct DeviceInfo
  104. {
  105. public int displayWidthPixels;
  106. public int displayHeightPixels;
  107. public float displayRefreshRateHz;
  108. public int targetEyeWidthPixels;
  109. public int targetEyeHeightPixels;
  110. public float targetFovXRad;
  111. public float targetFovYRad;
  112. public ViewFrustum targetFrustumLeft;
  113. public ViewFrustum targetFrustumRight;
  114. public float targetFrustumConvergence;
  115. public float targetFrustumPitch;
  116. }
  117. public virtual int GetPredictedPoseModify(ref Quaternion orientation, ref Vector3 position, int frameIndex = -1)
  118. {
  119. return 0;
  120. }
  121. public virtual bool PollEvent(ref GSXRManager.SvrEvent frameEvent) { return false; }
  122. public virtual bool IsInitialized() { return false; }
  123. public virtual bool IsRunning() { return false; }
  124. public virtual IEnumerator Initialize ()
  125. {
  126. svrCamera = GSXRManager.Instance;
  127. if (svrCamera == null)
  128. {
  129. Debug.LogError("GSXRManager object not found!");
  130. yield break;
  131. }
  132. yield break;
  133. }
  134. public virtual IEnumerator BeginVr(int cpuPerfLevel =0, int gpuPerfLevel =0)
  135. {
  136. if (eyes == null)
  137. {
  138. eyes = GSXREye.Instances.ToArray();
  139. if (eyes == null)
  140. {
  141. Debug.Log("Components with GSXREye not found!");
  142. }
  143. Array.Sort(eyes);
  144. }
  145. if (overlays == null)
  146. {
  147. overlays = GSXROverlay.Instances.ToArray();
  148. if (overlays == null)
  149. {
  150. Debug.Log("Components with GSXROverlay not found!");
  151. }
  152. Array.Sort(overlays);
  153. }
  154. yield break;
  155. }
  156. public virtual void EndVr()
  157. {
  158. eyes = null;
  159. overlays = null;
  160. }
  161. public virtual void BeginEye(int sideMask, float[] frameDelta) { }
  162. public virtual void EndEye(int sideMask, int layerMask) { }
  163. public virtual void SetTrackingMode(int mode) { }
  164. public virtual void SetFoveationParameters(int textureId, int previousId, float focalPointX, float focalPointY, float foveationGainX, float foveationGainY, float foveationArea, float foveationMinimum) {}
  165. public virtual void ApplyFoveation() { }
  166. public virtual int GetTrackingMode() { return 0; }
  167. public virtual void SetPerformanceLevels(int newCpuPerfLevel, int newGpuPerfLevel) { }
  168. public virtual void SetFrameOption(FrameOption frameOption) { }
  169. public virtual void UnsetFrameOption(FrameOption frameOption) { }
  170. public virtual void SetVSyncCount(int vSyncCount) { }
  171. public virtual bool RecenterTracking() { return true; }
  172. public virtual void SubmitFrame(int frameIndex, float fieldOfView, int frameType) { }
  173. public virtual int GetPredictedPose(ref Quaternion orientation, ref Vector3 position, int frameIndex = -1)
  174. {
  175. orientation = Quaternion.identity;
  176. position = Vector3.zero;
  177. return 0;
  178. }
  179. public virtual int GetHeadPose(ref HeadPose headPose, int frameIndex = -1)
  180. {
  181. headPose.orientation = Quaternion.identity;
  182. headPose.position = Vector3.zero;
  183. return 0;
  184. }
  185. public virtual int GetEyePose(ref EyePose eyePose, int frameIndex = -1)
  186. {
  187. eyePose.leftStatus = 0;
  188. eyePose.rightStatus = 0;
  189. eyePose.combinedStatus = 0;
  190. return 0;
  191. }
  192. public abstract DeviceInfo GetDeviceInfo ();
  193. public virtual void Shutdown()
  194. {
  195. GSXRPlugin.instance = null;
  196. }
  197. //---------------------------------------------------------------------------------------------
  198. public virtual int ControllerStartTracking(string desc) {
  199. return -1;
  200. }
  201. //---------------------------------------------------------------------------------------------
  202. public virtual void ControllerStopTracking(int handle) {
  203. }
  204. //---------------------------------------------------------------------------------------------
  205. public virtual GSXRControllerState ControllerGetState(int handle, int space) {
  206. return new GSXRControllerState();
  207. }
  208. //---------------------------------------------------------------------------------------------
  209. public virtual void ControllerSendMessage(int handle, GSXRController.svrControllerMessageType what, int arg1, int arg2) {
  210. }
  211. //---------------------------------------------------------------------------------------------
  212. public virtual object ControllerQuery(int handle, GSXRController.svrControllerQueryType what) {
  213. return null;
  214. }
  215. //-----------------------KS---------------------
  216. //-----------------------For A11G---------------------
  217. //-----------------------For HeadsetInput---------------------
  218. //-----------------------For GreyCamera---------------------
  219. #region HMD
  220. public virtual bool HeadSetEnterKeyDown() { return Input.GetMouseButtonDown(0); }
  221. public virtual bool HeadSetEnterKeyUp() { return Input.GetMouseButtonUp(0); }
  222. public virtual bool HeadSetBackKeyDown() { return Input.GetKeyDown(KeyCode.Escape); }
  223. public virtual bool HeadSetBackKeyUp() { return Input.GetKeyUp(KeyCode.Escape); }
  224. #endregion HMD
  225. #region Controller
  226. public delegate void OnKeyEvent(int keycode, int action, int lr);
  227. public delegate void OnKeyTouchEvent(bool key1, bool key2, bool key3, bool key4, int lr);
  228. public delegate void OnTouchEvent(int touch_x, int touch_y, int lr);
  229. public delegate void OnHallEvent(int hall_x, int hall_y, int lr);
  230. public delegate void OnChargingEvent(bool isCharging, int lr);
  231. public delegate void OnBatteryEvent(int battery, int lr);
  232. public delegate void OnConnectEvent(bool isConnected, int lr);
  233. public virtual bool GSXR_Is_SupportController() { return false; }
  234. public virtual int GSXR_Get_ControllerMode() { return 3; }
  235. public virtual int GSXR_Get_ControllerNum() { return 2; }
  236. public virtual void GSXR_Set_ControllerKeyEventCallback(OnKeyEvent _event) { }
  237. public virtual void GSXR_Set_ControllerKeyTouchEventCallback(OnKeyTouchEvent _event) { }
  238. public virtual void GSXR_Set_ControllerRockerCallback(OnTouchEvent _event) { }
  239. public virtual void GSXR_Set_ControllerHallCallback(OnHallEvent _event) { }
  240. public virtual void GSXR_Set_ControllerChargingEventCallback(OnChargingEvent _event) { }
  241. public virtual void GSXR_Set_ControllerBatteryEventCallback(OnBatteryEvent _event) { }
  242. public virtual void GSXR_Set_ControllerConnectEventCallback(OnConnectEvent _event) { }
  243. public virtual int GSXR_Get_ControllerBattery(int lr) { return -1; }
  244. public virtual int GSXR_Get_ControllerVersion(int lr) { return -1; }
  245. public virtual int GSXR_Get_ControllerList(int lr) { return -1; }
  246. public virtual bool GSXR_Is_ControllerConnect(int lr) { return false; }
  247. public virtual void GSXR_Set_ControllerLed(int lr) { return; }
  248. public virtual void GSXR_Set_ControllerVibrate(int lr) { return; }
  249. public virtual int GSXR_Get_ControllerPosture(float[] outOrientationArray, int lr) { return -1; }
  250. [Obsolete("Only For SVR")]
  251. public virtual int Fetch3dofHandShank(float[] outOrientationArray, int lr) { return -1; }
  252. [Obsolete("Only For SVR")]
  253. public virtual int Fetch6dofHandShank(float[] outOrientationArray, int lr) { return -1; }
  254. #endregion Controller
  255. #region HandTracking
  256. public virtual bool GSXR_Is_SupportHandTracking() { return false; }
  257. public virtual void GSXR_StartHandTracking(Action<int> func) { }
  258. public virtual void GSXR_StopHandTracking() { }
  259. public virtual void GSXR_Get_HandTrackingData(float[] mode, float[] pose) { return; }
  260. public virtual int GSXR_Set_HandTrackingData(float[] mode, float[] pose) { return 0; }
  261. public virtual int GSXR_Get_HandTrackingGestureIdx(ref UInt64 index, float[] model, float[] pose) { return 0; }
  262. public virtual void GSXR_Set_HandTrackingCallBack(Action<int> callback) { }
  263. public virtual int GSXR_Set_HandTrackingModelDataCallBack(Action callback) { return 0; }
  264. public virtual void GSXR_Set_HandTrackingLowPowerWarningCallback(Action<int> func) { }
  265. #endregion HandTracking
  266. #region Deflection
  267. public virtual float GSXR_Get_Deflection() { return 0; }
  268. public virtual void GSXR_Set_RelativeDeflection(int deflection) { }
  269. #endregion Deflection
  270. #region PointCloud & Map
  271. public virtual int GSXR_Get_PointCloudData(ref int dataNum, ref ulong dataTimestamp, float[] dataArray) { return 0; }
  272. public virtual int GSXR_Get_OfflineMapRelocState() { return 0; }
  273. public virtual int GSXR_ResaveMap(string path) { return 0; }
  274. public virtual void GSXR_SaveMap() { }
  275. public virtual int GSXR_Get_Gnss(ref double dt, float[] gnss) { return 0; }
  276. public virtual int GSXR_Get_PanelNum() { return 0; }
  277. public virtual int GSXR_Get_PanelInfo(float[] info) { return 0; }
  278. #endregion PointCloud & Map
  279. #region Grey Camera Data
  280. public virtual void GSXR_Get_LatestQVRCameraFrameData(ref bool outBUdate, ref uint outCurrFrameIndex, ref ulong outFrameExposureNano,
  281. byte[] outFrameData, float[] outTRDataArray) { outBUdate = false; }
  282. public virtual void GSXR_Get_LatestQVRCameraFrameDataNoTransform(ref bool outBUdate, ref uint outCurrFrameIndex, ref ulong outFrameExposureNano,
  283. byte[] outFrameData, float[] outTRDataArray) { outBUdate = false; }
  284. public virtual int GSXR_Get_LatestQVRCameraBinocularData(ref bool outBUdate, ref uint outCurrFrameIndex, ref ulong outFrameExposureNano, byte[] outLeftFrameData, byte[] outRightFrameData) { outBUdate = false; return 0; }
  285. #endregion Grey Camera Data
  286. #region Optics Calibration
  287. public Matrix4x4 leftViewMatrix, rightViewMatrix;
  288. public virtual bool GSXR_Is_SupportOpticsCalibration() { return false; }
  289. public virtual int GSXR_Get_TransformMatrix(ref bool outBLoaded, float[] outTransformArray) { outBLoaded = false; return 0; }
  290. public virtual int GSXR_Get_LatestEyeMatrices(float[] outLeftEyeMatrix,
  291. float[] outRightEyeMatrix,
  292. float[] outT,
  293. float[] outR,
  294. int frameIndex,
  295. bool isMultiThreadedRender) { return 0; }
  296. #endregion Optics Calibration
  297. #region USBDisconnect
  298. public virtual void SetGlassDisconnectedCallBack(Action callBack) { }
  299. #endregion USBDisconnect
  300. #region luncher
  301. public virtual int initLayer() { return -1; }
  302. public virtual int startLayerRendering() { return -1; }
  303. public virtual int getAllLayersData(ref GSXRManager.SCAllLayers outAllLayers) { return -1; }
  304. public virtual int endLayerRendering(ref GSXRManager.SCAllLayers allLayers) { return -1; }
  305. public virtual int destroyLayer() { return -1; }
  306. public virtual int updateModelMatrix(UInt32 layerId, float[] modelMatrixArray) { return -1; }
  307. public virtual int sendActionBarCMD(UInt32 layerId, int cmd) { return -1; }
  308. public virtual int injectMotionEvent(UInt32 layerId, int displayID, int action, float x, float y) { return -1; }
  309. #endregion luncher
  310. #region Device
  311. public virtual XRType GSXR_Get_XRType() { return API_Module_Device.Current.XRType; }
  312. public virtual void GSXR_Get_DeviceName(ref string deviceName) { deviceName = API_Module_Device.Current.modelName; }
  313. #endregion
  314. }