/* * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * Licensed under the Oculus SDK License Agreement (the "License"); * you may not use the Oculus SDK except in compliance with the License, * which is provided at the time of installation or download, or which * otherwise accompanies this software in either electronic or hard copy form. * * You may obtain a copy of the License at * * https://developer.oculus.com/licenses/oculussdk/ * * Unless required by applicable law or agreed to in writing, the Oculus SDK * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ using UnityEngine; using UnityEditor; [CustomEditor(typeof(OVRManager))] public class OVRManagerEditor : Editor { private SerializedProperty _requestBodyTrackingPermissionOnStartup; private SerializedProperty _requestFaceTrackingPermissionOnStartup; private SerializedProperty _requestEyeTrackingPermissionOnStartup; private SerializedProperty _requestScenePermissionOnStartup; private bool _expandPermissionsRequest; void OnEnable() { _requestBodyTrackingPermissionOnStartup = serializedObject.FindProperty(nameof(OVRManager.requestBodyTrackingPermissionOnStartup)); _requestFaceTrackingPermissionOnStartup = serializedObject.FindProperty(nameof(OVRManager.requestFaceTrackingPermissionOnStartup)); _requestEyeTrackingPermissionOnStartup = serializedObject.FindProperty(nameof(OVRManager.requestEyeTrackingPermissionOnStartup)); _requestScenePermissionOnStartup = serializedObject.FindProperty(nameof(OVRManager.requestScenePermissionOnStartup)); } public override void OnInspectorGUI() { serializedObject.ApplyModifiedProperties(); OVRRuntimeSettings runtimeSettings = OVRRuntimeSettings.GetRuntimeSettings(); OVRProjectConfig projectConfig = OVRProjectConfig.GetProjectConfig(); #if UNITY_ANDROID OVRProjectConfigEditor.DrawTargetDeviceInspector(projectConfig); EditorGUILayout.Space(); #endif DrawDefaultInspector(); bool modified = false; #if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || UNITY_ANDROID OVRManager manager = (OVRManager)target; EditorGUILayout.Space(); EditorGUILayout.LabelField("Display", EditorStyles.boldLabel); OVRManager.ColorSpace colorGamut = runtimeSettings.colorSpace; OVREditorUtil.SetupEnumField(target, new GUIContent("Color Gamut", "The target color gamut when displayed on the HMD"), ref colorGamut, ref modified, "https://developer.oculus.com/documentation/unity/unity-color-space/"); manager.colorGamut = colorGamut; if (modified) { runtimeSettings.colorSpace = colorGamut; OVRRuntimeSettings.CommitRuntimeSettings(runtimeSettings); } #endif EditorGUILayout.Space(); OVRProjectConfigEditor.DrawProjectConfigInspector(projectConfig); #if UNITY_ANDROID EditorGUILayout.Space(); EditorGUILayout.LabelField("Mixed Reality Capture for Quest", EditorStyles.boldLabel); EditorGUI.indentLevel++; OVREditorUtil.SetupEnumField(target, "ActivationMode", ref manager.mrcActivationMode, ref modified); EditorGUI.indentLevel--; #endif #if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN EditorGUILayout.Space(); EditorGUILayout.BeginHorizontal(); manager.expandMixedRealityCapturePropertySheet = EditorGUILayout.BeginFoldoutHeaderGroup(manager.expandMixedRealityCapturePropertySheet, "Mixed Reality Capture"); OVREditorUtil.DisplayDocLink("https://developer.oculus.com/documentation/unity/unity-mrc/"); EditorGUILayout.EndHorizontal(); if (manager.expandMixedRealityCapturePropertySheet) { string[] layerMaskOptions = new string[32]; for (int i = 0; i < 32; ++i) { layerMaskOptions[i] = LayerMask.LayerToName(i); if (layerMaskOptions[i].Length == 0) { layerMaskOptions[i] = ""; } } EditorGUI.indentLevel++; OVREditorUtil.SetupBoolField(target, "Enable MixedRealityCapture", ref manager.enableMixedReality, ref modified); OVREditorUtil.SetupEnumField(target, "Composition Method", ref manager.compositionMethod, ref modified); OVREditorUtil.SetupLayerMaskField(target, "Extra Hidden Layers", ref manager.extraHiddenLayers, layerMaskOptions, ref modified); OVREditorUtil.SetupLayerMaskField(target, "Extra Visible Layers", ref manager.extraVisibleLayers, layerMaskOptions, ref modified); OVREditorUtil.SetupBoolField(target, "Dynamic Culling Mask", ref manager.dynamicCullingMask, ref modified); // CompositionMethod.External is the only composition method that is available. // All other deprecated composition methods should fallback to the path below. { // CompositionMethod.External EditorGUILayout.Space(); EditorGUILayout.LabelField("External Composition", EditorStyles.boldLabel); EditorGUI.indentLevel++; OVREditorUtil.SetupColorField(target, "Backdrop Color (Target, Rift)", ref manager.externalCompositionBackdropColorRift, ref modified); OVREditorUtil.SetupColorField(target, "Backdrop Color (Target, Quest)", ref manager.externalCompositionBackdropColorQuest, ref modified); EditorGUI.indentLevel--; } EditorGUI.indentLevel--; } EditorGUILayout.EndFoldoutHeaderGroup(); #endif #if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || UNITY_ANDROID // Multimodal hands and controllers section #if UNITY_ANDROID bool launchMultimodalHandsControllersOnStartup = projectConfig.multimodalHandsControllersSupport != OVRProjectConfig.MultimodalHandsControllersSupport.Disabled; EditorGUI.BeginDisabledGroup(!launchMultimodalHandsControllersOnStartup); GUIContent enableConcurrentHandsAndControllersOnStartup = new GUIContent("Launch concurrent hands and controllers mode on startup", "Launches concurrent hands and controllers on startup for the scene. Concurrent Hands and Controllers Capability must be enabled in the project settings."); #else GUIContent enableConcurrentHandsAndControllersOnStartup = new GUIContent("Enable concurrent hands and controllers mode on startup", "Launches concurrent hands and controllers on startup for the scene."); #endif EditorGUILayout.Space(); EditorGUILayout.LabelField("Concurrent hands and controllers", EditorStyles.boldLabel); #if UNITY_ANDROID if (!launchMultimodalHandsControllersOnStartup) { EditorGUILayout.LabelField( "Requires Concurrent Hands and Controllers Capability to be enabled in the General section of the Quest features.", EditorStyles.wordWrappedLabel); } #endif OVREditorUtil.SetupBoolField(target, enableConcurrentHandsAndControllersOnStartup, ref manager.launchMultimodalHandsControllersOnStartup, ref modified); #if UNITY_ANDROID EditorGUI.EndDisabledGroup(); #endif #endif #if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || UNITY_ANDROID // Insight Passthrough section #if UNITY_ANDROID bool passthroughCapabilityEnabled = projectConfig.insightPassthroughSupport != OVRProjectConfig.FeatureSupport.None; EditorGUI.BeginDisabledGroup(!passthroughCapabilityEnabled); GUIContent enablePassthroughContent = new GUIContent("Enable Passthrough", "Enables passthrough functionality for the scene. Can be toggled at runtime. Passthrough Capability must be enabled in the project settings."); #else GUIContent enablePassthroughContent = new GUIContent("Enable Passthrough", "Enables passthrough functionality for the scene. Can be toggled at runtime."); #endif EditorGUILayout.Space(); EditorGUILayout.LabelField("Insight Passthrough", EditorStyles.boldLabel); #if UNITY_ANDROID if (!passthroughCapabilityEnabled) { EditorGUILayout.LabelField( "Requires Passthrough Capability to be enabled in the General section of the Quest features.", EditorStyles.wordWrappedLabel); } #endif OVREditorUtil.SetupBoolField(target, enablePassthroughContent, ref manager.isInsightPassthroughEnabled, ref modified); #if UNITY_ANDROID EditorGUI.EndDisabledGroup(); #endif #endif #region PermissionRequests EditorGUILayout.Space(); _expandPermissionsRequest = EditorGUILayout.BeginFoldoutHeaderGroup(_expandPermissionsRequest, "Permission Requests On Startup"); if (_expandPermissionsRequest) { void AddPermissionGroup(bool featureEnabled, string permissionName, SerializedProperty property) { using (new EditorGUI.DisabledScope(!featureEnabled)) { if (!featureEnabled) { EditorGUILayout.LabelField( $"Requires {permissionName} Capability to be enabled in the Quest features section.", EditorStyles.wordWrappedLabel); } var label = new GUIContent(permissionName, $"Requests {permissionName} permission on start up. {permissionName} Capability must be enabled in the project settings."); EditorGUILayout.PropertyField(property, label); } } AddPermissionGroup(projectConfig.bodyTrackingSupport != OVRProjectConfig.FeatureSupport.None, "Body Tracking", _requestBodyTrackingPermissionOnStartup); AddPermissionGroup(projectConfig.faceTrackingSupport != OVRProjectConfig.FeatureSupport.None, "Face Tracking", _requestFaceTrackingPermissionOnStartup); AddPermissionGroup(projectConfig.eyeTrackingSupport != OVRProjectConfig.FeatureSupport.None, "Eye Tracking", _requestEyeTrackingPermissionOnStartup); AddPermissionGroup(projectConfig.sceneSupport != OVRProjectConfig.FeatureSupport.None, "Scene", _requestScenePermissionOnStartup); } EditorGUILayout.EndFoldoutHeaderGroup(); #endregion if (modified) { EditorUtility.SetDirty(target); } serializedObject.ApplyModifiedProperties(); #if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || UNITY_ANDROID #if !OCULUS_XR_3_3_0_OR_NEWER || UNITY_2020 if (manager.enableDynamicResolution && !PlayerSettings.GetUseDefaultGraphicsAPIs(BuildTarget.Android)) { UnityEngine.Rendering.GraphicsDeviceType[] apis = PlayerSettings.GetGraphicsAPIs(BuildTarget.Android); if (apis.Length >= 1 && apis[0] == UnityEngine.Rendering.GraphicsDeviceType.Vulkan) { Debug.LogError("Vulkan Dynamic Resolution is not supported on your current build version. Ensure you are on Unity 2021+ with Oculus XR plugin v3.3.0+"); manager.enableDynamicResolution = false; } } #endif #endif } }