using System; using System.Collections.Generic; using Unity.Collections; using UnityEngine.SubsystemsImplementation; namespace UnityEngine.XR.ARSubsystems { /// /// Defines an interface for interacting with occlusion functionality. /// public class XROcclusionSubsystem : SubsystemWithProvider { /// /// Specifies the human segmentation stencil mode. /// /// /// The human segmentation stencil mode. /// /// Thrown when setting the human segmentation stencil mode to /// `enabled` if the implementation does not support human segmentation. public HumanSegmentationStencilMode requestedHumanStencilMode { get => provider.requestedHumanStencilMode; set => provider.requestedHumanStencilMode = value; } /// /// Get the current segmentation stencil mode in use by the subsystem. /// public HumanSegmentationStencilMode currentHumanStencilMode => provider.currentHumanStencilMode; /// /// Specifies the human segmentation depth mode. /// /// /// The human segmentation depth mode. /// /// Thrown when setting the human segmentation depth mode to /// `enabled` if the implementation does not support human segmentation. public HumanSegmentationDepthMode requestedHumanDepthMode { get => provider.requestedHumanDepthMode; set => provider.requestedHumanDepthMode = value; } /// /// Get the human segmentation depth mode currently in use by the provider. /// public HumanSegmentationDepthMode currentHumanDepthMode => provider.currentHumanDepthMode; /// /// Specifies the environment depth mode. /// /// /// The environment depth mode. /// public EnvironmentDepthMode requestedEnvironmentDepthMode { get => provider.requestedEnvironmentDepthMode; set => provider.requestedEnvironmentDepthMode = value; } /// /// Get the environment depth mode currently in use by the provider. /// public EnvironmentDepthMode currentEnvironmentDepthMode => provider.currentEnvironmentDepthMode; /// /// Whether temporal smoothing should be applied to the environment depth image. Query for support with /// . /// /// When `true`, temporal smoothing is applied to the environment depth image. Otherwise, no temporal smoothing is applied. public bool environmentDepthTemporalSmoothingRequested { get => provider.environmentDepthTemporalSmoothingRequested; set => provider.environmentDepthTemporalSmoothingRequested = value; } /// /// Whether temporal smoothing is applied to the environment depth image. Query for support with /// . /// /// Read Only. public bool environmentDepthTemporalSmoothingEnabled => provider.environmentDepthTemporalSmoothingEnabled; /// /// Specifies the requested occlusion preference mode. /// /// /// The requested occlusion preference mode. /// public OcclusionPreferenceMode requestedOcclusionPreferenceMode { get => provider.requestedOcclusionPreferenceMode; set => provider.requestedOcclusionPreferenceMode = value; } /// /// Get the occlusion preference mode currently in use by the provider. /// public OcclusionPreferenceMode currentOcclusionPreferenceMode => provider.currentOcclusionPreferenceMode; /// /// Construct the subsystem by creating the functionality provider. /// public XROcclusionSubsystem() { } /// /// Gets the human stencil texture descriptor. /// /// The human stencil texture descriptor to be populated, if available /// from the provider. /// /// true if the human stencil texture descriptor is available and is returned. Otherwise, false. /// /// Thrown if the implementation does not support human stencil /// texture. public bool TryGetHumanStencil(out XRTextureDescriptor humanStencilDescriptor) => provider.TryGetHumanStencil(out humanStencilDescriptor); /// /// Tries to acquire the latest human stencil CPU image. /// /// If this method returns `true`, an acquired . The CPU image /// must be disposed by the caller. /// Returns `true` if an was successfully acquired. /// Returns `false` otherwise. public bool TryAcquireHumanStencilCpuImage(out XRCpuImage cpuImage) { if (provider.humanStencilCpuImageApi != null && provider.TryAcquireHumanStencilCpuImage(out var cinfo)) { cpuImage = new XRCpuImage(provider.humanStencilCpuImageApi, cinfo); return true; } else { cpuImage = default; return false; } } /// /// Gets the human depth texture descriptor. /// /// The human depth texture descriptor to be populated, if available from /// the provider. /// /// true if the human depth texture descriptor is available and is returned. Otherwise, false. /// /// Thrown if the implementation does not support human depth /// texture. public bool TryGetHumanDepth(out XRTextureDescriptor humanDepthDescriptor) => provider.TryGetHumanDepth(out humanDepthDescriptor); /// /// Tries to acquire the latest human depth CPU image. /// /// If this method returns `true`, an acquired . The CPU image /// must be disposed by the caller. /// Returns `true` if an was successfully acquired. /// Returns `false` otherwise. public bool TryAcquireHumanDepthCpuImage(out XRCpuImage cpuImage) { if (provider.humanDepthCpuImageApi != null && provider.TryAcquireHumanDepthCpuImage(out var cinfo)) { cpuImage = new XRCpuImage(provider.humanDepthCpuImageApi, cinfo); return true; } else { cpuImage = default; return false; } } /// /// Gets the environment depth texture descriptor. /// /// /// Whether the depth image is smoothed or raw depends on the value of /// . /// /// The environment depth texture descriptor to be populated, if /// available from the provider. /// /// true if the environment depth texture descriptor is available and is returned. Otherwise, /// false. /// /// Thrown if the implementation does not support environment depth /// texture. public bool TryGetEnvironmentDepth(out XRTextureDescriptor environmentDepthDescriptor) => provider.TryGetEnvironmentDepth(out environmentDepthDescriptor); /// /// Tries to acquire the latest environment depth CPU image. /// /// /// Whether the depth image is smoothed or raw depends on the value of /// . /// /// If this method returns `true`, an acquired . The CPU image /// must be disposed by the caller. /// Returns `true` if an was successfully acquired. /// Returns `false` otherwise. /// /// public bool TryAcquireEnvironmentDepthCpuImage(out XRCpuImage cpuImage) { if (provider.environmentDepthCpuImageApi != null && provider.TryAcquireEnvironmentDepthCpuImage(out var cinfo)) { cpuImage = new XRCpuImage(provider.environmentDepthCpuImageApi, cinfo); return true; } else { cpuImage = default; return false; } } /// /// Tries to acquire the latest raw environment depth CPU image. /// /// /// This method differs from in that it always tries to /// acquire the raw depth image, whereas the image provided by /// depends on the value of . /// /// If this method returns `true`, an acquired . The CPU image /// must be disposed by the caller. /// Returns `true` if the raw environment depth CPU image was acquired. Returns `false` otherwise. public bool TryAcquireRawEnvironmentDepthCpuImage(out XRCpuImage cpuImage) { if (provider.TryAcquireRawEnvironmentDepthCpuImage(out var cinfo)) { cpuImage = new XRCpuImage(provider.environmentDepthCpuImageApi, cinfo); return true; } cpuImage = default; return false; } /// /// Tries to acquire the latest smoothed environment depth CPU image. /// /// /// This method differs from in that it always tries to /// acquire the temporally smoothed depth image, whereas the image provided by /// depends on the value of /// . /// /// The type of smoothing applied is implementation dependent; refer to the documentation for the specific /// provider in use. /// /// If this method returns `true`, an acquired . The CPU image /// must be disposed by the caller. /// Returns `true` if the smoothed environment depth CPU image was acquired. Returns `false` otherwise. public bool TryAcquireSmoothedEnvironmentDepthCpuImage(out XRCpuImage cpuImage) { if (provider.TryAcquireSmoothedEnvironmentDepthCpuImage(out var cinfo)) { cpuImage = new XRCpuImage(provider.environmentDepthCpuImageApi, cinfo); return true; } cpuImage = default; return false; } /// /// Gets the environment depth confidence texture descriptor. /// /// The environment depth confidence texture descriptor to /// be populated, if available from the provider. /// /// true if the environment depth confidence texture descriptor is available and is returned. Otherwise, /// false. /// /// Thrown if the implementation does not support environment depth /// confidence texture. public bool TryGetEnvironmentDepthConfidence(out XRTextureDescriptor environmentDepthConfidenceDescriptor) => provider.TryGetEnvironmentDepthConfidence(out environmentDepthConfidenceDescriptor); /// /// Tries to acquire the latest environment depth confidence CPU image. /// /// If this method returns `true`, an acquired . The CPU image /// must be disposed by the caller. /// Returns `true` if an was successfully acquired. /// Returns `false` otherwise. public bool TryAcquireEnvironmentDepthConfidenceCpuImage(out XRCpuImage cpuImage) { if (provider.environmentDepthConfidenceCpuImageApi != null && provider.TryAcquireEnvironmentDepthConfidenceCpuImage(out var cinfo)) { cpuImage = new XRCpuImage(provider.environmentDepthConfidenceCpuImageApi, cinfo); return true; } else { cpuImage = default; return false; } } /// /// Gets the occlusion texture descriptors associated with the current AR frame. /// /// The allocator to use when creating the returned NativeArray. /// An array of texture descriptors. /// /// The caller owns the returned NativeArray and is responsible for calling Dispose on it. /// public NativeArray GetTextureDescriptors(Allocator allocator) => provider.GetTextureDescriptors(default(XRTextureDescriptor), allocator); /// /// Get the enabled and disabled shader keywords for the material. /// /// The keywords to enable for the material. /// The keywords to disable for the material. public void GetMaterialKeywords(out List enabledKeywords, out List disabledKeywords) => provider.GetMaterialKeywords(out enabledKeywords, out disabledKeywords); /// /// Register the descriptor for the occlusion subsystem implementation. /// /// The occlusion subsystem implementation construction information. /// /// /// true if the descriptor was registered. Otherwise, false. /// public static bool Register(XROcclusionSubsystemCinfo occlusionSubsystemCinfo) { XROcclusionSubsystemDescriptor occlusionSubsystemDescriptor = XROcclusionSubsystemDescriptor.Create(occlusionSubsystemCinfo); SubsystemDescriptorStore.RegisterDescriptor(occlusionSubsystemDescriptor); return true; } /// /// The provider which will service the . /// public abstract class Provider : SubsystemProvider { /// /// Property to be implemented by the provider to get or set the requested human segmentation stencil mode. /// /// /// The requested human segmentation stencil mode. /// /// Thrown when setting the human segmentation stencil mode /// to `enabled` if the implementation does not support human segmentation. public virtual HumanSegmentationStencilMode requestedHumanStencilMode { get => HumanSegmentationStencilMode.Disabled; set { if (value.Enabled()) { throw new NotSupportedException("Setting human segmentation stencil to enabled is not " + "supported by this implementation"); } } } /// /// Property to be implemented by the provider to get the segmentation stencil mode currently in use. /// public virtual HumanSegmentationStencilMode currentHumanStencilMode => HumanSegmentationStencilMode.Disabled; /// /// Property to be implemented by the provider to get or set the requested human segmentation depth mode. /// /// /// The requested human segmentation depth mode. /// /// Thrown when setting the human segmentation depth mode /// to `enabled` if the implementation does not support human segmentation. public virtual HumanSegmentationDepthMode requestedHumanDepthMode { get => HumanSegmentationDepthMode.Disabled; set { if (value.Enabled()) { throw new NotSupportedException("Setting human segmentation depth to enabled is not supported " + "by this implementation"); } } } /// /// Property to be implemented by the provider to get the human segmentation depth mode currently in use. /// public virtual HumanSegmentationDepthMode currentHumanDepthMode => HumanSegmentationDepthMode.Disabled; /// /// Property to be implemented by the provider to get or set the environment depth mode. /// /// /// The requested environment depth mode. /// public virtual EnvironmentDepthMode requestedEnvironmentDepthMode { get => EnvironmentDepthMode.Disabled; set {} } /// /// Property to be implemented by the provider to get the environment depth mode currently in use. /// public virtual EnvironmentDepthMode currentEnvironmentDepthMode => EnvironmentDepthMode.Disabled; /// /// Property to be implemented by the provider to get whether temporal smoothing has been requested for the /// environment depth image. /// public virtual bool environmentDepthTemporalSmoothingRequested { get => false; set { } } /// /// Property to be implemented by the provider to get whether temporal smoothing is currently applied to the /// environment depth image. /// public virtual bool environmentDepthTemporalSmoothingEnabled => false; /// /// Specifies the requested occlusion preference mode. /// /// /// The requested occlusion preference mode. /// public virtual OcclusionPreferenceMode requestedOcclusionPreferenceMode { get => default(OcclusionPreferenceMode); set {} } /// /// Get the occlusion preference mode currently in use by the provider. /// public virtual OcclusionPreferenceMode currentOcclusionPreferenceMode => default(OcclusionPreferenceMode); /// /// Method to be implemented by the provider to get the human stencil texture descriptor. /// /// The human stencil texture descriptor to be populated, if /// available. /// /// true if the human stencil texture descriptor is available and is returned. Otherwise, /// false. /// /// Thrown if the implementation does not support human /// stencil texture. public virtual bool TryGetHumanStencil(out XRTextureDescriptor humanStencilDescriptor) => throw new NotSupportedException("Human stencil texture is not supported by this implementation"); /// /// Tries to acquire the latest human stencil CPU image. /// /// If this method returns `true`, this should be populated with construction /// information for an . /// Returns `true` if the human stencil CPU image was acquired. Returns `false` otherwise. /// Thrown if the implementation does not support human /// stencil CPU images. public virtual bool TryAcquireHumanStencilCpuImage(out XRCpuImage.Cinfo cinfo) => throw new NotSupportedException("Human stencil CPU images are not supported by this implementation."); /// /// The for interacting with an acquired with /// . /// public virtual XRCpuImage.Api humanStencilCpuImageApi => null; /// /// Method to be implemented by the provider to get the human depth texture descriptor. /// /// The human depth texture descriptor to be populated, if available. /// /// /// true if the human depth texture descriptor is available and is returned. Otherwise, /// false. /// /// Thrown if the implementation does not support human /// depth texture. public virtual bool TryGetHumanDepth(out XRTextureDescriptor humanDepthDescriptor) => throw new NotSupportedException("Human depth texture is not supported by this implementation"); /// /// Tries to acquire the latest human depth CPU image. /// /// If this method returns `true`, this should be populated with construction /// information for an . /// Returns `true` if the human depth CPU image was acquired. Returns `false` otherwise. /// Thrown if the implementation does not support human /// depth CPU images. public virtual bool TryAcquireHumanDepthCpuImage(out XRCpuImage.Cinfo cinfo) => throw new NotSupportedException("Human depth CPU images are not supported by this implementation."); /// /// The for interacting with an acquired with /// . /// public virtual XRCpuImage.Api humanDepthCpuImageApi => null; /// /// Method to be implemented by the provider to get the environment depth texture descriptor. /// /// The environment depth texture descriptor to be populated, if /// available. /// /// true if the environment depth texture descriptor is available and is returned. Otherwise, /// false. /// /// Thrown if the implementation does not support environment /// depth texture. public virtual bool TryGetEnvironmentDepth(out XRTextureDescriptor environmentDepthDescriptor) => throw new NotSupportedException("Environment depth texture is not supported by this implementation"); /// /// Tries to acquire the latest environment depth CPU image. /// /// If this method returns `true`, this should be populated with construction /// information for an . /// Returns `true` if the environment depth CPU image was acquired. /// Returns `false` otherwise. /// Thrown if the implementation does not support environment /// CPU images. public virtual bool TryAcquireEnvironmentDepthCpuImage(out XRCpuImage.Cinfo cinfo) => throw new NotSupportedException("Environment depth CPU images are not supported by this implementation."); /// /// Tries to acquire the latest environment depth CPU image. /// /// /// This method differs from in that it always tries to /// acquire the raw depth image, whereas the image provided by /// depends on the value of . /// /// If this method returns `true`, this should be populated with construction /// information for an . /// Returns `true` if the raw environment depth CPU image was acquired. /// Returns `false` otherwise. public virtual bool TryAcquireRawEnvironmentDepthCpuImage(out XRCpuImage.Cinfo cinfo) { cinfo = default; return false; } /// /// Tries to acquire the latest smoothed environment depth CPU image. /// /// /// This method differs from in that it always tries to /// acquire the smoothed depth image, whereas the image provided by /// depends on the value of /// . /// /// If this method returns `true`, this should be populated with construction /// information for an . /// Returns `true` if the smoothed environment depth CPU image was acquired. /// Returns `false` otherwise. public virtual bool TryAcquireSmoothedEnvironmentDepthCpuImage(out XRCpuImage.Cinfo cinfo) { cinfo = default; return false; } /// /// The for interacting with an acquired with /// . /// public virtual XRCpuImage.Api environmentDepthCpuImageApi => null; /// /// Method to be implemented by the provider to get the environment depth confidence texture descriptor. /// /// The environment depth texture descriptor to be /// populated, if available. /// /// true if the environment depth confidence texture descriptor is available and is returned. /// Otherwise, false. /// /// Thrown if the implementation does not support environment /// depth confidence texture. public virtual bool TryGetEnvironmentDepthConfidence(out XRTextureDescriptor environmentDepthConfidenceDescriptor) => throw new NotSupportedException("Environment depth confidence texture is not supported by this implementation"); /// /// Tries to acquire the latest environment depth confidence CPU image. /// /// If this method returns `true`, this should be populated with construction /// information for an . /// Returns `true` if the environment depth confidence CPU image was acquired. /// Returns `false` otherwise. /// Thrown if the implementation does not support environment /// depth confidence CPU images. public virtual bool TryAcquireEnvironmentDepthConfidenceCpuImage(out XRCpuImage.Cinfo cinfo) => throw new NotSupportedException("Environment depth CPU images are not supported by this implementation."); /// /// The for interacting with an acquired with /// . /// public virtual XRCpuImage.Api environmentDepthConfidenceCpuImageApi => null; /// /// Method to be implemented by the provider to get the occlusion texture descriptors associated with the /// current AR frame. /// /// The default descriptor value. /// The allocator to use when creating the returned NativeArray. /// An array of the occlusion texture descriptors. public virtual NativeArray GetTextureDescriptors(XRTextureDescriptor defaultDescriptor, Allocator allocator) => new NativeArray(0, allocator); /// /// Method to be implemented by the provider to get the enabled and disabled shader keywords for the /// material. /// /// The keywords to enable for the material. /// The keywords to disable for the material. public virtual void GetMaterialKeywords(out List enabledKeywords, out List disabledKeywords) { enabledKeywords = null; disabledKeywords = null; } } } }