using System; using Unity.Collections; using UnityEngine.Scripting; using UnityEngine.XR.ARSubsystems; namespace UnityEngine.XR.ARKit { /// /// An internal class with only static methods to register the environment probe subsystem before the scene is /// loaded. /// internal static class ARKitEnvironmentProbeRegistration { /// /// Create and register the environment probe subsystem descriptor to advertise a providing implementation for /// environment probe functionality. /// [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)] static void Register() { #if UNITY_IOS && !UNITY_EDITOR var iOSVersion = OSVersion.Parse(UnityEngine.iOS.Device.systemVersion); if (iOSVersion < new OSVersion(12)) return; const string subsystemId = "ARKit-EnvironmentProbe"; XREnvironmentProbeSubsystemCinfo environmentProbeSubsystemInfo = new XREnvironmentProbeSubsystemCinfo() { id = subsystemId, implementationType = typeof(ARKitEnvironmentProbeSubsystem), supportsManualPlacement = true, supportsRemovalOfManual = true, supportsAutomaticPlacement = true, supportsRemovalOfAutomatic = true, supportsEnvironmentTexture = true, supportsEnvironmentTextureHDR = iOSVersion >= new OSVersion(13), }; if (!XREnvironmentProbeSubsystem.Register(environmentProbeSubsystemInfo)) { Debug.LogErrorFormat("Cannot register the {0} subsystem", subsystemId); } #endif } } /// /// This subsystem provides implementing functionality for the XREnvironmentProbeSubsystem class. /// [Preserve] class ARKitEnvironmentProbeSubsystem : XREnvironmentProbeSubsystem { protected override Provider CreateProvider() => new ARKitProvider(); class ARKitProvider : Provider { public ARKitProvider() => EnvironmentProbeApi.UnityARKit_EnvironmentProbeProvider_Construct(); public override void Start() => EnvironmentProbeApi.UnityARKit_EnvironmentProbeProvider_Start(); /// /// Stops the environment probe subsystem by disabling the environment probe state. /// public override void Stop() => EnvironmentProbeApi.UnityARKit_EnvironmentProbeProvider_Stop(); /// /// Destroy the environment probe subsystem by first ensuring that the subsystem has been stopped and then /// destroying the provider. /// public override void Destroy() => EnvironmentProbeApi.UnityARKit_EnvironmentProbeProvider_Destruct(); /// /// Enable or disable automatic placement of environment probes by the provider. /// /// true if the provider should automatically place environment probes in the scene. /// Otherwise, false. public override void SetAutomaticPlacement(bool value) { EnvironmentProbeApi.UnityARKit_EnvironmentProbeProvider_SetAutomaticPlacementEnabled(value); } /// /// Set the state of HDR environment texture generation. /// /// Whether HDR environment texture generation is enabled (true) or disabled /// (false). /// /// Whether the HDR environment texture generation state was set. /// public override bool TrySetEnvironmentTextureHDREnabled(bool value) { return EnvironmentProbeApi.UnityARKit_EnvironmentProbeProvider_TrySetEnvironmentTextureHDREnabled(value); } public override bool TryAddEnvironmentProbe(Pose pose, Vector3 scale, Vector3 size, out XREnvironmentProbe environmentProbe) { return EnvironmentProbeApi.UnityARKit_EnvironmentProbeProvider_TryAddEnvironmentProbe(pose, scale, size, out environmentProbe); } /// /// Remove the environment probe matching the trackable ID from the AR session.. /// /// The trackable ID for the environment probe to be removed. /// /// true if an environment probe matching the trackable ID is found and will be removed from the AR /// session. Otherwise, false. /// public override bool RemoveEnvironmentProbe(TrackableId trackableId) { return EnvironmentProbeApi.UnityARKit_EnvironmentProbeProvider_TryRemoveEnvironmentProbe(trackableId); } public override TrackableChanges GetChanges(XREnvironmentProbe defaultEnvironmentProbe, Allocator allocator) { int numAddedEnvironmentProbes; IntPtr addedEnvironmentProbesPointer; int numUpdatedEnvironmentProbes; IntPtr updatedEnvironmentProbesPointer; int numRemovedEnvironmentProbeIds; IntPtr removedEnvironmentProbeIdsPointer; int stride; var context = EnvironmentProbeApi.UnityARKit_EnvironmentProbeProvider_AcquireChanges(out numAddedEnvironmentProbes, out addedEnvironmentProbesPointer, out numUpdatedEnvironmentProbes, out updatedEnvironmentProbesPointer, out numRemovedEnvironmentProbeIds, out removedEnvironmentProbeIdsPointer, out stride); try { unsafe { // Wrap the navite pointers into a native array and then copy them into a separate native array enabled // with temporary allocations. return new TrackableChanges( (void*)addedEnvironmentProbesPointer, numAddedEnvironmentProbes, (void*)updatedEnvironmentProbesPointer, numUpdatedEnvironmentProbes, (void*)removedEnvironmentProbeIdsPointer, numRemovedEnvironmentProbeIds, defaultEnvironmentProbe, stride, allocator); } } finally { EnvironmentProbeApi.UnityARKit_EnvironmentProbeProvider_ReleaseChanges(context); } } } } }