using System.Collections.Generic; using UnityEngine; using UnityEngine.XR; namespace Passer.Tracking { public class UnityXRCamera : SensorComponent { #if pUNITYXR public TrackerComponent tracker; protected Camera unityCamera; protected InputDevice device; #region Start public static UnityXRCamera FindXRCamera(UnityXR unityXR) { UnityXRCamera xrCamera = unityXR.GetComponentInChildren(); return xrCamera; } /// Find or Create a new Unity XR Camera //public static UnityXRCamera Get(UnityXR unityXR, Vector3 position, Quaternion rotation) { // if (unityXR == null) // return null; // //Transform cameraTransform = tracker.transform.Find("Camera"); // //if (cameraTransform == null) { // UnityXRCamera unityCamera = FindXRCamera(unityXR); // if (unityCamera == null) { // GameObject trackerObject = new GameObject("Camera"); // Transform cameraTransform = trackerObject.transform; // cameraTransform.parent = unityXR.transform; // cameraTransform.position = position; // cameraTransform.rotation = rotation; // unityCamera = cameraTransform.gameObject.AddComponent(); // unityCamera.tracker = unityXR; // unityCamera.unityCamera = cameraTransform.GetComponent(); // if (unityCamera.unityCamera == null) { // // There are 4 places where a UnityXR camera is created... // // 1 in UnityXR and 3 in UnityXRCamera // unityCamera.unityCamera = cameraTransform.gameObject.AddComponent(); // unityCamera.unityCamera.nearClipPlane = 0.1F; // unityCamera.unityCamera.clearFlags = CameraClearFlags.SolidColor; // cameraTransform.gameObject.AddComponent(); // } // } // return unityCamera; //} //public static UnityXRCamera Get(UnityXR unityXR, InputDevice device) { // if (unityXR == null) // return null; // UnityXRCamera unityCamera = FindXRCamera(unityXR); // if (unityCamera == null) { // GameObject trackerObject = new GameObject("Camera"); // Transform cameraTransform = trackerObject.transform; // cameraTransform.parent = unityXR.transform; // cameraTransform.localPosition = Vector3.zero; // cameraTransform.localRotation = Quaternion.identity; // unityCamera = cameraTransform.gameObject.AddComponent(); // unityCamera.tracker = unityXR; // unityCamera.unityCamera = cameraTransform.GetComponent(); // if (unityCamera.unityCamera == null) { // // There are 4 places where a UnityXR camera is created... // // 1 in UnityXR and 3 in UnityXRCamera // unityCamera.unityCamera = cameraTransform.gameObject.AddComponent(); // unityCamera.unityCamera.nearClipPlane = 0.1F; // unityCamera.unityCamera.clearFlags = CameraClearFlags.SolidColor; // cameraTransform.gameObject.AddComponent(); // } // } // unityCamera.device = device; // return unityCamera; //} //public static Camera AddCamera(UnityXRCamera xrHmd) { // xrHmd.unityCamera = xrHmd.GetComponent(); // if (xrHmd.unityCamera == null) { // // There are 4 places where a UnityXR camera is created... // // 1 in UnityXR and 3 in UnityXRCamera // xrHmd.unityCamera = xrHmd.gameObject.AddComponent(); // xrHmd.unityCamera.nearClipPlane = 0.1F; // xrHmd.unityCamera.clearFlags = CameraClearFlags.SolidColor; // xrHmd.gameObject.AddComponent(); // } // //if (collisionFader) // // AddScreenFader(xrHmd); // //else // // RemoveScreenFader(xrHmd.transform); // return xrHmd.unityCamera; //} public static void RemoveCamera(UnityXRCamera xrHmd) { Camera camera = xrHmd.GetComponentInChildren(); if (camera != null) { if (Application.isPlaying) Destroy(camera); else DestroyImmediate(camera); } AudioListener listener = xrHmd.GetComponentInChildren(); if (listener != null) { if (Application.isPlaying) Destroy(listener); else DestroyImmediate(listener); } } #endregion #region Update private List nodeStates = new List(); public override void UpdateComponent() { base.UpdateComponent(); status = Tracker.Status.Present; positionConfidence = 0; rotationConfidence = 0; // This is still legacy! InputTracking.GetNodeStates(nodeStates); foreach (XRNodeState nodeState in nodeStates) { if (nodeState.nodeType == XRNode.CenterEye) { Vector3 position; if (nodeState.TryGetPosition(out position)) { transform.position = tracker.transform.TransformPoint(position); positionConfidence = 1; status = Tracker.Status.Tracking; } Quaternion rotation; if (nodeState.TryGetRotation(out rotation)) { transform.rotation = tracker.transform.rotation * rotation; rotationConfidence = 1; status = Tracker.Status.Tracking; } } } } public void Show(bool showModel) { } #endregion #endif } }