|
|
- /************************************************************************************
- Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved.
-
- Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use
- the Utilities SDK except in compliance with the License, which is provided at the time of installation
- or download, or which otherwise accompanies this software in either electronic or hard copy form.
-
- You may obtain a copy of the License at
- https://developer.oculus.com/licenses/utilities-1.31
-
- Unless required by applicable law or agreed to in writing, the Utilities SDK distributed
- under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
- ANY KIND, either express or implied. See the License for the specific language governing
- permissions and limitations under the License.
- ************************************************************************************/
-
- #if UNITY_ANDROID && !UNITY_EDITOR
- #define OVR_ANDROID_MRC
- #endif
-
- using UnityEngine;
- using System.Collections;
-
- #if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || UNITY_ANDROID
-
- public abstract class OVRComposition {
-
- public bool cameraInTrackingSpace = false;
- public OVRCameraRig cameraRig = null;
-
- protected OVRComposition(GameObject parentObject, Camera mainCamera)
- {
- RefreshCameraRig(parentObject, mainCamera);
- }
-
- public abstract OVRManager.CompositionMethod CompositionMethod();
-
- public abstract void Update(GameObject gameObject, Camera mainCamera);
- public abstract void Cleanup();
-
- public virtual void RecenterPose() { }
-
- protected bool usingLastAttachedNodePose = false;
- protected OVRPose lastAttachedNodePose = new OVRPose(); // Sometimes the attach node pose is not readable (lose tracking, low battery, etc.) Use the last pose instead when it happens
-
- public void RefreshCameraRig(GameObject parentObject, Camera mainCamera)
- {
- OVRCameraRig cameraRig = mainCamera.GetComponentInParent<OVRCameraRig>();
- if (cameraRig == null)
- {
- cameraRig = parentObject.GetComponent<OVRCameraRig>();
- }
- cameraInTrackingSpace = (cameraRig != null && cameraRig.trackingSpace != null);
- this.cameraRig = cameraRig;
- Debug.Log(cameraRig == null ? "[OVRComposition] CameraRig not found" : "[OVRComposition] CameraRig found");
- }
-
- public OVRPose ComputeCameraWorldSpacePose(OVRPlugin.CameraExtrinsics extrinsics, OVRPlugin.Posef calibrationRawPose)
- {
- OVRPose trackingSpacePose = ComputeCameraTrackingSpacePose(extrinsics, calibrationRawPose);
- OVRPose worldSpacePose = OVRExtensions.ToWorldSpacePose(trackingSpacePose);
- return worldSpacePose;
- }
-
- public OVRPose ComputeCameraTrackingSpacePose(OVRPlugin.CameraExtrinsics extrinsics, OVRPlugin.Posef calibrationRawPose)
- {
- OVRPose trackingSpacePose = new OVRPose();
-
- OVRPose cameraTrackingSpacePose = extrinsics.RelativePose.ToOVRPose();
- #if OVR_ANDROID_MRC
- OVRPose rawPose = OVRPlugin.GetTrackingTransformRawPose().ToOVRPose();
- cameraTrackingSpacePose = rawPose * (calibrationRawPose.ToOVRPose().Inverse() * cameraTrackingSpacePose);
- #endif
- trackingSpacePose = cameraTrackingSpacePose;
-
- if (extrinsics.AttachedToNode != OVRPlugin.Node.None && OVRPlugin.GetNodePresent(extrinsics.AttachedToNode))
- {
- if (usingLastAttachedNodePose)
- {
- Debug.Log("The camera attached node get tracked");
- usingLastAttachedNodePose = false;
- }
- OVRPose attachedNodePose = OVRPlugin.GetNodePose(extrinsics.AttachedToNode, OVRPlugin.Step.Render).ToOVRPose();
- lastAttachedNodePose = attachedNodePose;
- trackingSpacePose = attachedNodePose * trackingSpacePose;
- }
- else
- {
- if (extrinsics.AttachedToNode != OVRPlugin.Node.None)
- {
- if (!usingLastAttachedNodePose)
- {
- Debug.LogWarning("The camera attached node could not be tracked, using the last pose");
- usingLastAttachedNodePose = true;
- }
- trackingSpacePose = lastAttachedNodePose * trackingSpacePose;
- }
- }
-
- return trackingSpacePose;
- }
-
- }
-
- #endif
|