// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
using Microsoft.MixedReality.Toolkit.Utilities;
using Unity.Profiling;
using UnityEngine;
using UInput = UnityEngine.Input;
namespace Microsoft.MixedReality.Toolkit.Input
{
///
/// Uses the desktop mouse cursor instead of any mouse representation within the scene.
/// Its movement is bound to screenspace.
///
[AddComponentMenu("Scripts/MRTK/SDK/ScreenSpaceMousePointer")]
public class ScreenSpaceMousePointer : BaseMousePointer
{
private Vector2 lastMousePosition;
///
protected override string ControllerName => "ScreenSpace Mouse Pointer";
private static readonly ProfilerMarker OnPreSceneQueryPerfMarker = new ProfilerMarker("[MRTK] ScreenSpaceMousePointer.OnPreSceneQuery");
///
public override void OnPreSceneQuery()
{
using (OnPreSceneQueryPerfMarker.Auto())
{
if (UInput.mousePosition.x < 0 ||
UInput.mousePosition.y < 0 ||
UInput.mousePosition.x > Screen.width ||
UInput.mousePosition.y > Screen.height)
{
return;
}
Vector3 currentMousePosition = UInput.mousePosition;
if ((lastMousePosition - (Vector2)currentMousePosition).magnitude >= MovementThresholdToUnHide)
{
SetVisibility(true);
}
lastMousePosition = currentMousePosition;
Camera mainCamera = CameraCache.Main;
Ray ray = mainCamera.ScreenPointToRay(currentMousePosition);
Rays[0].CopyRay(ray, float.MaxValue);
transform.position = mainCamera.transform.position;
transform.rotation = Quaternion.LookRotation(ray.direction);
}
}
///
protected override void SetVisibility(bool visible)
{
base.SetVisibility(visible);
Cursor.visible = visible;
}
}
}