using System; namespace UnityEngine.XR.ARSubsystems { /// /// The descriptor of the that shows which depth detectiomn features are available on that XRSubsystem. /// /// /// You use the Create factory method along with struct to construct and /// register one of these from each depth data provider. /// /// public class XRDepthSubsystemDescriptor : SubsystemDescriptor { /// /// Describes the capabilities of an . /// [Flags] public enum Capabilities { None = 0, FeaturePoints = 1 << 0, Confidence = 1 << 1, UniqueIds = 1 << 2 } /// /// This struct is an initializer for the creation of a . /// /// /// Depth data provider should create during InitializeOnLoad a descriptor using /// the params here to specify which of the XRDepthSubsystem features it supports. /// public struct Cinfo : IEquatable { /// /// The string identifier for a specific implementation. /// public string id; /// /// The concrete Type which will be instantiated if Create is called on this subsystem descriptor. /// public Type implementationType; /// /// Whether the subsystem supports feature points /// public bool supportsFeaturePoints { get { return (capabilities & Capabilities.FeaturePoints) != 0; } set { if (value) { capabilities |= Capabilities.FeaturePoints; } else { capabilities &= ~Capabilities.FeaturePoints; } } } /// /// Whether the subsystem supports per feature point confidence values. /// public bool supportsConfidence { get { return (capabilities & Capabilities.Confidence) != 0; } set { if (value) { capabilities |= Capabilities.Confidence; } else { capabilities &= ~Capabilities.Confidence; } } } /// /// Whether the subsystem supports per-feature point identifiers. /// public bool supportsUniqueIds { get { return (capabilities & Capabilities.UniqueIds) != 0; } set { if (value) { capabilities |= Capabilities.UniqueIds; } else { capabilities &= ~Capabilities.UniqueIds; } } } /// /// The capabilities of the subsystem implementation. /// Capabilities capabilities { get; set; } //IEquatable boilerplate public bool Equals(Cinfo other) { return capabilities == other.capabilities && id.Equals(other.id) && implementationType == other.implementationType; } public override bool Equals(object obj) { if (!(obj is Cinfo)) { return false; } return Equals((Cinfo)obj); } public override int GetHashCode() { unchecked { var hashCode = id.GetHashCode(); hashCode = (hashCode * 486187739) + implementationType.GetHashCode(); hashCode = (hashCode * 486187739) + ((int)capabilities).GetHashCode(); return hashCode; } } public static bool operator ==(Cinfo lhs, Cinfo rhs) { return lhs.Equals(rhs); } public static bool operator !=(Cinfo lhs, Cinfo rhs) { return !lhs.Equals(rhs); } } XRDepthSubsystemDescriptor(Cinfo descriptorParams) { id = descriptorParams.id; subsystemImplementationType = descriptorParams.implementationType; supportsFeaturePoints = descriptorParams.supportsFeaturePoints; supportsUniqueIds = descriptorParams.supportsUniqueIds; supportsConfidence = descriptorParams.supportsConfidence; } /// /// Whether the implementation supports feature points. /// public bool supportsFeaturePoints { get; private set; } /// /// Whether the implementation supports per feature point identifiers. /// public bool supportsUniqueIds { get; private set; } /// /// Whether the implementation supports per feature point confidence values. /// public bool supportsConfidence { get; private set; } /// /// Registers a subsystem implementation with the SubsystemManager. /// /// public static void RegisterDescriptor(Cinfo descriptorParams) { var descriptor = new XRDepthSubsystemDescriptor(descriptorParams); SubsystemRegistration.CreateDescriptor(descriptor); } } }