76 lines
3.2 KiB
C#
76 lines
3.2 KiB
C#
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
using Microsoft.MixedReality.Toolkit.Input;
|
|
using Microsoft.MixedReality.Toolkit.Utilities;
|
|
using Microsoft.MixedReality.Toolkit.XRSDK.Input;
|
|
using Unity.Profiling;
|
|
using UnityEngine;
|
|
using UnityEngine.XR;
|
|
|
|
namespace Microsoft.MixedReality.Toolkit.XRSDK.WindowsMixedReality
|
|
{
|
|
/// <summary>
|
|
/// A Windows Mixed Reality source instance.
|
|
/// </summary>
|
|
public abstract class BaseWindowsMixedRealityXRSDKSource : GenericXRSDKController
|
|
{
|
|
/// <summary>
|
|
/// Constructor.
|
|
/// </summary>
|
|
protected BaseWindowsMixedRealityXRSDKSource(
|
|
TrackingState trackingState,
|
|
Handedness sourceHandedness,
|
|
IMixedRealityInputSource inputSource = null,
|
|
MixedRealityInteractionMapping[] interactions = null,
|
|
IMixedRealityInputSourceDefinition definition = null)
|
|
: base(trackingState, sourceHandedness, inputSource, interactions, definition)
|
|
{ }
|
|
|
|
private Vector3 currentPointerPosition = Vector3.zero;
|
|
private Quaternion currentPointerRotation = Quaternion.identity;
|
|
private MixedRealityPose currentPointerPose = MixedRealityPose.ZeroIdentity;
|
|
|
|
private static readonly ProfilerMarker UpdatePoseDataPerfMarker = new ProfilerMarker("[MRTK] BaseWindowsMixedRealityXRSDKSource.UpdatePoseData");
|
|
|
|
/// <summary>
|
|
/// Update spatial pointer and spatial grip data.
|
|
/// </summary>
|
|
protected override void UpdatePoseData(MixedRealityInteractionMapping interactionMapping, InputDevice inputDevice)
|
|
{
|
|
using (UpdatePoseDataPerfMarker.Auto())
|
|
{
|
|
Debug.Assert(interactionMapping.AxisType == AxisType.SixDof);
|
|
|
|
// Update the interaction data source
|
|
switch (interactionMapping.InputType)
|
|
{
|
|
case DeviceInputType.SpatialPointer:
|
|
if (inputDevice.TryGetFeatureValue(CustomUsages.PointerPosition, out currentPointerPosition))
|
|
{
|
|
currentPointerPose.Position = MixedRealityPlayspace.TransformPoint(currentPointerPosition);
|
|
}
|
|
|
|
if (inputDevice.TryGetFeatureValue(CustomUsages.PointerRotation, out currentPointerRotation))
|
|
{
|
|
currentPointerPose.Rotation = MixedRealityPlayspace.Rotation * currentPointerRotation;
|
|
}
|
|
|
|
interactionMapping.PoseData = currentPointerPose;
|
|
|
|
// If our value changed raise it.
|
|
if (interactionMapping.Changed)
|
|
{
|
|
// Raise input system event if it's enabled
|
|
CoreServices.InputSystem?.RaisePoseInputChanged(InputSource, ControllerHandedness, interactionMapping.MixedRealityInputAction, interactionMapping.PoseData);
|
|
}
|
|
break;
|
|
default:
|
|
base.UpdatePoseData(interactionMapping, inputDevice);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|