193 lines
9.1 KiB
C#
193 lines
9.1 KiB
C#
|
|
/*******************************************************************************
|
|||
|
|
Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved.
|
|||
|
|
|
|||
|
|
NOTICE:All information contained herein is, and remains the property of
|
|||
|
|
PICO Technology Co., Ltd. The intellectual and technical concepts
|
|||
|
|
contained herein are proprietary to PICO Technology Co., Ltd. and may be
|
|||
|
|
covered by patents, patents in process, and are protected by trade secret or
|
|||
|
|
copyright law. Dissemination of this information or reproduction of this
|
|||
|
|
material is strictly forbidden unless prior written permission is obtained from
|
|||
|
|
PICO Technology Co., Ltd.
|
|||
|
|
*******************************************************************************/
|
|||
|
|
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using UnityEngine;
|
|||
|
|
using UnityEditor;
|
|||
|
|
using System.Linq;
|
|||
|
|
using UnityEngine.SceneManagement;
|
|||
|
|
using UnityEngine.Rendering;
|
|||
|
|
#if AR_FOUNDATION_5 || AR_FOUNDATION_6
|
|||
|
|
using UnityEngine.XR.ARFoundation;
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
namespace Unity.XR.PXR.Editor
|
|||
|
|
{
|
|||
|
|
[CustomEditor(typeof(PXR_Settings))]
|
|||
|
|
public class PXR_SettingsEditor : UnityEditor.Editor
|
|||
|
|
{
|
|||
|
|
private const string StereoRenderingModeAndroid = "stereoRenderingModeAndroid";
|
|||
|
|
private const string SystemDisplayFrequency = "systemDisplayFrequency";
|
|||
|
|
private const string OptimizeBufferDiscards = "optimizeBufferDiscards";
|
|||
|
|
private const string SystemSplashScreen = "systemSplashScreen";
|
|||
|
|
|
|||
|
|
static GUIContent guiStereoRenderingMode = EditorGUIUtility.TrTextContent("Stereo Rendering Mode");
|
|||
|
|
static GUIContent guiDisplayFrequency = EditorGUIUtility.TrTextContent("Display Refresh Rates");
|
|||
|
|
private static GUIContent guiOptimizeBuffer = EditorGUIUtility.TrTextContent("Optimize Buffer Discards(Vulkan)");
|
|||
|
|
static GUIContent guiSystemSplashScreen = EditorGUIUtility.TrTextContent("System Splash Screen");
|
|||
|
|
|
|||
|
|
private SerializedProperty stereoRenderingModeAndroid;
|
|||
|
|
private SerializedProperty systemDisplayFrequency;
|
|||
|
|
private SerializedProperty optimizeBufferDiscards;
|
|||
|
|
private SerializedProperty appLog;
|
|||
|
|
private SerializedProperty systemSplashScreen;
|
|||
|
|
|
|||
|
|
void OnEnable()
|
|||
|
|
{
|
|||
|
|
if (stereoRenderingModeAndroid == null)
|
|||
|
|
stereoRenderingModeAndroid = serializedObject.FindProperty(StereoRenderingModeAndroid);
|
|||
|
|
if (systemDisplayFrequency == null)
|
|||
|
|
systemDisplayFrequency = serializedObject.FindProperty(SystemDisplayFrequency);
|
|||
|
|
if (optimizeBufferDiscards == null)
|
|||
|
|
optimizeBufferDiscards = serializedObject.FindProperty(OptimizeBufferDiscards);
|
|||
|
|
if (systemSplashScreen == null)
|
|||
|
|
systemSplashScreen = serializedObject.FindProperty(SystemSplashScreen);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public override void OnInspectorGUI()
|
|||
|
|
{
|
|||
|
|
if (serializedObject == null || serializedObject.targetObject == null)
|
|||
|
|
return;
|
|||
|
|
|
|||
|
|
serializedObject.Update();
|
|||
|
|
EditorGUIUtility.labelWidth = 200.0f;
|
|||
|
|
BuildTargetGroup selectedBuildTargetGroup = EditorGUILayout.BeginBuildTargetSelectionGrouping();
|
|||
|
|
EditorGUILayout.Space();
|
|||
|
|
|
|||
|
|
EditorGUILayout.BeginVertical(GUILayout.ExpandWidth(true));
|
|||
|
|
if (EditorApplication.isPlayingOrWillChangePlaymode)
|
|||
|
|
{
|
|||
|
|
EditorGUILayout.HelpBox("PICO settings cannot be changed when the editor is in play mode.", MessageType.Info);
|
|||
|
|
EditorGUILayout.Space();
|
|||
|
|
}
|
|||
|
|
EditorGUI.BeginDisabledGroup(EditorApplication.isPlayingOrWillChangePlaymode);
|
|||
|
|
if (selectedBuildTargetGroup == BuildTargetGroup.Android)
|
|||
|
|
{
|
|||
|
|
EditorGUILayout.PropertyField(stereoRenderingModeAndroid, guiStereoRenderingMode);
|
|||
|
|
EditorGUILayout.PropertyField(systemDisplayFrequency, guiDisplayFrequency);
|
|||
|
|
EditorGUILayout.PropertyField(optimizeBufferDiscards, guiOptimizeBuffer);
|
|||
|
|
|
|||
|
|
bool aswDisabled = false;
|
|||
|
|
#if !UNITY_2021_1_OR_NEWER
|
|||
|
|
aswDisabled = true;
|
|||
|
|
#endif
|
|||
|
|
if (GraphicsDeviceType.OpenGLES3 == PlayerSettings.GetGraphicsAPIs(EditorUserBuildSettings.activeBuildTarget)[0])
|
|||
|
|
{
|
|||
|
|
GUI.enabled = false;
|
|||
|
|
serializedObject.FindProperty("enableAppSpaceWarp").boolValue = false;
|
|||
|
|
EditorGUILayout.PropertyField(serializedObject.FindProperty("enableAppSpaceWarp"), new GUIContent("Application SpaceWarp", "Set Graphics API to Vulkan."));
|
|||
|
|
}
|
|||
|
|
else if (aswDisabled)
|
|||
|
|
{
|
|||
|
|
GUI.enabled = false;
|
|||
|
|
serializedObject.FindProperty("enableAppSpaceWarp").boolValue = false;
|
|||
|
|
EditorGUILayout.PropertyField(serializedObject.FindProperty("enableAppSpaceWarp"), new GUIContent("Application SpaceWarp", "Unity Editor: 2021 LTS or later."));
|
|||
|
|
}
|
|||
|
|
else if (serializedObject.FindProperty("stereoRenderingModeAndroid").intValue == 0)
|
|||
|
|
{
|
|||
|
|
GUI.enabled = false;
|
|||
|
|
serializedObject.FindProperty("enableAppSpaceWarp").boolValue = false;
|
|||
|
|
EditorGUILayout.PropertyField(serializedObject.FindProperty("enableAppSpaceWarp"), new GUIContent("Application SpaceWarp", "Set Stereo Rendering Mode to Multiview."));
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
EditorGUILayout.PropertyField(serializedObject.FindProperty("enableAppSpaceWarp"), new GUIContent("Application SpaceWarp"));
|
|||
|
|
}
|
|||
|
|
GUI.enabled = true;
|
|||
|
|
|
|||
|
|
EditorGUILayout.PropertyField(systemSplashScreen, guiSystemSplashScreen);
|
|||
|
|
|
|||
|
|
#if AR_FOUNDATION_5 || AR_FOUNDATION_6
|
|||
|
|
PXR_ProjectSetting projectConfig = PXR_ProjectSetting.GetProjectConfig();
|
|||
|
|
var guiContent = new GUIContent();
|
|||
|
|
guiContent.text = "AR Foundation";
|
|||
|
|
projectConfig.arFoundation = EditorGUILayout.Toggle(guiContent, projectConfig.arFoundation);
|
|||
|
|
if (projectConfig.arFoundation)
|
|||
|
|
{
|
|||
|
|
EditorGUI.indentLevel++;
|
|||
|
|
// body tracking
|
|||
|
|
guiContent.text = "Body Tracking";
|
|||
|
|
projectConfig.bodyTracking = EditorGUILayout.Toggle(guiContent, projectConfig.bodyTracking);
|
|||
|
|
|
|||
|
|
// face tracking
|
|||
|
|
guiContent.text = "Face Tracking";
|
|||
|
|
projectConfig.faceTracking = EditorGUILayout.Toggle(guiContent, projectConfig.faceTracking);
|
|||
|
|
|
|||
|
|
// anchor
|
|||
|
|
guiContent.text = "Anchor";
|
|||
|
|
projectConfig.spatialAnchor = EditorGUILayout.Toggle(guiContent, projectConfig.spatialAnchor);
|
|||
|
|
|
|||
|
|
// anchor
|
|||
|
|
guiContent.text = "Meshing";
|
|||
|
|
projectConfig.spatialMesh = EditorGUILayout.Toggle(guiContent, projectConfig.spatialMesh);
|
|||
|
|
|
|||
|
|
List<ARCameraManager> components = FindComponentsInScene<ARCameraManager>().Where(component => (component.enabled && component.gameObject.CompareTag("MainCamera"))).ToList();
|
|||
|
|
bool cameraEffect = false;
|
|||
|
|
for (int i = 0; i < components.Count; i++)
|
|||
|
|
{
|
|||
|
|
ARCameraManager aRCamera = components[i];
|
|||
|
|
if (aRCamera.gameObject.GetComponent<PXR_ARCameraEffectManager>())
|
|||
|
|
{
|
|||
|
|
cameraEffect = true;
|
|||
|
|
}
|
|||
|
|
Camera camera = aRCamera.gameObject.GetComponent<Camera>();
|
|||
|
|
if (camera)
|
|||
|
|
{
|
|||
|
|
camera.clearFlags = CameraClearFlags.SolidColor;
|
|||
|
|
camera.backgroundColor = new Color(0, 0, 0, 0);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (!cameraEffect && components.Count > 0)
|
|||
|
|
{
|
|||
|
|
ARCameraManager aRCamera = components[0];
|
|||
|
|
if (!aRCamera.gameObject.GetComponent<PXR_ARCameraEffectManager>())
|
|||
|
|
{
|
|||
|
|
aRCamera.gameObject.AddComponent<PXR_ARCameraEffectManager>();
|
|||
|
|
}
|
|||
|
|
cameraEffect = true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
EditorGUI.indentLevel--;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (GUI.changed)
|
|||
|
|
{
|
|||
|
|
EditorUtility.SetDirty(projectConfig);
|
|||
|
|
}
|
|||
|
|
#endif
|
|||
|
|
}
|
|||
|
|
EditorGUI.EndDisabledGroup();
|
|||
|
|
EditorGUILayout.EndVertical();
|
|||
|
|
EditorGUILayout.EndBuildTargetSelectionGrouping();
|
|||
|
|
|
|||
|
|
serializedObject.ApplyModifiedProperties();
|
|||
|
|
EditorGUIUtility.labelWidth = 0f;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static List<T> FindComponentsInScene<T>() where T : Component
|
|||
|
|
{
|
|||
|
|
var activeScene = SceneManager.GetActiveScene();
|
|||
|
|
var foundComponents = new List<T>();
|
|||
|
|
|
|||
|
|
var rootObjects = activeScene.GetRootGameObjects();
|
|||
|
|
foreach (var rootObject in rootObjects)
|
|||
|
|
{
|
|||
|
|
var components = rootObject.GetComponentsInChildren<T>(true);
|
|||
|
|
foundComponents.AddRange(components);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return foundComponents;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|