using System.ComponentModel;
using UnityEngine;
using UnityEngine.InputSystem;
#if AR_FOUNDATION_PRESENT
using UnityEngine.XR.ARFoundation;
#endif
namespace UnityEditor.XR.Interaction.Toolkit
{
///
/// A helper class for , isolating the creation logic for Main Cameras into
/// a separate file.
///
static class XRMainCameraFactory
{
internal static Camera CreateXRMainCamera(CreateUtils.HardwareTarget target)
{
switch (target)
{
case CreateUtils.HardwareTarget.VR:
return CreateVRMainCamera();
case CreateUtils.HardwareTarget.MobileAR:
return CreateARMainCamera();
default:
throw new InvalidEnumArgumentException($"Invalid {nameof(CreateUtils.HardwareTarget)}: {target}");
}
}
static Camera CreateVRMainCamera()
{
var camera = CreateMainCamera();
camera.nearClipPlane = 0.01f;
SetupTrackedPoseDriverInput(camera);
return camera;
}
static Camera CreateARMainCamera()
{
var mainCam = Camera.main;
if (mainCam != null)
{
Debug.LogWarningFormat(
mainCam.gameObject,
"XR Origin Main Camera requires the \"MainCamera\" tag, but the current scene contains another enabled Camera tagged \"MainCamera\". For AR to function properly, remove the \"MainCamera\" tag from \'{0}\' or disable it.",
mainCam.name);
}
var camera = CreateMainCamera();
camera.clearFlags = CameraClearFlags.Color;
camera.backgroundColor = Color.black;
camera.nearClipPlane = 0.1f;
camera.farClipPlane = 20f;
#if AR_FOUNDATION_PRESENT
var cameraGo = camera.gameObject;
cameraGo.AddComponent();
cameraGo.AddComponent();
#endif
SetupTrackedPoseDriverInput(camera);
return camera;
}
static Camera CreateMainCamera()
{
var cameraGo = ObjectFactory.CreateGameObject(
"Main Camera",
typeof(Camera),
typeof(AudioListener));
var camera = cameraGo.GetComponent();
camera.tag = "MainCamera";
return camera;
}
static void SetupTrackedPoseDriverInput(Camera camera)
{
var trackedPoseDriver = camera.gameObject.AddComponent();
var positionAction = new InputAction("Position", binding: "/centerEyePosition", expectedControlType: "Vector3");
positionAction.AddBinding("/devicePosition");
var rotationAction = new InputAction("Rotation", binding: "/centerEyeRotation", expectedControlType: "Quaternion");
rotationAction.AddBinding("/deviceRotation");
var trackingStateAction = new InputAction("Tracking State", binding: "/trackingState", expectedControlType: "Integer");
trackedPoseDriver.positionInput = new InputActionProperty(positionAction);
trackedPoseDriver.rotationInput = new InputActionProperty(rotationAction);
trackedPoseDriver.trackingStateInput = new InputActionProperty(trackingStateAction);
trackedPoseDriver.ignoreTrackingState = false;
}
}
}