ARRaycastHit.cs
7.12 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
using System;
using UnityEngine.XR.ARSubsystems;
namespace UnityEngine.XR.ARFoundation
{
/// <summary>
/// Represents the result of a raycast intersection with a trackable.
/// </summary>
public struct ARRaycastHit : IEquatable<ARRaycastHit>, IComparable<ARRaycastHit>
{
/// <summary>
/// Constructor invoked by <see cref="ARRaycastManager.Raycast(Vector2, System.Collections.Generic.List{ARRaycastHit}, TrackableType)"/>
/// and <see cref="ARRaycastManager.Raycast(Ray, System.Collections.Generic.List{ARRaycastHit}, TrackableType)"/>.
/// </summary>
/// <param name="hit">Session-relative raycast hit data.</param>
/// <param name="distance">The distance, in Unity world space, of the hit.</param>
/// <param name="transform">The <c>Transform</c> that transforms from session space to world space.</param>
/// <exception cref="System.ArgumentNullException">Thrown if <paramref name="transform"/> is `null`.</exception>
[Obsolete("Use ARRaycastHit(XRRaycastHit, float, Transform, ARTrackable) instead. (2020-10-09)")]
public ARRaycastHit(XRRaycastHit hit, float distance, Transform transform)
{
if (transform == null)
throw new ArgumentNullException(nameof(transform));
m_Hit = hit;
this.distance = distance;
m_Transform = transform;
trackable = null;
}
/// <summary>
/// Constructor invoked by <see cref="ARRaycastManager.Raycast(Vector2, System.Collections.Generic.List{ARRaycastHit}, TrackableType)"/>
/// and <see cref="ARRaycastManager.Raycast(Ray, System.Collections.Generic.List{ARRaycastHit}, TrackableType)"/>.
/// </summary>
/// <param name="hit">Session-relative raycast hit data.</param>
/// <param name="distance">The distance, in Unity world space, of the hit.</param>
/// <param name="transform">The <c>Transform</c> that transforms from session space to world space.</param>
/// <param name="trackable">The trackable that was hit by this raycast, or `null` if no trackable was hit.</param>
/// <exception cref="System.ArgumentNullException">Thrown if <paramref name="transform"/> is `null`.</exception>
public ARRaycastHit(XRRaycastHit hit, float distance, Transform transform, ARTrackable trackable)
{
if (transform == null)
throw new ArgumentNullException(nameof(transform));
m_Hit = hit;
this.distance = distance;
m_Transform = transform;
this.trackable = trackable;
}
/// <summary>
/// The distance, in Unity world space, from the ray origin to the intersection point.
/// </summary>
public float distance { get; }
/// <summary>
/// The type of trackable hit by the raycast.
/// </summary>
public TrackableType hitType => m_Hit.hitType;
/// <summary>
/// The <c>Pose</c>, in Unity world space, of the intersection point.
/// </summary>
public Pose pose => m_Transform.TransformPose(sessionRelativePose);
/// <summary>
/// The session-unique identifier for the trackable that was hit.
/// </summary>
public TrackableId trackableId => m_Hit.trackableId;
/// <summary>
/// The <c>Pose</c>, in local (session) space, of the intersection point.
/// </summary>
public Pose sessionRelativePose => m_Hit.pose;
/// <summary>
/// The distance, in local (session) space, from the ray origin to the intersection point.
/// </summary>
public float sessionRelativeDistance => m_Hit.distance;
/// <summary>
/// The <see cref="ARTrackable"/> that this raycast hit, or `null` if no <see cref="ARTrackable"/> was hit.
/// See <see cref="hitType"/> to determine what type of trackable, if any, was hit.
/// </summary>
public ARTrackable trackable { get; }
/// <summary>
/// Generates a hash suitable for use with containers like `HashSet` and `Dictionary`.
/// </summary>
/// <returns>A hash code generated from this object's fields.</returns>
public override int GetHashCode() => HashCode.Combine(
m_Hit.GetHashCode(),
distance.GetHashCode(),
HashCode.ReferenceHash(m_Transform),
HashCode.ReferenceHash(trackable));
/// <summary>
/// Tests for equality.
/// </summary>
/// <param name="obj">The `object` to compare against.</param>
/// <returns>`True` if <paramref name="obj"/> is of type <see cref="ARRaycastHit"/> and
/// <see cref="Equals(ARRaycastHit)"/> also returns `true`; otherwise `false`.</returns>
public override bool Equals(object obj) => obj is ARRaycastHit other && Equals(other);
/// <summary>
/// Tests for equality.
/// </summary>
/// <param name="other">The other <see cref="ARRaycastHit"/> to compare against.</param>
/// <returns>`True` if every field in <paramref name="other"/> is equal to this <see cref="ARRaycastHit"/>, otherwise false.</returns>
public bool Equals(ARRaycastHit other)
{
return
m_Hit.Equals(other.m_Hit) &&
distance.Equals(other.distance) &&
m_Transform == other.m_Transform &&
trackable == other.trackable;
}
/// <summary>
/// Tests for equality. Same as <see cref="Equals(ARRaycastHit)"/>.
/// </summary>
/// <param name="lhs">The left-hand side of the comparison.</param>
/// <param name="rhs">The right-hand side of the comparison.</param>
/// <returns>`True` if <paramref name="lhs"/> is equal to <paramref name="rhs"/>, otherwise `false`.</returns>
public static bool operator ==(ARRaycastHit lhs, ARRaycastHit rhs) => lhs.Equals(rhs);
/// <summary>
/// Tests for inequality. Same as `!`<see cref="Equals(ARRaycastHit)"/>.
/// </summary>
/// <param name="lhs">The left-hand side of the comparison.</param>
/// <param name="rhs">The right-hand side of the comparison.</param>
/// <returns>`True` if <paramref name="lhs"/> is not equal to <paramref name="rhs"/>, otherwise `false`.</returns>
public static bool operator !=(ARRaycastHit lhs, ARRaycastHit rhs) => !lhs.Equals(rhs);
/// <summary>
/// Used for sorting two raycast hits by distance. Uses [CompareTo](https://docs.microsoft.com/en-us/dotnet/api/system.icomparable.compareto?view=netframework-4.8)
/// on the raycasts' distance properties.
/// </summary>
/// <param name="other">The other <see cref="ARRaycastHit"/> to compare against.</param>
/// <returns>A value less than zero if this raycast hit is closer than <paramref name="other"/>, zero if the distances
/// are equal, and a positive value if <paramref name="other"/> is closer.</returns>
public int CompareTo(ARRaycastHit other) => m_Hit.distance.CompareTo(other.m_Hit.distance);
XRRaycastHit m_Hit;
Transform m_Transform;
}
}