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 can be different from a zero-initialized raycast hit. /// public static XRRaycastHit defaultValue => s_Default; /// /// The of the trackable which was hit. This can be /// as some trackables (for example, feature points) don't have ids. /// public TrackableId trackableId { get => m_TrackableId; set => m_TrackableId = value; } /// /// The session-space Pose of the intersection. /// public Pose pose { get => m_Pose; set => m_Pose = value; } /// /// The session-space distance from the raycast origin to the intersection point. /// public float distance { get => m_Distance; set => m_Distance = value; } /// /// The types of trackables which were hit by the ray. /// public TrackableType hitType { get => 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 types 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; } /// /// Generates a hash suitable for use with containers like `HashSet` and `Dictionary`. /// /// A hash code generated from this object's fields. 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; } } /// /// Tests for equality. /// /// The `object` to compare against. /// `True` if is of type and /// also returns `true`; otherwise `false`. public override bool Equals(object obj) => (obj is XRRaycastHit other) && Equals(other); /// /// Tests for equality. /// /// The other to compare against. /// `True` if every field in is equal to this , otherwise false. 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); } /// /// Tests for equality. Same as . /// /// The left-hand side of the comparison. /// The right-hand side of the comparison. /// `True` if is equal to , otherwise `false`. public static bool operator ==(XRRaycastHit lhs, XRRaycastHit rhs) => lhs.Equals(rhs); /// /// Tests for inequality. Same as `!`. /// /// The left-hand side of the comparison. /// The right-hand side of the comparison. /// `True` if is not equal to , otherwise `false`. public static bool operator !=(XRRaycastHit lhs, XRRaycastHit rhs) => !lhs.Equals(rhs); TrackableId m_TrackableId; Pose m_Pose; float m_Distance; TrackableType m_HitType; } }