// SteamVR Boundaries|SDK_SteamVR|005 namespace VRTK { #if VRTK_DEFINE_SDK_STEAMVR using UnityEngine; #endif /// /// The SteamVR Boundaries SDK script provides a bridge to the SteamVR SDK play area. /// [SDK_Description(typeof(SDK_SteamVRSystem))] public class SDK_SteamVRBoundaries #if VRTK_DEFINE_SDK_STEAMVR : SDK_BaseBoundaries #else : SDK_FallbackBoundaries #endif { #if VRTK_DEFINE_SDK_STEAMVR protected SteamVR_PlayArea cachedSteamVRPlayArea; /// /// The InitBoundaries method is run on start of scene and can be used to initialse anything on game start. /// public override void InitBoundaries() { #if UNITY_5_6 && !VRTK_DEFINE_STEAMVR_PLUGIN_1_2_2_OR_NEWER Transform headsetCamera = VRTK_DeviceFinder.HeadsetCamera(); if (headsetCamera != null && headsetCamera.GetComponent() == null) { headsetCamera.gameObject.AddComponent(); } #endif SteamVR_PlayArea area = GetCachedSteamVRPlayArea(); if (area != null) { area.BuildMesh(); } } /// /// The GetPlayArea method returns the Transform of the object that is used to represent the play area in the scene. /// /// A transform of the object representing the play area in the scene. public override Transform GetPlayArea() { cachedPlayArea = GetSDKManagerPlayArea(); if (cachedPlayArea == null) { SteamVR_PlayArea steamVRPlayArea = VRTK_SharedMethods.FindEvenInactiveComponent(true); if (steamVRPlayArea != null) { cachedSteamVRPlayArea = steamVRPlayArea; cachedPlayArea = steamVRPlayArea.transform; } } return cachedPlayArea; } /// /// The GetPlayAreaVertices method returns the points of the play area boundaries. /// /// A Vector3 array of the points in the scene that represent the play area boundaries. public override Vector3[] GetPlayAreaVertices() { SteamVR_PlayArea area = GetCachedSteamVRPlayArea(); if (area != null) { return ProcessVertices(area.vertices); } return null; } /// /// The GetPlayAreaBorderThickness returns the thickness of the drawn border for the given play area. /// /// The thickness of the drawn border. public override float GetPlayAreaBorderThickness() { SteamVR_PlayArea area = GetCachedSteamVRPlayArea(); if (area != null) { return area.borderThickness; } return 0f; } /// /// The IsPlayAreaSizeCalibrated method returns whether the given play area size has been auto calibrated by external sensors. /// /// Returns true if the play area size has been auto calibrated and set by external sensors. public override bool IsPlayAreaSizeCalibrated() { SteamVR_PlayArea area = GetCachedSteamVRPlayArea(); return (area != null && area.size == SteamVR_PlayArea.Size.Calibrated); } /// /// The GetDrawAtRuntime method returns whether the given play area drawn border is being displayed. /// /// Returns true if the drawn border is being displayed. public override bool GetDrawAtRuntime() { SteamVR_PlayArea area = GetCachedSteamVRPlayArea(); return (area != null ? area.drawInGame : false); } /// /// The SetDrawAtRuntime method sets whether the given play area drawn border should be displayed at runtime. /// /// The state of whether the drawn border should be displayed or not. public override void SetDrawAtRuntime(bool value) { SteamVR_PlayArea area = GetCachedSteamVRPlayArea(); if (area != null) { area.drawInGame = value; area.enabled = true; } } protected virtual SteamVR_PlayArea GetCachedSteamVRPlayArea() { if (cachedSteamVRPlayArea == null) { Transform checkPlayArea = GetPlayArea(); if (checkPlayArea != null) { cachedSteamVRPlayArea = checkPlayArea.GetComponent(); } } return cachedSteamVRPlayArea; } protected virtual Vector3[] ProcessVertices(Vector3[] vertices) { #if VRTK_DEFINE_STEAMVR_PLUGIN_1_2_2_OR_NEWER return vertices; #else //If there aren't enough vertices or the play area is calibrated then just return if (vertices.Length < 8 || IsPlayAreaSizeCalibrated()) { return vertices; } //Go through the existing vertices and swap them around so they're in the correct expected location Vector3[] modifiedVertices = new Vector3[8]; int[] verticeIndexes = new int[] { 3, 0, 1, 2, 7, 4, 5, 6 }; for (int i = 0; i < modifiedVertices.Length; i++) { modifiedVertices[i] = vertices[verticeIndexes[i]]; } return modifiedVertices; #endif } #endif } }