4 #if UNITY_2017_2_OR_NEWER 6 using System.Collections.Generic;
19 #if UNITY_2017_2_OR_NEWER 20 [Tooltip(
"Quad prefab to display as the floor.")]
21 public GameObject FloorQuad = null;
22 private GameObject floorQuadInstance = null;
25 [Tooltip(
"Approximate max Y height of your space.")]
26 private float boundaryHeight = 10f;
29 private float boundaryFloor = 0.0f;
33 private Edge[] boundaryGeometryEdges =
new Edge[0];
38 private TrackingSpaceType opaqueTrackingSpaceType = TrackingSpaceType.RoomScale;
48 private readonly Vector3 floorPositionInEditor =
new Vector3(0f, -3f, 0f);
51 private bool renderFloor =
true;
52 public bool RenderFloor
54 get {
return renderFloor; }
57 if (renderFloor != value)
66 private bool renderBoundary =
true;
67 public bool RenderBoundary
69 get {
return renderBoundary; }
72 if (renderBoundary != value)
74 renderBoundary = value;
75 SetBoundaryRendering();
80 protected override void Awake()
85 bool isDisplayOpaque =
UnityEngine.XR.WSA.HolographicSettings.IsDisplayOpaque;
89 bool isDisplayOpaque =
true;
92 if (isDisplayOpaque && XRSettings.enabled)
94 XRDevice.SetTrackingSpaceType(opaqueTrackingSpaceType);
105 if (XRDevice.GetTrackingSpaceType() == TrackingSpaceType.RoomScale)
112 SetBoundaryRendering();
115 CalculateBoundaryVolume();
118 private void SetFloorRendering()
120 if (floorQuadInstance != null)
122 floorQuadInstance.SetActive(renderFloor);
126 private void SetBoundaryRendering()
129 if (
UnityEngine.Experimental.XR.Boundary.configured)
131 UnityEngine.Experimental.XR.Boundary.visible = renderBoundary;
135 private void RenderFloorQuad()
137 if (FloorQuad != null)
139 floorQuadInstance = Instantiate(FloorQuad);
141 if (!XRDevice.isPresent)
144 floorQuadInstance.transform.position = floorPositionInEditor;
148 floorQuadInstance.transform.position = Vector3.zero;
161 public bool ContainsObject(Vector3 gameObjectPosition)
163 return ContainsObject(gameObjectPosition,
UnityEngine.Experimental.XR.Boundary.Type.TrackedArea);
173 public bool ContainsObject(Vector3 gameObjectPosition,
UnityEngine.Experimental.XR.Boundary.Type boundaryType)
175 gameObjectPosition =
CameraCache.
Main.transform.parent.InverseTransformPoint(gameObjectPosition);
177 if (gameObjectPosition.y < boundaryFloor || gameObjectPosition.y > boundaryHeight)
182 if (boundaryType ==
UnityEngine.Experimental.XR.Boundary.Type.PlayArea)
191 else if (boundaryType ==
UnityEngine.Experimental.XR.Boundary.Type.TrackedArea)
194 return EdgeHelpers.
IsInside(boundaryGeometryEdges,
new Vector2(gameObjectPosition.x, gameObjectPosition.z));
206 public Vector3[] TryGetBoundaryRectanglePoints()
215 var positions =
new Vector3[points2d.Length];
216 for (
int i = 0; i < points2d.Length; ++i)
218 positions[i] =
CameraCache.
Main.transform.parent.TransformPoint(
new Vector3(points2d[i].x, boundaryFloor, points2d[i].y));
226 internal bool TryGetBoundaryRectangleParams(out Vector3 center, out
float angle, out
float width, out
float height)
230 center = Vector3.zero;
231 angle = width = height = 0.0f;
236 inscribedRectangle.
GetRectangleParams(out center2D, out angle, out width, out height);
237 center =
CameraCache.
Main.transform.parent.TransformPoint(
new Vector3(center2D.x, boundaryFloor, center2D.y));
244 public void CalculateBoundaryVolume()
248 if (!
UnityEngine.Experimental.XR.Boundary.configured)
250 Debug.Log(
"Boundary not configured.");
255 if (XRDevice.GetTrackingSpaceType() != TrackingSpaceType.RoomScale)
257 Debug.Log(
"No boundary for non-room scale experiences.");
262 var boundaryGeometryPoints =
new List<Vector3>(0);
263 if (
UnityEngine.Experimental.XR.Boundary.TryGetGeometry(boundaryGeometryPoints,
UnityEngine.Experimental.XR.Boundary.Type.TrackedArea))
265 if (boundaryGeometryPoints.Count > 0)
267 for (
int pointIndex = 0; pointIndex < boundaryGeometryPoints.Count; pointIndex++)
269 boundaryFloor = Math.Min(boundaryFloor, boundaryGeometryPoints[pointIndex].y);
279 Debug.Log(
"TryGetGeometry returned false.");