113 lines
4.4 KiB
C#
113 lines
4.4 KiB
C#
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
using Microsoft.MixedReality.Toolkit.Utilities;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using UnityEngine.XR;
|
|
using UnityBoundary = UnityEngine.Experimental.XR.Boundary;
|
|
|
|
namespace Microsoft.MixedReality.Toolkit.Boundary
|
|
{
|
|
/// <summary>
|
|
/// The Boundary system controls the presentation and display of the users boundary in a scene.
|
|
/// </summary>
|
|
[HelpURL("https://docs.microsoft.com/windows/mixed-reality/mrtk-unity/features/boundary/boundary-system-getting-started")]
|
|
public class MixedRealityBoundarySystem : BaseBoundarySystem
|
|
{
|
|
/// <summary>
|
|
/// Constructor.
|
|
/// </summary>
|
|
/// <param name="profile">The configuration profile for the service.</param>
|
|
/// <param name="scale">The application's configured <see cref="Utilities.ExperienceScale"/>.</param>
|
|
public MixedRealityBoundarySystem(
|
|
MixedRealityBoundaryVisualizationProfile profile,
|
|
ExperienceScale scale) : base(profile, scale) { }
|
|
|
|
#region IMixedRealityService Implementation
|
|
|
|
/// <inheritdoc/>
|
|
public override string Name { get; protected set; } = "Mixed Reality Boundary System";
|
|
|
|
#endregion IMixedRealityService Implementation
|
|
|
|
/// <inheritdoc/>
|
|
protected override List<Vector3> GetBoundaryGeometry()
|
|
{
|
|
// Boundaries are supported for Room Scale experiences only.
|
|
if (XRDevice.GetTrackingSpaceType() != TrackingSpaceType.RoomScale)
|
|
{
|
|
return null;
|
|
}
|
|
|
|
// Get the boundary geometry.
|
|
var boundaryGeometry = new List<Vector3>(0);
|
|
|
|
if (!UnityBoundary.TryGetGeometry(boundaryGeometry, UnityBoundary.Type.TrackedArea) || boundaryGeometry.Count == 0)
|
|
{
|
|
return null;
|
|
}
|
|
|
|
return boundaryGeometry;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Updates the <see href="https://docs.unity3d.com/ScriptReference/XR.TrackingSpaceType.html">TrackingSpaceType</see> on the XR device.
|
|
/// </summary>
|
|
protected override void SetTrackingSpace()
|
|
{
|
|
if (Application.isPlaying)
|
|
{
|
|
TrackingSpaceType trackingSpace;
|
|
|
|
// In current versions of Unity, there are two types of tracking spaces. For boundaries, if the scale
|
|
// is not Room or Standing, it currently maps to TrackingSpaceType.Stationary.
|
|
switch (Scale)
|
|
{
|
|
case ExperienceScale.Standing:
|
|
case ExperienceScale.Room:
|
|
trackingSpace = TrackingSpaceType.RoomScale;
|
|
break;
|
|
|
|
case ExperienceScale.OrientationOnly:
|
|
case ExperienceScale.Seated:
|
|
case ExperienceScale.World:
|
|
trackingSpace = TrackingSpaceType.Stationary;
|
|
break;
|
|
|
|
default:
|
|
trackingSpace = TrackingSpaceType.Stationary;
|
|
Debug.LogWarning("Unknown / unsupported ExperienceScale. Defaulting to Stationary tracking space.");
|
|
break;
|
|
}
|
|
|
|
InputTracking.disablePositionalTracking = Scale == ExperienceScale.OrientationOnly;
|
|
|
|
if (!XRDevice.SetTrackingSpaceType(trackingSpace))
|
|
{
|
|
Debug.LogWarning($"MRTK was unable to set Tracking Space to {trackingSpace}");
|
|
}
|
|
}
|
|
}
|
|
|
|
#region Obsolete
|
|
|
|
/// <summary>
|
|
/// Constructor.
|
|
/// </summary>
|
|
/// <param name="registrar">The <see cref="IMixedRealityServiceRegistrar"/> instance that loaded the service.</param>
|
|
/// <param name="profile">The configuration profile for the service.</param>
|
|
/// <param name="scale">The application's configured <see cref="Utilities.ExperienceScale"/>.</param>
|
|
[System.Obsolete("This constructor is obsolete (registrar parameter is no longer required) and will be removed in a future version of the Microsoft Mixed Reality Toolkit.")]
|
|
public MixedRealityBoundarySystem(
|
|
IMixedRealityServiceRegistrar registrar,
|
|
MixedRealityBoundaryVisualizationProfile profile,
|
|
ExperienceScale scale) : this(profile, scale)
|
|
{
|
|
Registrar = registrar;
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
}
|