Pascal Serrarens 17741d862a First commit
2022-01-12 10:50:57 +01:00

170 lines
6.2 KiB
C#

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<UnityXRCamera>();
return xrCamera;
}
/// <summary>Find or Create a new Unity XR Camera</summary>
//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<UnityXRCamera>();
// unityCamera.tracker = unityXR;
// unityCamera.unityCamera = cameraTransform.GetComponent<Camera>();
// 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<Camera>();
// unityCamera.unityCamera.nearClipPlane = 0.1F;
// unityCamera.unityCamera.clearFlags = CameraClearFlags.SolidColor;
// cameraTransform.gameObject.AddComponent<AudioListener>();
// }
// }
// 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<UnityXRCamera>();
// unityCamera.tracker = unityXR;
// unityCamera.unityCamera = cameraTransform.GetComponent<Camera>();
// 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<Camera>();
// unityCamera.unityCamera.nearClipPlane = 0.1F;
// unityCamera.unityCamera.clearFlags = CameraClearFlags.SolidColor;
// cameraTransform.gameObject.AddComponent<AudioListener>();
// }
// }
// unityCamera.device = device;
// return unityCamera;
//}
//public static Camera AddCamera(UnityXRCamera xrHmd) {
// xrHmd.unityCamera = xrHmd.GetComponent<Camera>();
// 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<Camera>();
// xrHmd.unityCamera.nearClipPlane = 0.1F;
// xrHmd.unityCamera.clearFlags = CameraClearFlags.SolidColor;
// xrHmd.gameObject.AddComponent<AudioListener>();
// }
// //if (collisionFader)
// // AddScreenFader(xrHmd);
// //else
// // RemoveScreenFader(xrHmd.transform);
// return xrHmd.unityCamera;
//}
public static void RemoveCamera(UnityXRCamera xrHmd) {
Camera camera = xrHmd.GetComponentInChildren<Camera>();
if (camera != null) {
if (Application.isPlaying)
Destroy(camera);
else
DestroyImmediate(camera);
}
AudioListener listener = xrHmd.GetComponentInChildren<AudioListener>();
if (listener != null) {
if (Application.isPlaying)
Destroy(listener);
else
DestroyImmediate(listener);
}
}
#endregion
#region Update
private List<XRNodeState> nodeStates = new List<XRNodeState>();
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
}
}