This repository has been archived on 2025-04-28. You can view files and clone it, but cannot push or open issues or pull requests.
ARPlusSystem/ARPlusSystem-250418/Library/PackageCache/com.unity.xr.arcore@4.2.10/Runtime/ArConfig.cs

205 lines
9.7 KiB
C#

using System;
#if UNITY_ANDROID
using System.Runtime.InteropServices;
#endif
namespace UnityEngine.XR.ARCore
{
/// <summary>
/// Represents the configuration for an <see cref="ArSession"/>.
/// </summary>
/// <remarks>
/// This is an opaque object that represents a native
/// [ArConfig](https://developers.google.com/ar/reference/c/group/ar-config).
/// </remarks>
/// <seealso cref="ARCoreSessionSubsystem.beforeSetConfiguration"/>
/// <seealso cref="ARCoreBeforeSetConfigurationEventArgs"/>
public struct ArConfig : IEquatable<ArConfig>, IDisposable
{
IntPtr m_Self;
ArConfig(IntPtr value) => m_Self = value;
/// <summary>
/// Creates a new session configuration and initializes it to a sensible default configuration.
/// </summary>
/// <remarks>
/// Plane detection and Lighting Estimation are enabled, and blocking update is selected. This configuration is
/// guaranteed to be supported on all devices that support ARCore.
///
/// When you no longer need the <see cref="ArConfig"/>, you should destroy it by calling
/// <see cref="Dispose"/>. If you do not dispose it, ARCore will leak memory.
/// </remarks>
/// <param name="session">A non-null <see cref="ArSession"/>.</param>
public ArConfig(ArSession session) => Create(session, out this);
/// <summary>
/// Creates an <see cref="ArConfig"/> from an existing native pointer. The native pointer must point
/// to an existing <see cref="ArConfig"/>.
/// </summary>
/// <param name="value">A pointer to an existing native <see cref="ArConfig"/>.</param>
/// <returns>Returns an <see cref="ArConfig"/> whose underlying native pointer is
/// <paramref name="value"/>.</returns>
public static ArConfig FromIntPtr(IntPtr value) => new ArConfig(value);
/// <summary>
/// Represents a null <see cref="ArConfig"/>, i.e., one whose underlying native pointer is `null`.
/// This property is deprecated. Use <see langword="default"/> instead.
/// </summary>
[Obsolete("Use default instead.")]
public static ArConfig Null => default;
/// <summary>
/// (Read Only) Indicates whether this <see cref="ArConfig"/> is `null`.
/// This property is deprecated. Use the equality operator (`==`) to compare with `null` instead.
/// </summary>
[Obsolete("Compare to null instead.")]
public bool IsNull => m_Self == IntPtr.Zero;
/// <summary>
/// Gets the underlying native pointer for this <see cref="ArConfig"/>.
/// </summary>
/// <returns>Returns the underlying native pointer for this <see cref="ArConfig"/>.</returns>
public IntPtr AsIntPtr() => m_Self;
/// <summary>
/// Casts an <see cref="ArConfig"/> to its underlying native pointer.
/// </summary>
/// <param name="config">The <see cref="ArConfig"/> to cast.</param>
/// <returns>Returns the underlying native pointer for <paramref name="config"/></returns>
public static explicit operator IntPtr(ArConfig config) => config.AsIntPtr();
/// <summary>
/// Tests for equality.
/// </summary>
/// <remarks>
/// Two <see cref="ArConfig"/>s are considered equal if their underlying pointers are equal.
/// </remarks>
/// <param name="other">The <see cref="ArConfig"/> to compare against.</param>
/// <returns>Returns `true` if the underlying native pointers are the same. Returns `false` otherwise.</returns>
public bool Equals(ArConfig other) => m_Self == other.m_Self;
/// <summary>
/// Tests for equality.
/// </summary>
/// <param name="obj">An <see cref="object"/> to compare against.</param>
/// <returns>Returns `true` if <paramref name="obj"/> is an <see cref="ArConfig"/> and it compares
/// equal to this one using <see cref="Equals(UnityEngine.XR.ARCore.ArConfig)"/>.</returns>
public override bool Equals(object obj) => obj is ArConfig other && Equals(other);
/// <summary>
/// Generates a hash code suitable for use with a `HashSet` or `Dictionary`
/// </summary>
/// <returns>Returns a hash code for this <see cref="ArConfig"/>.</returns>
public override int GetHashCode() => m_Self.GetHashCode();
/// <summary>
/// Tests for equality. Same as <see cref="Equals(UnityEngine.XR.ARCore.ArConfig)"/>.
/// </summary>
/// <param name="lhs">The <see cref="ArConfig"/> to compare with <paramref name="rhs"/>.</param>
/// <param name="rhs">The <see cref="ArConfig"/> to compare with <paramref name="lhs"/>.</param>
/// <returns>Returns `true` if <paramref name="lhs"/> is equal to <paramref name="rhs"/> using
/// <see cref="Equals(UnityEngine.XR.ARCore.ArConfig)"/>. Returns `false` otherwise.</returns>
public static bool operator ==(ArConfig lhs, ArConfig rhs) => lhs.Equals(rhs);
/// <summary>
/// Tests for inequality. Same as the negation of <see cref="Equals(UnityEngine.XR.ARCore.ArConfig)"/>.
/// </summary>
/// <param name="lhs">The <see cref="ArConfig"/> to compare with <paramref name="rhs"/>.</param>
/// <param name="rhs">The <see cref="ArConfig"/> to compare with <paramref name="lhs"/>.</param>
/// <returns>Returns `false` if <paramref name="lhs"/> is equal to <paramref name="rhs"/> using
/// <see cref="Equals(UnityEngine.XR.ARCore.ArConfig)"/>. Returns `true` otherwise.</returns>
public static bool operator !=(ArConfig lhs, ArConfig rhs) => !lhs.Equals(rhs);
/// <summary>
/// Destroys this <see cref="ArConfig"/> and sets the underlying native pointer to `null`.
/// </summary>
/// <remarks>
/// You should only dispose an <see cref="ArConfig"/> if you explicitly created it, e.g., by calling
/// <see cref="ArConfig(ArSession)"/>. If you convert an existing config from an
/// <see cref="IntPtr"/> (e.g., by calling <see cref="FromIntPtr"/>), then you should not dispose it.
/// </remarks>
public void Dispose()
{
if (m_Self != IntPtr.Zero)
{
Destroy(this);
}
m_Self = IntPtr.Zero;;
}
/// <summary>
/// Tests for equality.
/// </summary>
/// <remarks>
/// This equality operator lets you to compare an <see cref="ArConfig"/> with `null` to determine whether its
/// underlying pointer is null. This allows for a more natural comparison with the native ARCore object:
/// <example>
/// <code>
/// bool TestForNull(ArConfig obj)
/// {
/// if (obj == null)
/// {
/// // obj.AsIntPtr() is IntPtr.Zero
/// }
/// }
/// </code>
/// </example>
/// </remarks>
/// <param name="lhs">The nullable <see cref="ArConfig"/> to compare with <paramref name="rhs"/>.</param>
/// <param name="rhs">The nullable <see cref="ArConfig"/> to compare with <paramref name="lhs"/>.</param>
/// <returns>Returns true if any of these conditions are met:
/// - <paramref name="lhs"/> and <paramref name="rhs"/> are both not null and their underlying pointers are equal.
/// - <paramref name="lhs"/> is null and <paramref name="rhs"/>'s underlying pointer is null.
/// - <paramref name="rhs"/> is null and <paramref name="lhs"/>'s underlying pointer is null.
/// - Both <paramref name="lhs"/> and <paramref name="rhs"/> are null.
///
/// Returns false otherwise.
/// </returns>
public static bool operator ==(ArConfig? lhs, ArConfig? rhs) => NativeObject.ArePointersEqual(lhs?.m_Self, rhs?.m_Self);
/// <summary>
/// Tests for inequality.
/// </summary>
/// <remarks>
/// This inequality operator lets you to compare an <see cref="ArConfig"/> with `null` to determine whether its
/// underlying pointer is null. This allows for a more natural comparison with the native ARCore object:
/// <example>
/// <code>
/// bool TestForNull(ArConfig obj)
/// {
/// if (obj != null)
/// {
/// // obj.AsIntPtr() is not IntPtr.Zero
/// }
/// }
/// </code>
/// </example>
/// </remarks>
/// <param name="lhs">The native object to compare with <paramref name="rhs"/>.</param>
/// <param name="rhs">The native object to compare with <paramref name="lhs"/>.</param>
/// <returns>Returns false if any of these conditions are met:
/// - <paramref name="lhs"/> and <paramref name="rhs"/> are both not null and their underlying pointers are equal.
/// - <paramref name="lhs"/> is null and <paramref name="rhs"/>'s underlying pointer is null.
/// - <paramref name="rhs"/> is null and <paramref name="lhs"/>'s underlying pointer is null.
/// - Both <paramref name="lhs"/> and <paramref name="rhs"/> are null.
///
/// Returns true otherwise.
/// </returns>
public static bool operator !=(ArConfig? lhs, ArConfig? rhs) => !(lhs == rhs);
#if UNITY_EDITOR
static void Create(ArSession session, out ArConfig configOut) => configOut = default;
static void Destroy(ArConfig config) { }
#elif UNITY_ANDROID
[DllImport("arcore_sdk_c", EntryPoint = "ArConfig_create")]
static extern void Create(ArSession session, out ArConfig configOut);
[DllImport("arcore_sdk_c", EntryPoint = "ArConfig_destroy")]
static extern void Destroy(ArConfig config);
#endif
}
}