You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
153 lines
7.1 KiB
153 lines
7.1 KiB
using System;
|
|
using Unity.Collections;
|
|
using UnityEngine.Scripting;
|
|
using UnityEngine.XR.ARSubsystems;
|
|
|
|
namespace UnityEngine.XR.ARKit
|
|
{
|
|
/// <summary>
|
|
/// An internal class with only static methods to register the environment probe subsystem before the scene is
|
|
/// loaded.
|
|
/// </summary>
|
|
internal static class ARKitEnvironmentProbeRegistration
|
|
{
|
|
/// <summary>
|
|
/// Create and register the environment probe subsystem descriptor to advertise a providing implementation for
|
|
/// environment probe functionality.
|
|
/// </summary>
|
|
[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
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// This subsystem provides implementing functionality for the <c>XREnvironmentProbeSubsystem</c> class.
|
|
/// </summary>
|
|
[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();
|
|
|
|
/// <summary>
|
|
/// Stops the environment probe subsystem by disabling the environment probe state.
|
|
/// </summary>
|
|
public override void Stop() => EnvironmentProbeApi.UnityARKit_EnvironmentProbeProvider_Stop();
|
|
|
|
/// <summary>
|
|
/// Destroy the environment probe subsystem by first ensuring that the subsystem has been stopped and then
|
|
/// destroying the provider.
|
|
/// </summary>
|
|
public override void Destroy() => EnvironmentProbeApi.UnityARKit_EnvironmentProbeProvider_Destruct();
|
|
|
|
/// <summary>
|
|
/// Enable or disable automatic placement of environment probes by the provider.
|
|
/// </summary>
|
|
/// <param name='value'><c>true</c> if the provider should automatically place environment probes in the scene.
|
|
/// Otherwise, <c>false</c></param>.
|
|
public override void SetAutomaticPlacement(bool value)
|
|
{
|
|
EnvironmentProbeApi.UnityARKit_EnvironmentProbeProvider_SetAutomaticPlacementEnabled(value);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Set the state of HDR environment texture generation.
|
|
/// </summary>
|
|
/// <param name="value">Whether HDR environment texture generation is enabled (<c>true</c>) or disabled
|
|
/// (<c>false</c>).</param>
|
|
/// <returns>
|
|
/// Whether the HDR environment texture generation state was set.
|
|
/// </returns>
|
|
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);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Remove the environment probe matching the trackable ID from the AR session..
|
|
/// </summary>
|
|
/// <param name='trackableId'>The trackable ID for the environment probe to be removed.</param>
|
|
/// <returns>
|
|
/// <c>true</c> if an environment probe matching the trackable ID is found and will be removed from the AR
|
|
/// session. Otherwise, <c>false</c>.
|
|
/// </returns>
|
|
public override bool RemoveEnvironmentProbe(TrackableId trackableId)
|
|
{
|
|
return EnvironmentProbeApi.UnityARKit_EnvironmentProbeProvider_TryRemoveEnvironmentProbe(trackableId);
|
|
}
|
|
|
|
public override TrackableChanges<XREnvironmentProbe> 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<XREnvironmentProbe>(
|
|
(void*)addedEnvironmentProbesPointer, numAddedEnvironmentProbes,
|
|
(void*)updatedEnvironmentProbesPointer, numUpdatedEnvironmentProbes,
|
|
(void*)removedEnvironmentProbeIdsPointer, numRemovedEnvironmentProbeIds,
|
|
defaultEnvironmentProbe, stride,
|
|
allocator);
|
|
}
|
|
}
|
|
finally
|
|
{
|
|
EnvironmentProbeApi.UnityARKit_EnvironmentProbeProvider_ReleaseChanges(context);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|