XRTrackedObject.cs
5.86 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
using System;
using System.Runtime.InteropServices;
namespace UnityEngine.XR.ARSubsystems
{
/// <summary>
/// Describes a tracked object detected by the <see cref="XRObjectTrackingSubsystem"/>.
/// </summary>
/// <remarks>
/// Tracked objects are detected based on the contents of an <see cref="XRReferenceObjectLibrary"/>
/// which contains reference objects for which to scan. Each <see cref="XRTrackedObject"/> represents
/// an <see cref="XRReferenceObject"/> which has been detected in the environment.
/// </remarks>
/// <seealso cref="XRReferenceObject"/>
/// <seealso cref="XRReferenceObjectLibrary"/>
[StructLayout(LayoutKind.Sequential)]
public struct XRTrackedObject : ITrackable, IEquatable<XRTrackedObject>
{
/// <summary>
/// A <see cref="XRTrackedObject"/> with appropriate default values.
/// </summary>
public static XRTrackedObject defaultValue => s_Default;
/// <summary>
/// The <see cref="TrackableId"/> associated with this tracked object.
/// </summary>
public TrackableId trackableId => m_TrackableId;
/// <summary>
/// The <c>Pose</c> associated with this tracked object.
/// </summary>
public Pose pose => m_Pose;
/// <summary>
/// The <see cref="TrackingState"/> associated with this tracked object.
/// </summary>
public TrackingState trackingState => m_TrackingState;
/// <summary>
/// A native pointer associated with this tracked object.
/// </summary>
/// <remarks>
/// The lifetime of this pointer is provider-specific, but
/// should be valid at least until the next call to
/// <see cref="XRObjectTrackingSubsystem.GetChanges(Unity.Collections.Allocator)"/>
/// (typically once per frame).
/// </remarks>
public IntPtr nativePtr => m_NativePtr;
/// <summary>
/// The <c>Guid</c> associated with the source <see cref="XRReferenceObject"/>.
/// </summary>
public Guid referenceObjectGuid => m_ReferenceObjectGuid;
/// <summary>
/// Constructs a <see cref="XRTrackedObject"/>
/// </summary>
/// <param name="trackableId">The <see cref="TrackableId"/> associated with this tracked object.</param>
/// <param name="pose">The <c>Pose</c> of this tracked object.</param>
/// <param name="trackingState">The <see cref="TrackingState"/> of the tracked object.</param>
/// <param name="nativePtr">A native pointer associated with this tracked object. If not <c>null</c>,
/// the object pointed to by this pointer should be valid at least until the next call to
/// <see cref="XRObjectTrackingSubsystem.GetChanges(Unity.Collections.Allocator)"/>.</param>
/// <param name="referenceObjectGuid">The <c>Guid</c> of the reference object which was used to detect this tracked object.</param>
public XRTrackedObject(
TrackableId trackableId,
Pose pose,
TrackingState trackingState,
IntPtr nativePtr,
Guid referenceObjectGuid)
{
m_TrackableId = trackableId;
m_Pose = pose;
m_TrackingState = trackingState;
m_NativePtr = nativePtr;
m_ReferenceObjectGuid = referenceObjectGuid;
}
/// <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="XRTrackedObject"/> and
/// <see cref="Equals(XRTrackedObject)"/> also returns `true`; otherwise `false`.</returns>
public override bool Equals(object obj) => obj is XRTrackedObject other && Equals(other);
/// <summary>
/// Generates a hash suitable for use with containers like `HashSet` and `Dictionary`.
/// </summary>
/// <returns>A hash code generated from this object's <see cref="trackableId"/>.</returns>
public override int GetHashCode() => m_TrackableId.GetHashCode();
/// <summary>
/// Tests for equality. Same as <see cref="Equals(XRTrackedObject)"/>.
/// </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 ==(XRTrackedObject lhs, XRTrackedObject rhs) => lhs.Equals(rhs);
/// <summary>
/// Tests for inequality. Same as `!`<see cref="Equals(XRTrackedObject)"/>.
/// </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 !=(XRTrackedObject lhs, XRTrackedObject rhs) => !lhs.Equals(rhs);
/// <summary>
/// Tests for equality.
/// </summary>
/// <param name="other">The other <see cref="XRTrackedObject"/> to compare against.</param>
/// <returns>`True` if this object's <see cref="trackableId"/> is equal to <paramref name="other"/>'s, otherwise false.</returns>
public bool Equals(XRTrackedObject other) => m_TrackableId.Equals(other.m_TrackableId);
TrackableId m_TrackableId;
Pose m_Pose;
TrackingState m_TrackingState;
IntPtr m_NativePtr;
Guid m_ReferenceObjectGuid;
static readonly XRTrackedObject s_Default = new XRTrackedObject
{
m_TrackableId = TrackableId.invalidId,
m_Pose = Pose.identity,
m_ReferenceObjectGuid = Guid.Empty,
};
}
}