/****************************************************************************
* Copyright 2019 Nreal Techonology Limited. All rights reserved.
*
* This file is part of NRSDK.
*
* https://www.nreal.ai/
*
*****************************************************************************/
namespace NRKernal
{
using UnityEngine;
/// A nr laser reticle.
public class NRLaserReticle : MonoBehaviour
{
/// Values that represent reticle states.
public enum ReticleState
{
/// An enum constant representing the hide option.
Hide,
/// An enum constant representing the normal option.
Normal,
/// An enum constant representing the hover option.
Hover,
}
/// The raycaster.
[SerializeField]
private NRPointerRaycaster m_Raycaster;
/// The default visual.
[SerializeField]
private GameObject m_DefaultVisual;
/// The hover visual.
[SerializeField]
private GameObject m_HoverVisual;
/// The hit target.
private GameObject m_HitTarget;
/// True if is visible, false if not.
private bool m_IsVisible = true;
/// The default distance.
public float defaultDistance = 2.5f;
/// The reticle size ratio.
public float reticleSizeRatio = 0.02f;
/// Gets the camera root.
/// The m camera root.
private Transform m_CameraRoot
{
get
{
return NRInput.CameraCenter;
}
}
/// Gets the hit target.
/// The hit target.
public GameObject HitTarget
{
get
{
return m_HitTarget;
}
}
/// Awakes this object.
private void Awake()
{
SwitchReticleState(ReticleState.Hide);
defaultDistance = Mathf.Clamp(defaultDistance, m_Raycaster.NearDistance, m_Raycaster.FarDistance);
}
/// Late update.
protected virtual void LateUpdate()
{
if (!m_IsVisible || !NRInput.ReticleVisualActive)
{
SwitchReticleState(ReticleState.Hide);
return;
}
var result = m_Raycaster.FirstRaycastResult();
var points = m_Raycaster.BreakPoints;
var pointCount = points.Count;
if (result.isValid)
{
SwitchReticleState(ReticleState.Hover);
transform.position = result.worldPosition;
transform.rotation = Quaternion.LookRotation(result.worldNormal, m_Raycaster.transform.forward);
m_HitTarget = result.gameObject;
}
else
{
SwitchReticleState(ReticleState.Normal);
if (pointCount != 0)
{
transform.localPosition = Vector3.forward * defaultDistance;
transform.localRotation = Quaternion.identity;
}
m_HitTarget = null;
}
if (m_CameraRoot)
transform.localScale = Vector3.one * reticleSizeRatio * (transform.position - m_CameraRoot.transform.position).magnitude;
}
/// Executes the 'disable' action.
private void OnDisable()
{
SwitchReticleState(ReticleState.Hide);
}
/// Switch reticle state.
/// The state.
private void SwitchReticleState(ReticleState state)
{
switch (state)
{
case ReticleState.Hide:
m_DefaultVisual.SetActive(false);
m_HoverVisual.SetActive(false);
break;
case ReticleState.Normal:
m_DefaultVisual.SetActive(true);
m_HoverVisual.SetActive(false);
break;
case ReticleState.Hover:
m_DefaultVisual.SetActive(false);
m_HoverVisual.SetActive(true);
break;
default:
break;
}
}
/// Sets a visible.
/// True if is visible, false if not.
public void SetVisible(bool isVisible)
{
this.m_IsVisible = isVisible;
}
}
}