OVRDirectComposition.cs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. using UnityEngine;
  2. using System.Collections;
  3. #if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN
  4. public class OVRDirectComposition : OVRCameraComposition
  5. {
  6. public GameObject directCompositionCameraGameObject;
  7. public Camera directCompositionCamera;
  8. public RenderTexture boundaryMeshMaskTexture = null;
  9. public override OVRManager.CompositionMethod CompositionMethod() { return OVRManager.CompositionMethod.Direct; }
  10. public OVRDirectComposition(GameObject parentObject, Camera mainCamera, OVRManager.CameraDevice cameraDevice, bool useDynamicLighting, OVRManager.DepthQuality depthQuality)
  11. : base(cameraDevice, useDynamicLighting, depthQuality)
  12. {
  13. Debug.Assert(directCompositionCameraGameObject == null);
  14. directCompositionCameraGameObject = new GameObject();
  15. directCompositionCameraGameObject.name = "MRDirectCompositionCamera";
  16. directCompositionCameraGameObject.transform.parent = parentObject.transform;
  17. directCompositionCamera = directCompositionCameraGameObject.AddComponent<Camera>();
  18. directCompositionCamera.stereoTargetEye = StereoTargetEyeMask.None;
  19. directCompositionCamera.depth = float.MaxValue;
  20. directCompositionCamera.rect = new Rect(0.0f, 0.0f, 1.0f, 1.0f);
  21. directCompositionCamera.clearFlags = mainCamera.clearFlags;
  22. directCompositionCamera.backgroundColor = mainCamera.backgroundColor;
  23. directCompositionCamera.cullingMask = mainCamera.cullingMask & (~OVRManager.instance.extraHiddenLayers);
  24. directCompositionCamera.nearClipPlane = mainCamera.nearClipPlane;
  25. directCompositionCamera.farClipPlane = mainCamera.farClipPlane;
  26. if (!hasCameraDeviceOpened)
  27. {
  28. Debug.LogError("Unable to open camera device " + cameraDevice);
  29. }
  30. else
  31. {
  32. Debug.Log("DirectComposition activated : useDynamicLighting " + (useDynamicLighting ? "ON" : "OFF"));
  33. CreateCameraFramePlaneObject(parentObject, directCompositionCamera, useDynamicLighting);
  34. }
  35. }
  36. public override void Update(Camera mainCamera)
  37. {
  38. if (!hasCameraDeviceOpened)
  39. {
  40. return;
  41. }
  42. if (!OVRPlugin.SetHandNodePoseStateLatency(OVRManager.instance.handPoseStateLatency))
  43. {
  44. Debug.LogWarning("HandPoseStateLatency is invalid. Expect a value between 0.0 to 0.5, get " + OVRManager.instance.handPoseStateLatency);
  45. }
  46. directCompositionCamera.clearFlags = mainCamera.clearFlags;
  47. directCompositionCamera.backgroundColor = mainCamera.backgroundColor;
  48. directCompositionCamera.cullingMask = mainCamera.cullingMask & (~OVRManager.instance.extraHiddenLayers);
  49. directCompositionCamera.nearClipPlane = mainCamera.nearClipPlane;
  50. directCompositionCamera.farClipPlane = mainCamera.farClipPlane;
  51. if (OVRMixedReality.useFakeExternalCamera || OVRPlugin.GetExternalCameraCount() == 0)
  52. {
  53. OVRPose worldSpacePose = new OVRPose();
  54. OVRPose trackingSpacePose = new OVRPose();
  55. trackingSpacePose.position = OVRMixedReality.fakeCameraPositon;
  56. trackingSpacePose.orientation = OVRMixedReality.fakeCameraRotation;
  57. worldSpacePose = OVRExtensions.ToWorldSpacePose(trackingSpacePose);
  58. directCompositionCamera.fieldOfView = OVRMixedReality.fakeCameraFov;
  59. directCompositionCamera.aspect = OVRMixedReality.fakeCameraAspect;
  60. directCompositionCamera.transform.FromOVRPose(worldSpacePose);
  61. }
  62. else
  63. {
  64. OVRPlugin.CameraExtrinsics extrinsics;
  65. OVRPlugin.CameraIntrinsics intrinsics;
  66. // So far, only support 1 camera for MR and always use camera index 0
  67. if (OVRPlugin.GetMixedRealityCameraInfo(0, out extrinsics, out intrinsics))
  68. {
  69. OVRPose worldSpacePose = ComputeCameraWorldSpacePose(extrinsics);
  70. float fovY = Mathf.Atan(intrinsics.FOVPort.UpTan) * Mathf.Rad2Deg * 2;
  71. float aspect = intrinsics.FOVPort.LeftTan / intrinsics.FOVPort.UpTan;
  72. directCompositionCamera.fieldOfView = fovY;
  73. directCompositionCamera.aspect = aspect;
  74. directCompositionCamera.transform.FromOVRPose(worldSpacePose);
  75. }
  76. else
  77. {
  78. Debug.LogWarning("Failed to get external camera information");
  79. }
  80. }
  81. if (hasCameraDeviceOpened)
  82. {
  83. if (boundaryMeshMaskTexture == null || boundaryMeshMaskTexture.width != Screen.width || boundaryMeshMaskTexture.height != Screen.height)
  84. {
  85. boundaryMeshMaskTexture = new RenderTexture(Screen.width, Screen.height, 0, RenderTextureFormat.R8);
  86. boundaryMeshMaskTexture.Create();
  87. }
  88. UpdateCameraFramePlaneObject(mainCamera, directCompositionCamera, boundaryMeshMaskTexture);
  89. directCompositionCamera.GetComponent<OVRCameraFrameCompositionManager>().boundaryMeshMaskTexture = boundaryMeshMaskTexture;
  90. }
  91. }
  92. public override void Cleanup()
  93. {
  94. base.Cleanup();
  95. OVRCompositionUtil.SafeDestroy(ref directCompositionCameraGameObject);
  96. directCompositionCamera = null;
  97. Debug.Log("DirectComposition deactivated");
  98. }
  99. }
  100. #endif