Assignment for RMIT Mixed Reality in 2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

128 lines
5.1 KiB

// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See LICENSE in the project root for license information.
//
// ###
// # Kindly borrowed and extended from Microsoft MRTK (https://github.com/Microsoft/MixedRealityToolkit-Unity) to work with VRTK.
// ###
#if UNITY_WSA
#if !UNITY_2017_2_OR_NEWER
using UnityEngine.VR.WSA.Input;
#else
using UnityEngine.XR.WSA.Input;
#if !UNITY_EDITOR
using System;
using System.Collections.Generic;
using Windows.Devices.Haptics;
using Windows.Foundation;
using Windows.Perception;
using Windows.Storage.Streams;
using Windows.UI.Input.Spatial;
#endif
#endif
#endif
namespace VRTK.WindowsMixedReality.Utilities
{
/// <summary>
/// Extensions for the InteractionSource class to add haptics and expose the renderable model.
/// </summary>
public static class InteractionSourceExtensions
{
// This value is standardized according to www.usb.org/developers/hidpage/HUTRR63b_-_Haptics_Page_Redline.pdf
private const ushort ContinuousBuzzWaveform = 0x1004;
#if UNITY_WSA
public static void StartHaptics(this InteractionSource interactionSource, float intensity)
{
interactionSource.StartHaptics(intensity, float.MaxValue);
}
public static void StartHaptics(this InteractionSource interactionSource, float intensity, float durationInSeconds)
{
if (!WindowsApiChecker.UniversalApiContractV4_IsAvailable)
{
return;
}
#if !UNITY_EDITOR && UNITY_2017_2_OR_NEWER
UnityEngine.WSA.Application.InvokeOnUIThread(() =>
{
IReadOnlyList<SpatialInteractionSourceState> sources = SpatialInteractionManager.GetForCurrentView().GetDetectedSourcesAtTimestamp(PerceptionTimestampHelper.FromHistoricalTargetTime(DateTimeOffset.Now));
foreach (SpatialInteractionSourceState sourceState in sources)
{
if (sourceState.Source.Id.Equals(interactionSource.id))
{
SimpleHapticsController simpleHapticsController = sourceState.Source.Controller.SimpleHapticsController;
foreach (SimpleHapticsControllerFeedback hapticsFeedback in simpleHapticsController.SupportedFeedback)
{
if (hapticsFeedback.Waveform.Equals(ContinuousBuzzWaveform))
{
if (durationInSeconds.Equals(float.MaxValue))
{
simpleHapticsController.SendHapticFeedback(hapticsFeedback, intensity);
}
else
{
simpleHapticsController.SendHapticFeedbackForDuration(hapticsFeedback, intensity, TimeSpan.FromSeconds(durationInSeconds));
}
return;
}
}
}
}
}, true);
#endif
}
public static void StopHaptics(this InteractionSource interactionSource)
{
if (!WindowsApiChecker.UniversalApiContractV4_IsAvailable)
{
return;
}
#if !UNITY_EDITOR && UNITY_2017_2_OR_NEWER
UnityEngine.WSA.Application.InvokeOnUIThread(() =>
{
IReadOnlyList<SpatialInteractionSourceState> sources = SpatialInteractionManager.GetForCurrentView().GetDetectedSourcesAtTimestamp(PerceptionTimestampHelper.FromHistoricalTargetTime(DateTimeOffset.Now));
foreach (SpatialInteractionSourceState sourceState in sources)
{
if (sourceState.Source.Id.Equals(interactionSource.id))
{
sourceState.Source.Controller.SimpleHapticsController.StopFeedback();
}
}
}, true);
#endif
}
#if !UNITY_EDITOR && UNITY_2017_2_OR_NEWER
public static IAsyncOperation<IRandomAccessStreamWithContentType> TryGetRenderableModelAsync(this InteractionSource interactionSource)
{
IAsyncOperation<IRandomAccessStreamWithContentType> returnValue = null;
if (WindowsApiChecker.UniversalApiContractV5_IsAvailable)
{
UnityEngine.WSA.Application.InvokeOnUIThread(() =>
{
IReadOnlyList<SpatialInteractionSourceState> sources = SpatialInteractionManager.GetForCurrentView().GetDetectedSourcesAtTimestamp(PerceptionTimestampHelper.FromHistoricalTargetTime(DateTimeOffset.Now));
foreach (SpatialInteractionSourceState sourceState in sources)
{
if (sourceState.Source.Id.Equals(interactionSource.id))
{
returnValue = sourceState.Source.Controller.TryGetRenderableModelAsync();
}
}
}, true);
}
return returnValue;
}
#endif
#endif
}
}