using System; using System.Runtime.InteropServices; namespace UnityEngine.XR.ARSubsystems { /// /// Represents the intersection of a raycast with a trackable. /// /// /// /// [StructLayout(LayoutKind.Sequential)] public struct XRRaycastHit : IEquatable { static readonly XRRaycastHit s_Default = new XRRaycastHit( TrackableId.invalidId, Pose.identity, 0, TrackableType.None); /// /// A default-initialized raycast hit. /// This may be different from a zero-initialized raycast hit. /// public static XRRaycastHit defaultValue => s_Default; /// /// The of the trackable which was hit. This may be /// as not all trackables have ids, e.g., feature points. /// public TrackableId trackableId { get { return m_TrackableId; } set { m_TrackableId = value; } } /// /// The session-space Pose of the intersection. /// public Pose pose { get { return m_Pose; } set { m_Pose = value; } } /// /// The session-space distance from the raycast origin to the intersection point. /// public float distance { get { return m_Distance; } set { m_Distance = value; } } /// /// The type(s) of trackables which were hit by the ray. /// public TrackableType hitType { get { return m_HitType; } set { m_HitType = value; } } /// /// Constructs an . /// /// The of the trackable which was hit. /// The session-space Pose of the intersection. /// The session-space distance from the raycast origin to the intersection point. /// The type(s) of trackables which were hit by the ray. public XRRaycastHit( TrackableId trackableId, Pose pose, float distance, TrackableType hitType) { m_TrackableId = trackableId; m_Pose = pose; m_Distance = distance; m_HitType = hitType; } public override int GetHashCode() { unchecked { var hash = m_TrackableId.GetHashCode(); hash = hash * 486187739 + m_Pose.GetHashCode(); hash = hash * 486187739 + m_Distance.GetHashCode(); hash = hash * 486187739 + ((int)m_HitType).GetHashCode(); return hash; } } public override bool Equals(object obj) { if (!(obj is XRRaycastHit)) return false; return Equals((XRRaycastHit)obj); } public bool Equals(XRRaycastHit other) { return (m_TrackableId.Equals(other.m_TrackableId)) && (m_Pose.Equals(other.m_Pose)) && (m_Distance.Equals(other.m_Distance)) && (m_HitType == other.m_HitType); } public static bool operator ==(XRRaycastHit lhs, XRRaycastHit rhs) { return lhs.Equals(rhs); } public static bool operator !=(XRRaycastHit lhs, XRRaycastHit rhs) { return !lhs.Equals(rhs); } TrackableId m_TrackableId; Pose m_Pose; float m_Distance; TrackableType m_HitType; } }