// --------------------------------------------------------------------------------------------------------------------
//
// Copyright (c) VRMADA, All rights reserved.
//
// --------------------------------------------------------------------------------------------------------------------
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
namespace UltimateXR.UI.UnityInputModule
{
///
/// Raycaster compatible with Unity UI to use components on canvases, enabling touch
/// interaction.
///
[RequireComponent(typeof(Canvas))]
public class UxrFingerTipRaycaster : UxrGraphicRaycaster
{
#region Inspector Properties/Serialized Fields
[SerializeField] private float _fingerTipMinHoverDistance = FingerTipMinHoverDistanceDefault;
[SerializeField] private float _fingerTipMaxAllowedAngle = FingerTipMaxAllowedTipAngle;
#endregion
#region Public Types & Data
///
/// Default maximum distance a can have to a canvas in order to start generating hovering
/// events.
///
public const float FingerTipMinHoverDistanceDefault = 0.05f;
///
/// Default maximum angle between the finger and the canvas for a component to generate
/// input events.
///
public const float FingerTipMaxAllowedTipAngle = 65.0f;
///
/// Gets or sets the maximum distance a can have to a canvas in order to generate hovering
/// events.
///
public float FingerTipMinHoverDistance
{
get => _fingerTipMinHoverDistance;
set => _fingerTipMinHoverDistance = value;
}
#endregion
#region Public Overrides GraphicRaycaster
///
public override void Raycast(PointerEventData eventData, List resultAppendList)
{
// Check if it should be ray-casted
UxrPointerEventData pointerEventData = eventData as UxrPointerEventData;
if (pointerEventData == null || pointerEventData.FingerTip == null)
{
return;
}
// Initialize if necessary
if (_canvas == null)
{
_canvas = gameObject.GetComponent