XRFace.cs
5.49 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
using System;
using System.Runtime.InteropServices;
namespace UnityEngine.XR.ARSubsystems
{
/// <summary>
/// A struct describing face data that is stored in the <see cref="XRFaceSubsystem"/>
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct XRFace : ITrackable, IEquatable<XRFace>
{
// Fields to marshall/serialize from native code
TrackableId m_TrackableId;
Pose m_Pose;
TrackingState m_TrackingState;
IntPtr m_NativePtr;
Pose m_LeftEyePose;
Pose m_RightEyePose;
Vector3 m_FixationPoint;
/// <summary>
/// Get a <see cref="XRFace"/> with reasonable default values.
/// </summary>
public static XRFace defaultValue => s_Default;
static readonly XRFace s_Default = new XRFace
{
m_TrackableId = TrackableId.invalidId,
m_Pose = Pose.identity,
m_LeftEyePose = Pose.identity,
m_RightEyePose = Pose.identity,
};
/// <summary>
/// The unique <see cref="TrackableId"/> of the face as a trackable within the <see cref="XRFaceSubsystem"/>.
/// </summary>
/// <remarks>
/// With this, you are able to extract more data about this particular face from the <see cref="XRFaceSubsystem"/>.
/// </remarks>
public TrackableId trackableId => m_TrackableId;
/// <summary>
/// The <see cref="pose"/> of the face describes its position and rotation in session space.
/// </summary>
public Pose pose => m_Pose;
/// <summary>
/// The tracking state associated with this <see cref="XRFace"/>.
/// </summary>
public TrackingState trackingState => m_TrackingState;
/// <summary>
/// A native pointer associated with this <see cref="XRFace"/>.
/// </summary>
/// <remarks>
/// The data pointed to by this pointer is implementation-defined.
/// </remarks>
public IntPtr nativePtr => m_NativePtr;
/// <summary>
/// The pose of the left eye in relation to the face.
/// </summary>
public Pose leftEyePose => m_LeftEyePose;
/// <summary>
/// The pose of the right eye in relation to the face.
/// </summary>
public Pose rightEyePose => m_RightEyePose;
/// <summary>
/// The position of which the eyes are fixated in relation to the face.
/// </summary>
public Vector3 fixationPoint => m_FixationPoint;
/// <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="XRFace"/> and
/// <see cref="Equals(XRFace)"/> also returns `true`; otherwise `false`.</returns>
public override bool Equals(object obj) => obj is XRFace && Equals((XRFace)obj);
/// <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()
{
unchecked
{
var hashCode = trackableId.GetHashCode();
hashCode = (hashCode * 486187739) + pose.GetHashCode();
hashCode = (hashCode * 486187739) + ((int)trackingState).GetHashCode();
hashCode = (hashCode * 486187739) + nativePtr.GetHashCode();
hashCode = (hashCode * 486187739) + leftEyePose.GetHashCode();
hashCode = (hashCode * 486187739) + rightEyePose.GetHashCode();
hashCode = (hashCode * 486187739) + fixationPoint.GetHashCode();
return hashCode;
}
}
/// <summary>
/// Tests for equality. Same as <see cref="Equals(XRFace)"/>.
/// </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==(XRFace lhs, XRFace rhs) => lhs.Equals(rhs);
/// <summary>
/// Tests for inequality. Same as `!`<see cref="Equals(XRFace)"/>.
/// </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!=(XRFace lhs, XRFace rhs) => !lhs.Equals(rhs);
/// <summary>
/// Tests for equality.
/// </summary>
/// <param name="other">The other <see cref="XRFace"/> to compare against.</param>
/// <returns>`True` if every field in <paramref name="other"/> is equal to this <see cref="XRFace"/>, otherwise false.</returns>
public bool Equals(XRFace other)
{
return
trackableId.Equals(other.trackableId) &&
pose.Equals(other.pose) &&
(trackingState == other.trackingState) &&
(nativePtr == other.nativePtr) &&
(leftEyePose.Equals(other.leftEyePose)) &&
(rightEyePose.Equals(other.rightEyePose)) &&
(fixationPoint.Equals(other.fixationPoint));
}
};
}