using System; using Unity.Collections; namespace UnityEngine.XR.ARSubsystems { /// /// Represents the data (arrays of positions, confidence values, and identifiers) associated with a point cloud. /// public struct XRPointCloudData : IEquatable, IDisposable { /// /// Positions for each point in the point cloud. This array is parallel /// to and . /// Use positions.IsCreated to check if these exist. /// public NativeArray positions { get => m_Positions; set => m_Positions = value; } NativeArray m_Positions; /// /// Confidence values for each point in the point cloud. This array is parallel /// to and . /// Use confidenceValues.IsCreated to check if these exist. /// public NativeArray confidenceValues { get => m_ConfidenceValues; set => m_ConfidenceValues = value; } NativeArray m_ConfidenceValues; /// /// Identifiers for each point in the point cloud. This array is parallel /// to and . /// Use identifiers.IsCreated to check if these exist. /// /// /// Identifiers are unique to a particular session, which means you can use /// the identifier to match a particular point in the point cloud with a /// previously detected point. /// public NativeArray identifiers { get => m_Identifiers; set => m_Identifiers = value; } NativeArray m_Identifiers; /// /// Checks for the existence of the NativeArrays and disposes them. /// public void Dispose() { if (m_Positions.IsCreated) m_Positions.Dispose(); if (m_ConfidenceValues.IsCreated) m_ConfidenceValues.Dispose(); if (m_Identifiers.IsCreated) m_Identifiers.Dispose(); } /// /// 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_Positions.GetHashCode(); hash = hash * 486187739 + m_ConfidenceValues.GetHashCode(); hash = hash * 486187739 + m_Identifiers.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 XRPointCloudData && Equals((XRPointCloudData)obj); /// /// Generates a string representation of this . /// /// A string representation of this . public override string ToString() { return string.Format("XRPointCloudData: {0} positions {1} confidence values {2} identifiers", m_Positions.Length, m_ConfidenceValues.Length, m_Identifiers.Length); } /// /// Tests for equality. /// /// The other to compare against. /// `True` if every field in is equal to this , otherwise false. public bool Equals(XRPointCloudData other) { return m_Positions.Equals(other.m_Positions) && m_ConfidenceValues.Equals(other.m_ConfidenceValues) && m_Identifiers.Equals(other.m_Identifiers); } /// /// 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 ==(XRPointCloudData lhs, XRPointCloudData 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 !=(XRPointCloudData lhs, XRPointCloudData rhs) => !lhs.Equals(rhs); } }