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?"); } } } }