// 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
{
///
/// A Windows Mixed Reality source instance.
///
public abstract class BaseWindowsMixedRealityXRSDKSource : GenericXRSDKController
{
///
/// Constructor.
///
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");
///
/// Update spatial pointer and spatial grip data.
///
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;
}
}
}
}
}