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;
}
}
}
}