using UnityEngine;
using UnityEngine.UI;
using UnityEngine.XR;
namespace Unity.XR.XREAL.Samples
{
///
/// This class is used to adjust the focus plane of the XR display subsystem.
///
public class FocusPlanePanel : MonoBehaviour
{
public bool AjustFocusPlaneNormal { get; set; } = false;
[SerializeField]
Text m_FocusDistance;
[SerializeField]
Text m_FocusPoint;
[SerializeField]
Text m_FocusNormal;
Transform m_Camera;
RaycastHit m_HitResult;
void Start()
{
m_Camera = XREALUtility.MainCamera.transform;
}
void Update()
{
if (Physics.Raycast(new Ray(m_Camera.position, m_Camera.forward), out m_HitResult, 100))
{
Vector3 focusPoint = m_Camera.InverseTransformPoint(m_HitResult.point);
Vector3 normal = AjustFocusPlaneNormal ? m_Camera.InverseTransformDirection(m_HitResult.normal) : Vector3.back;
m_FocusDistance.text = focusPoint.magnitude.ToString("F2");
m_FocusPoint.text = focusPoint.ToString();
m_FocusNormal.text = normal.ToString();
SetFocusPlane(focusPoint, normal);
}
}
void SetFocusPlane(Vector3 point, Vector3 normal)
{
XREALUtility.GetLoadedSubsystem()?.SetFocusPlane(point, normal, Vector3.zero);
}
void OnDrawGizmos()
{
if (m_HitResult.collider != null)
{
Gizmos.DrawSphere(m_HitResult.point, 0.05f);
Gizmos.DrawLine(m_Camera.position, m_HitResult.point);
}
}
}
}