using System; using Unity.Collections; using UnityEngine.XR.ARSubsystems; #if UNITY_EDITOR using UnityEditor; #endif namespace UnityEngine.XR.ARFoundation { /// /// Represents a detected point cloud. These are also known as feature points. /// /// /// Related information: AR Point Cloud Manager component /// [DefaultExecutionOrder(ARUpdateOrder.k_PointCloud)] [DisallowMultipleComponent] [HelpURL(typeof(ARPointCloud))] public class ARPointCloud : ARTrackable { XRPointCloudData m_Data; bool m_PointsUpdated; /// /// Invoked whenever the point cloud is updated. /// public event Action updated; /// /// An array of positions for each point in the point cloud. /// This array is parallel to and /// . Positions are provided in /// point cloud space, that is, relative to this 's /// local position and rotation. /// public NativeSlice? positions { get { if (m_Data.positions.IsCreated) { return m_Data.positions; } return null; } } /// /// An array of identifiers for each point in the point cloud. /// This array is parallel to and /// . /// public NativeSlice? identifiers { get { if (m_Data.identifiers.IsCreated) { return m_Data.identifiers; } return null; } } /// /// An array of confidence values for each point in the point cloud /// ranging from 0..1. /// This array is parallel to and /// . Check for existence with /// confidenceValues.IsCreated. /// public NativeArray? confidenceValues { get { if (m_Data.confidenceValues.IsCreated) { return m_Data.confidenceValues; } return null; } } void Update() { if (m_PointsUpdated && updated != null) { m_PointsUpdated = false; updated(new ARPointCloudUpdatedEventArgs()); } } #if UNITY_EDITOR void Awake() { AssemblyReloadEvents.beforeAssemblyReload += DisposeNativeContainers; } #endif void OnDestroy() { DisposeNativeContainers(); #if UNITY_EDITOR AssemblyReloadEvents.beforeAssemblyReload -= DisposeNativeContainers; #endif } void DisposeNativeContainers() { m_Data.Dispose(); } internal void UpdateData(XRPointCloudSubsystem subsystem) { m_Data.Dispose(); m_Data = subsystem.GetPointCloudData(trackableId, Allocator.Persistent); m_PointsUpdated = m_Data.positions.IsCreated; } } }