namespace VRTK
{
using UnityEngine;
#if UNITY_2017_2_OR_NEWER
using UnityEngine.XR;
#else
using UnityEngine.VR;
using XRSettings = UnityEngine.VR.VRSettings;
using XRDevice = UnityEngine.VR.VRDevice;
#endif
///
/// Camera script for the main camera for Immersive Mixed Reality.
///
[RequireComponent(typeof(Camera))]
public class WindowsMR_Camera : MonoBehaviour
{
[SerializeField]
[Tooltip("Force the Tracking Space Type to be RoomScale (normal VR experiences). If false, Stationary will be forced (e.g. video experiences.")]
private bool forceRoomScaleTracking = true;
public bool ForceRoomScaleTracking
{
get { return forceRoomScaleTracking; }
set { forceRoomScaleTracking = value; }
}
///
/// Name of the Windows Mixed Reality Device as listed in XRSettings.
///
private const string DEVICE_NAME = "WindowsMR";
protected virtual void Awake()
{
if (CheckForMixedRealitySupport())
{
SetupMRCamera();
}
}
protected virtual void Update()
{
if (XRDevice.GetTrackingSpaceType() != TrackingSpaceType.RoomScale && forceRoomScaleTracking)
{
XRDevice.SetTrackingSpaceType(TrackingSpaceType.RoomScale);
}
if (XRDevice.GetTrackingSpaceType() != TrackingSpaceType.Stationary && !forceRoomScaleTracking)
{
XRDevice.SetTrackingSpaceType(TrackingSpaceType.Stationary);
}
}
///
/// Check if the Mixed (Virtual) Reality Settings are properly set.
///
/// Are the settings set.
protected virtual bool CheckForMixedRealitySupport()
{
if (XRSettings.enabled == false)
{
Debug.LogError("XRSettings are not enabled. Enable in PlayerSettings. Do not forget to add Windows Mixed Reality to Virtual Reality SDKs.");
return false;
}
else
{
foreach (string device in XRSettings.supportedDevices)
{
if (device.Equals("WindowsMR"))
{
return true;
}
}
Debug.LogError("Windows Mixed Reality is not supported in XRSettings, add in PlayerSettings.");
}
return false;
}
///
/// Setup the MR camera properly.
///
protected virtual void SetupMRCamera()
{
Camera camera = GetComponent();
if (camera.tag != "MainCamera")
{
camera.tag = "MainCamera";
}
camera.nearClipPlane = 0.01f;
if (camera.stereoTargetEye != StereoTargetEyeMask.Both)
{
Debug.LogError("Target eye of main camera is not set to both. Are you sure you want to render only one eye?");
}
}
}
}