ARCoreEnvironmentProbeSubsystem.cs
7.01 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
using System.Runtime.InteropServices;
using System;
using Unity.Collections;
using Unity.Collections.LowLevel.Unsafe;
using UnityEngine.Scripting;
using UnityEngine.XR.ARSubsystems;
namespace UnityEngine.XR.ARCore
{
/// <summary>
/// The ARCore implementation of the
/// [XREnvironmentProbeSubsystem](xref:UnityEngine.XR.ARSubsystems.XREnvironmentProbeSubsystem).
/// Do not create this directly. Use the
/// [SubsystemManager](xref:UnityEngine.SubsystemManager)
/// instead.
/// </summary>
[Preserve]
class ARCoreEnvironmentProbeSubsystem : XREnvironmentProbeSubsystem
{
/// <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 (!Api.platformAndroid || !Api.loaderPresent)
return;
const string subsystemId = "ARCore-EnvironmentProbe";
XREnvironmentProbeSubsystemCinfo environmentProbeSubsystemInfo = new XREnvironmentProbeSubsystemCinfo()
{
id = subsystemId,
#if UNITY_2020_2_OR_NEWER
providerType = typeof(ARCoreEnvironmentProbeSubsystem.ARCoreProvider),
subsystemTypeOverride = typeof(ARCoreEnvironmentProbeSubsystem),
#else
implementationType = typeof(ARCoreEnvironmentProbeSubsystem),
#endif
supportsManualPlacement = false,
supportsRemovalOfManual = false,
supportsAutomaticPlacement = true,
supportsRemovalOfAutomatic = false,
supportsEnvironmentTexture = false,
supportsEnvironmentTextureHDR = true,
};
XREnvironmentProbeSubsystem.Register(environmentProbeSubsystemInfo);
}
#if !UNITY_2020_2_OR_NEWER
protected override Provider CreateProvider() => new ARCoreProvider();
#endif
class ARCoreProvider : Provider
{
public ARCoreProvider() => NativeApi.UnityARCore_EnvironmentProbeProvider_Construct(QualitySettings.activeColorSpace);
/// <summary>
/// Starts the environment probe subsystem by enabling the HDR Environmental Light Estimation.
/// </summary>
public override void Start() => NativeApi.UnityARCore_EnvironmentProbeProvider_Start();
/// <summary>
/// Stops the environment probe subsystem by disabling the environment probe state.
/// </summary>
public override void Stop() => NativeApi.UnityARCore_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() => NativeApi.UnityARCore_EnvironmentProbeProvider_Destroy();
/// <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>.
/// <remarks>ARCore does not allow Environment Probes to be placed manually. Regardless of value this will always be automatic.</remarks>
public override bool automaticPlacementRequested
{
get => true;
set
{
if (!value)
throw new NotSupportedException("ARCore only supports the automatic placement of environment probes.");
}
}
/// <summary>
/// Get whether automatic placement is enabled. This property is always true.
/// </summary>
public override bool automaticPlacementEnabled => true;
/// <summary>
/// Get or set whether HDR environment texture generation is requested.
/// </summary>
/// Whether the HDR environment texture generation state is requested.
/// </returns>
/// <remarks>ARCore will only ever return environmental textures that are HDR. This can only be set to <c>true</c>.</remarks>
public override bool environmentTextureHDRRequested
{
get => true;
set
{
if (!value)
{
throw new NotSupportedException("ARCore only supports HDR for environment textures.");
}
}
}
/// <summary>
/// Get whether HDR environment textures are enabled. This always returns true.
/// </summary>
public override bool environmentTextureHDREnabled => true;
public override TrackableChanges<XREnvironmentProbe> GetChanges(XREnvironmentProbe defaultEnvironmentProbe,
Allocator allocator)
{
XREnvironmentProbe probe = XREnvironmentProbe.defaultValue;
NativeApi.UnityARCore_EnvironmentProbeProvider_GetChanges(out int numAdded, out int numUpdated, out int numRemoved, ref probe);
// There is only ever one probe currently so allocating using it as the default template is safe.
var changes = new TrackableChanges<XREnvironmentProbe>(numAdded, numUpdated, numRemoved, allocator, probe);
if (numRemoved > 0)
{
var nativeRemovedArray = changes.removed;
nativeRemovedArray[0] = probe.trackableId;
}
return changes;
}
}
}
/// <summary>
/// Container to wrap the native ARCore Environment Probe APIs.
/// </summary>
static class NativeApi
{
[DllImport("UnityARCore")]
internal static extern void UnityARCore_EnvironmentProbeProvider_Construct(ColorSpace activeColorSpace);
[DllImport("UnityARCore")]
internal static extern void UnityARCore_EnvironmentProbeProvider_Start();
[DllImport("UnityARCore")]
internal static extern void UnityARCore_EnvironmentProbeProvider_Stop();
[DllImport("UnityARCore")]
internal static extern void UnityARCore_EnvironmentProbeProvider_Destroy();
[DllImport("UnityARCore")]
internal static extern void UnityARCore_EnvironmentProbeProvider_SetAutomaticPlacementEnabled();
[DllImport("UnityARCore")]
internal static extern void UnityARCore_EnvironmentProbeProvider_TrySetEnvironmentTextureHDREnabled();
[DllImport("UnityARCore")]
internal static extern void UnityARCore_EnvironmentProbeProvider_GetChanges(out int numAdded, out int numUpdated, out int numRemoved, ref XREnvironmentProbe outProbe);
}
}