PICOManager.cs 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. using System;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.Serialization;
  5. using Unity.XR.CoreUtils;
  6. using UnityEngine.XR;
  7. namespace Unity.XR.OpenXR.Features.PICOSupport
  8. {
  9. public class PICOManager : MonoBehaviour
  10. {
  11. private const string TAG = "[PICOManager]";
  12. private static PICOManager instance = null;
  13. private Camera[] eyeCamera;
  14. private XROrigin _xrOrigin;
  15. private XROrigin _xrOriginT;
  16. static List<XRInputSubsystem> s_InputSubsystems = new List<XRInputSubsystem>();
  17. private float cameraYOffset;
  18. private float cameraY;
  19. private bool isTrackingOriginMode = false;
  20. private TrackingOriginModeFlags currentTrackingOriginMode = TrackingOriginModeFlags.Unknown;
  21. private Vector3 _xrOriginPos = Vector3.zero;
  22. private Vector3 _xrOriginTPos = Vector3.zero;
  23. private Quaternion _xrOriginRot = Quaternion.identity;
  24. private Quaternion _xrOriginTRot = Quaternion.identity;
  25. private static GameObject local = null;
  26. private Vector3 lastOriginPos = Vector3.zero;
  27. private Quaternion lastOriginRot = Quaternion.identity;
  28. private Vector3 lastOriginTPos = Vector3.zero;
  29. private Quaternion lastOriginTRot = Quaternion.identity;
  30. public static PICOManager Instance
  31. {
  32. get
  33. {
  34. if (instance == null)
  35. {
  36. instance = FindObjectOfType<PICOManager>();
  37. if (instance == null)
  38. {
  39. XROrigin origin = Camera.main.transform.GetComponentInParent<XROrigin>();
  40. if (origin != null)
  41. {
  42. instance = origin.gameObject.AddComponent<PICOManager>();
  43. }
  44. else
  45. {
  46. GameObject go = new GameObject("[PICOManager]");
  47. DontDestroyOnLoad(go);
  48. instance = go.AddComponent<PICOManager>();
  49. }
  50. }
  51. }
  52. return instance;
  53. }
  54. }
  55. void Awake()
  56. {
  57. eyeCamera = new Camera[3];
  58. Camera[] cam = gameObject.GetComponentsInChildren<Camera>();
  59. for (int i = 0; i < cam.Length; i++)
  60. {
  61. if (cam[i].stereoTargetEye == StereoTargetEyeMask.Both && cam[i] == Camera.main)
  62. {
  63. eyeCamera[0] = cam[i];
  64. }
  65. else if (cam[i].stereoTargetEye == StereoTargetEyeMask.Left)
  66. {
  67. eyeCamera[1] = cam[i];
  68. }
  69. else if (cam[i].stereoTargetEye == StereoTargetEyeMask.Right)
  70. {
  71. eyeCamera[2] = cam[i];
  72. }
  73. }
  74. _xrOrigin = gameObject.GetComponent<XROrigin>();
  75. if (_xrOrigin != null)
  76. {
  77. _xrOriginPos = new Vector3(Camera.main.transform.position.x, _xrOrigin.transform.position.y, Camera.main.transform.position.z);
  78. cameraYOffset = _xrOrigin.CameraYOffset;
  79. }
  80. _xrOriginRot = Camera.main.transform.parent.rotation;
  81. cameraY = this.transform.position.y;
  82. if (local == null)
  83. {
  84. local = new GameObject();
  85. }
  86. }
  87. public float getCameraYOffset()
  88. {
  89. if (currentTrackingOriginMode == TrackingOriginModeFlags.Floor)
  90. {
  91. return cameraY;
  92. }
  93. return cameraY + cameraYOffset;
  94. }
  95. private void Update()
  96. {
  97. if (!isTrackingOriginMode)
  98. {
  99. XRInputSubsystem subsystem = null;
  100. SubsystemManager.GetInstances(s_InputSubsystems);
  101. if (s_InputSubsystems.Count > 0)
  102. {
  103. subsystem = s_InputSubsystems[0];
  104. }
  105. var mCurrentTrackingOriginMode = subsystem?.GetTrackingOriginMode();
  106. if (mCurrentTrackingOriginMode != null)
  107. {
  108. isTrackingOriginMode = true;
  109. currentTrackingOriginMode = (TrackingOriginModeFlags)mCurrentTrackingOriginMode;
  110. }
  111. }
  112. }
  113. private void OnEnable()
  114. {
  115. if (Camera.main.gameObject.GetComponent<CompositeLayerManager>() == null)
  116. {
  117. Camera.main.gameObject.AddComponent<CompositeLayerManager>();
  118. }
  119. foreach (var layer in CompositeLayerFeature.Instances)
  120. {
  121. if (eyeCamera[0] != null && eyeCamera[0].enabled)
  122. {
  123. layer.RefreshCamera(eyeCamera[0], eyeCamera[0]);
  124. }
  125. else if (eyeCamera[1] != null && eyeCamera[1].enabled)
  126. {
  127. layer.RefreshCamera(eyeCamera[1], eyeCamera[2]);
  128. }
  129. }
  130. }
  131. public Camera[] GetEyeCamera()
  132. {
  133. return eyeCamera;
  134. }
  135. public float GetOriginY()
  136. {
  137. return _xrOrigin.transform.position.y;
  138. }
  139. public bool GetOrigin(ref Vector3 pos, ref Quaternion rotation, ref Transform origin)
  140. {
  141. Transform transform = local.GetComponent<Transform>();
  142. transform.rotation = Quaternion.identity;
  143. origin = transform;
  144. XROrigin xrOrigin = FindObjectOfType<XROrigin>();
  145. if (!xrOrigin)
  146. {
  147. PLog.e(TAG + $" xrOrigin is false!");
  148. pos = Vector3.zero;
  149. rotation = Quaternion.identity;
  150. return false;
  151. }
  152. if (xrOrigin == _xrOrigin)
  153. {
  154. if (xrOrigin.transform.position != lastOriginPos || xrOrigin.transform.rotation != lastOriginRot)
  155. {
  156. _xrOriginPos.x = Camera.main.transform.position.x;
  157. _xrOriginPos.y = xrOrigin.transform.position.y;
  158. _xrOriginPos.z = Camera.main.transform.position.z;
  159. _xrOriginRot = Camera.main.transform.parent.rotation;
  160. lastOriginPos = xrOrigin.transform.position;
  161. lastOriginRot = xrOrigin.transform.rotation;
  162. }
  163. pos = _xrOriginPos;
  164. rotation = _xrOriginRot;
  165. return true;
  166. }
  167. else if (xrOrigin == _xrOriginT)
  168. {
  169. if (xrOrigin.transform.position != lastOriginTPos || xrOrigin.transform.rotation != lastOriginTRot)
  170. {
  171. _xrOriginTPos.x = Camera.main.transform.position.x;
  172. _xrOriginTPos.y = xrOrigin.transform.position.y;
  173. _xrOriginTPos.z = Camera.main.transform.position.z;
  174. _xrOriginTRot = Camera.main.transform.parent.rotation;
  175. lastOriginTPos = xrOrigin.transform.position;
  176. lastOriginTRot = xrOrigin.transform.rotation;
  177. }
  178. pos = _xrOriginTPos;
  179. rotation = _xrOriginTRot;
  180. return true;
  181. }
  182. _xrOriginT = xrOrigin;
  183. _xrOriginTPos = new Vector3(Camera.main.transform.parent.position.x, xrOrigin.transform.position.y, Camera.main.transform.parent.position.z);
  184. _xrOriginTRot = Camera.main.transform.parent.rotation;
  185. pos = _xrOriginTPos;
  186. rotation = _xrOriginTRot;
  187. return true;
  188. }
  189. public float GetRefreshRate()
  190. {
  191. float i = -1;
  192. DisplayRefreshRateFeature.GetDisplayRefreshRate(ref i);
  193. return i;
  194. }
  195. public XrExtent2Df GetReferenceSpaceBoundsRect()
  196. {
  197. XrExtent2Df extent2D = new XrExtent2Df();
  198. OpenXRExtensions.GetReferenceSpaceBoundsRect(XrReferenceSpaceType.Stage, ref extent2D);
  199. return extent2D;
  200. }
  201. }
  202. }