in Assets/MRTK/Core/Inspectors/Profiles/MixedRealityToolkitConfigurationProfileInspector.cs [99:437]
protected override void OnEnable()
{
base.OnEnable();
if (target == null)
{
// Either when we are recompiling, or the inspector window is hidden behind another one, the target can get destroyed (null) and thereby will raise an ArgumentException when accessing serializedObject. For now, just return.
return;
}
MixedRealityToolkitConfigurationProfile mrtkConfigProfile = target as MixedRealityToolkitConfigurationProfile;
// Experience configuration
experienceSettingsProfile = serializedObject.FindProperty("experienceSettingsProfile");
experienceScaleMigration = serializedObject.FindProperty("targetExperienceScale");
// Camera configuration
enableCameraSystem = serializedObject.FindProperty("enableCameraSystem");
cameraSystemType = serializedObject.FindProperty("cameraSystemType");
cameraProfile = serializedObject.FindProperty("cameraProfile");
// Input system configuration
enableInputSystem = serializedObject.FindProperty("enableInputSystem");
inputSystemType = serializedObject.FindProperty("inputSystemType");
inputSystemProfile = serializedObject.FindProperty("inputSystemProfile");
// Boundary system configuration
enableBoundarySystem = serializedObject.FindProperty("enableBoundarySystem");
boundarySystemType = serializedObject.FindProperty("boundarySystemType");
xrsdkBoundarySystemType = serializedObject.FindProperty("xrsdkBoundarySystemType");
boundaryVisualizationProfile = serializedObject.FindProperty("boundaryVisualizationProfile");
#if UNITY_2019
xrPipelineUtility.Enable();
#endif // UNITY_2019
// Teleport system configuration
enableTeleportSystem = serializedObject.FindProperty("enableTeleportSystem");
teleportSystemType = serializedObject.FindProperty("teleportSystemType");
// Spatial Awareness system configuration
enableSpatialAwarenessSystem = serializedObject.FindProperty("enableSpatialAwarenessSystem");
spatialAwarenessSystemType = serializedObject.FindProperty("spatialAwarenessSystemType");
spatialAwarenessSystemProfile = serializedObject.FindProperty("spatialAwarenessSystemProfile");
// Diagnostics system configuration
enableDiagnosticsSystem = serializedObject.FindProperty("enableDiagnosticsSystem");
enableVerboseLogging = serializedObject.FindProperty("enableVerboseLogging");
diagnosticsSystemType = serializedObject.FindProperty("diagnosticsSystemType");
diagnosticsSystemProfile = serializedObject.FindProperty("diagnosticsSystemProfile");
// Scene system configuration
enableSceneSystem = serializedObject.FindProperty("enableSceneSystem");
sceneSystemType = serializedObject.FindProperty("sceneSystemType");
sceneSystemProfile = serializedObject.FindProperty("sceneSystemProfile");
// Additional registered components configuration
registeredServiceProvidersProfile = serializedObject.FindProperty("registeredServiceProvidersProfile");
// Editor settings
useServiceInspectors = serializedObject.FindProperty("useServiceInspectors");
renderDepthBuffer = serializedObject.FindProperty("renderDepthBuffer");
SelectedProfileTab = SessionState.GetInt(SelectedTabPreferenceKey, SelectedProfileTab);
if (renderProfileFuncs == null)
{
renderProfileFuncs = new Func<bool>[]
{
() => {
bool changed = false;
using (var c = new EditorGUI.ChangeCheckScope())
{
// Reconciling old Experience Scale property with the Experience Settings Profile
ExperienceScale? oldExperienceSettingsScale = null;
if (experienceSettingsProfile.objectReferenceValue is MixedRealityExperienceSettingsProfile oldExperienceSettingsProfile
&& oldExperienceSettingsProfile != null)
{
oldExperienceSettingsScale = oldExperienceSettingsProfile.TargetExperienceScale;
}
changed |= RenderProfile(experienceSettingsProfile, typeof(MixedRealityExperienceSettingsProfile), true, false, null);
// Experience configuration
if (mrtkConfigProfile.ExperienceSettingsProfile != null)
{
// If the Experience Scale property changed, make sure we also alter the configuration profile's target experience scale property for compatibility
ExperienceScale? newExperienceSettingsScale = null;
if (experienceSettingsProfile.objectReferenceValue is MixedRealityExperienceSettingsProfile newExperienceSettingsProfile
&& newExperienceSettingsProfile != null)
{
newExperienceSettingsScale = newExperienceSettingsProfile.TargetExperienceScale;
}
if (oldExperienceSettingsScale.HasValue && newExperienceSettingsScale.HasValue && oldExperienceSettingsScale != newExperienceSettingsScale)
{
experienceScaleMigration.intValue = (int)newExperienceSettingsScale;
experienceScaleMigration.serializedObject.ApplyModifiedProperties();
}
// If we have not changed the Experience Settings profile and its value is out of sync with the top level configuration profile, display a migration prompt
else if ((ExperienceScale)experienceScaleMigration.intValue != mrtkConfigProfile.ExperienceSettingsProfile.TargetExperienceScale)
{
Color errorColor = Color.Lerp(Color.white, Color.red, 0.5f);
Color defaultColor = GUI.color;
GUI.color = errorColor;
EditorGUILayout.HelpBox("A previous version of this profile has a different Experience Scale, displayed below. Please modify the Experience Setting Profile's Target Experience Scale or select your desired scale below", MessageType.Warning);
var oldValue = experienceScaleMigration.intValue;
EditorGUILayout.PropertyField(experienceScaleMigration);
if (oldValue != experienceScaleMigration.intValue)
{
mrtkConfigProfile.ExperienceSettingsProfile.TargetExperienceScale = (ExperienceScale)experienceScaleMigration.intValue;
}
GUI.color = defaultColor;
}
ExperienceScale experienceScale = mrtkConfigProfile.ExperienceSettingsProfile.TargetExperienceScale;
string targetExperienceSummary = GetExperienceDescription(experienceScale);
if (!string.IsNullOrEmpty(targetExperienceSummary))
{
EditorGUILayout.HelpBox(targetExperienceSummary, MessageType.None);
EditorGUILayout.Space();
}
}
changed |= c.changed;
}
return changed;
},
() => {
bool changed = false;
using (var c = new EditorGUI.ChangeCheckScope())
{
EditorGUILayout.PropertyField(enableCameraSystem);
const string service = "Camera System";
if (enableCameraSystem.boolValue)
{
CheckSystemConfiguration(service, mrtkConfigProfile.CameraSystemType, mrtkConfigProfile.CameraProfile != null);
EditorGUILayout.PropertyField(cameraSystemType);
changed |= RenderProfile(cameraProfile, typeof(MixedRealityCameraProfile), true, false);
}
else
{
RenderSystemDisabled(service);
}
changed |= c.changed;
}
return changed;
},
() => {
bool changed = false;
using (var c = new EditorGUI.ChangeCheckScope())
{
EditorGUILayout.PropertyField(enableInputSystem);
const string service = "Input System";
if (enableInputSystem.boolValue)
{
CheckSystemConfiguration(service, mrtkConfigProfile.InputSystemType, mrtkConfigProfile.InputSystemProfile != null);
EditorGUILayout.PropertyField(inputSystemType);
changed |= RenderProfile(inputSystemProfile, null, true, false, typeof(IMixedRealityInputSystem));
}
else
{
RenderSystemDisabled(service);
}
changed |= c.changed;
}
return changed;
},
() => {
if(mrtkConfigProfile.ExperienceSettingsProfile.IsNull())
{
// Alert that an experience settings profile has not been selected
GUILayout.Space(6f);
EditorGUILayout.HelpBox("Boundaries require an experience settings profile with a Room scale target experience scale.", MessageType.Warning);
GUILayout.Space(6f);
}
else
{
var experienceScale = mrtkConfigProfile.ExperienceSettingsProfile.TargetExperienceScale;
if (experienceScale != ExperienceScale.Room)
{
// Alert the user if the experience scale does not support boundary features.
GUILayout.Space(6f);
EditorGUILayout.HelpBox("Boundaries are only supported in Room scale experiences.", MessageType.Warning);
GUILayout.Space(6f);
}
}
bool changed = false;
using (var c = new EditorGUI.ChangeCheckScope())
{
EditorGUILayout.PropertyField(enableBoundarySystem);
const string service = "Boundary System";
if (enableBoundarySystem.boolValue)
{
CheckSystemConfiguration(service, mrtkConfigProfile.BoundarySystemSystemType, mrtkConfigProfile.BoundaryVisualizationProfile != null);
#if UNITY_2019
xrPipelineUtility.RenderXRPipelineTabs();
#endif // UNITY_2019
EditorGUILayout.PropertyField(xrPipelineUtility.SelectedPipeline == SupportedUnityXRPipelines.XRSDK ? xrsdkBoundarySystemType : boundarySystemType);
changed |= RenderProfile(boundaryVisualizationProfile, null, true, false, typeof(IMixedRealityBoundarySystem));
}
else
{
RenderSystemDisabled(service);
}
changed |= c.changed;
}
return changed;
},
() => {
const string service = "Teleport System";
using (var c = new EditorGUI.ChangeCheckScope())
{
EditorGUILayout.PropertyField(enableTeleportSystem);
if (enableTeleportSystem.boolValue)
{
// Teleport System does not have a profile scriptableobject so auto to true
CheckSystemConfiguration(service, mrtkConfigProfile.TeleportSystemSystemType,true);
EditorGUILayout.PropertyField(teleportSystemType);
}
else
{
RenderSystemDisabled(service);
}
return c.changed;
}
},
() => {
bool changed = false;
using (var c = new EditorGUI.ChangeCheckScope())
{
const string service = "Spatial Awareness System";
EditorGUILayout.PropertyField(enableSpatialAwarenessSystem);
if (enableSpatialAwarenessSystem.boolValue)
{
CheckSystemConfiguration(service, mrtkConfigProfile.SpatialAwarenessSystemSystemType, mrtkConfigProfile.SpatialAwarenessSystemProfile != null);
EditorGUILayout.PropertyField(spatialAwarenessSystemType);
EditorGUILayout.HelpBox("Spatial Awareness settings are configured per observer.", MessageType.Info);
changed |= RenderProfile(spatialAwarenessSystemProfile, null, true, false, typeof(IMixedRealitySpatialAwarenessSystem));
}
else
{
RenderSystemDisabled(service);
}
changed |= c.changed;
}
return changed;
},
() => {
EditorGUILayout.HelpBox("It is recommended to enable the Diagnostics system during development. Be sure to disable prior to building your shipping product.", MessageType.Warning);
bool changed = false;
using (var c = new EditorGUI.ChangeCheckScope())
{
EditorGUILayout.PropertyField(enableVerboseLogging);
EditorGUILayout.PropertyField(enableDiagnosticsSystem);
const string service = "Diagnostics System";
if (enableDiagnosticsSystem.boolValue)
{
CheckSystemConfiguration(service, mrtkConfigProfile.DiagnosticsSystemSystemType, mrtkConfigProfile.DiagnosticsSystemProfile != null);
EditorGUILayout.PropertyField(diagnosticsSystemType);
changed |= RenderProfile(diagnosticsSystemProfile, typeof(MixedRealityDiagnosticsProfile));
}
else
{
RenderSystemDisabled(service);
}
changed |= c.changed;
}
return changed;
},
() => {
bool changed = false;
using (var c = new EditorGUI.ChangeCheckScope())
{
EditorGUILayout.PropertyField(enableSceneSystem);
const string service = "Scene System";
if (enableSceneSystem.boolValue)
{
CheckSystemConfiguration(service, mrtkConfigProfile.SceneSystemSystemType, mrtkConfigProfile.SceneSystemProfile != null);
EditorGUILayout.PropertyField(sceneSystemType);
changed |= RenderProfile(sceneSystemProfile, typeof(MixedRealitySceneSystemProfile), true, true, typeof(IMixedRealitySceneSystem));
}
changed |= c.changed;
}
return changed;
},
() => {
return RenderProfile(registeredServiceProvidersProfile, typeof(MixedRealityRegisteredServiceProvidersProfile), true, false);
},
() => {
EditorGUILayout.PropertyField(useServiceInspectors);
using (var c = new EditorGUI.ChangeCheckScope())
{
EditorGUILayout.PropertyField(renderDepthBuffer);
if (c.changed)
{
if (renderDepthBuffer.boolValue)
{
CameraCache.Main.gameObject.AddComponent<DepthBufferRenderer>();
}
else
{
foreach (var dbr in FindObjectsOfType<DepthBufferRenderer>())
{
UnityObjectExtensions.DestroyObject(dbr);
}
}
}
}
return false;
},
};
}
}