LayerBase.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. using System;
  2. using UnityEngine;
  3. namespace Unity.XR.OpenXR.Features.PICOSupport
  4. {
  5. public class LayerBase : MonoBehaviour
  6. {
  7. public static int ID = 0;
  8. private Transform overlayTransform;
  9. private Camera[] overlayEyeCamera = new Camera[2];
  10. private Camera xrRig;
  11. private Matrix4x4[] mvMatrixs = new Matrix4x4[2];
  12. private Vector3[] modelScales = new Vector3[2];
  13. private Vector3[] modelTranslations = new Vector3[2];
  14. private Quaternion[] modelRotations = new Quaternion[2];
  15. private Quaternion[] cameraRotations = new Quaternion[2];
  16. private Vector3[] cameraTranslations = new Vector3[2];
  17. public void Awake()
  18. {
  19. ID++;
  20. xrRig = Camera.main;
  21. overlayEyeCamera[0] = xrRig;
  22. overlayEyeCamera[1] = xrRig;
  23. overlayTransform = GetComponent<Transform>();
  24. #if UNITY_ANDROID && !UNITY_EDITOR
  25. if (overlayTransform != null)
  26. {
  27. MeshRenderer render = overlayTransform.GetComponent<MeshRenderer>();
  28. if (render != null)
  29. {
  30. render.enabled = false;
  31. }
  32. }
  33. #endif
  34. }
  35. private void OnDestroy()
  36. {
  37. ID--;
  38. }
  39. public void UpdateCoords()
  40. {
  41. if (null == overlayTransform || !overlayTransform.gameObject.activeSelf || null == overlayEyeCamera[0] ||
  42. null == overlayEyeCamera[1])
  43. {
  44. return;
  45. }
  46. for (int i = 0; i < mvMatrixs.Length; i++)
  47. {
  48. mvMatrixs[i] = overlayEyeCamera[i].worldToCameraMatrix * overlayTransform.localToWorldMatrix;
  49. if (overlayTransform is RectTransform uiTransform)
  50. {
  51. var rect = uiTransform.rect;
  52. var lossyScale = overlayTransform.lossyScale;
  53. modelScales[i] = new Vector3(rect.width * lossyScale.x,
  54. rect.height * lossyScale.y, 1);
  55. modelTranslations[i] = uiTransform.TransformPoint(rect.center);
  56. }
  57. else
  58. {
  59. modelScales[i] = overlayTransform.lossyScale;
  60. modelTranslations[i] = overlayTransform.position;
  61. }
  62. modelRotations[i] = overlayTransform.rotation;
  63. cameraRotations[i] = overlayEyeCamera[i].transform.rotation;
  64. cameraTranslations[i] = overlayEyeCamera[i].transform.position;
  65. }
  66. }
  67. public void GetCurrentTransform(ref GeometryInstanceTransform geometryInstanceTransform)
  68. {
  69. Quaternion quaternion = new Quaternion(modelRotations[0].x,
  70. modelRotations[0].y, modelRotations[0].z,
  71. modelRotations[0].w);
  72. Vector3 cameraPos = Vector3.zero;
  73. Quaternion cameraRot = Quaternion.identity;
  74. Transform origin = null;
  75. bool ret = PICOManager.Instance.GetOrigin(ref cameraPos, ref cameraRot, ref origin);
  76. if (!ret)
  77. {
  78. return;
  79. }
  80. Quaternion lQuaternion = new Quaternion(-cameraRot.x, -cameraRot.y, -cameraRot.z, cameraRot.w);
  81. Vector3 pos = new Vector3(modelTranslations[0].x - cameraPos.x,
  82. modelTranslations[0].y - PICOManager.Instance.getCameraYOffset() +
  83. PICOManager.Instance.GetOriginY() - cameraPos.y, modelTranslations[0].z - cameraPos.z);
  84. quaternion *= lQuaternion;
  85. origin.rotation *= lQuaternion;
  86. pos = origin.TransformPoint(pos);
  87. geometryInstanceTransform.pose.position.x = pos.x;
  88. geometryInstanceTransform.pose.position.y = pos.y;
  89. geometryInstanceTransform.pose.position.z = -pos.z;
  90. geometryInstanceTransform.pose.orientation.x = -quaternion.x;
  91. geometryInstanceTransform.pose.orientation.y = -quaternion.y;
  92. geometryInstanceTransform.pose.orientation.z = quaternion.z;
  93. geometryInstanceTransform.pose.orientation.w = quaternion.w;
  94. geometryInstanceTransform.scale.x = modelScales[0].x;
  95. geometryInstanceTransform.scale.y = modelScales[0].y;
  96. geometryInstanceTransform.scale.z = 1;
  97. }
  98. }
  99. }