using System; using System.Collections.Generic; using System.Reflection; using UnityEngine.Rendering; namespace UnityEditor.Rendering { /// /// Core Render Pipeline preferences. /// public static class CoreRenderPipelinePreferences { /// /// Path to the Render Pipeline Preferences /// public static readonly string corePreferencePath = "Preferences/Graphics"; private static readonly List s_Providers = new(); [InitializeOnLoadMethod] static void InitPreferenceProviders() { foreach (var provider in TypeCache.GetTypesDerivedFrom()) { if (provider.GetConstructor(BindingFlags.Public | BindingFlags.Instance, null, Type.EmptyTypes, null) == null) continue; s_Providers.Add(Activator.CreateInstance(provider) as ICoreRenderPipelinePreferencesProvider); } s_Providers.Sort((x, y) => GetDisplayInfoOrder(x.GetType()).CompareTo(GetDisplayInfoOrder(y.GetType()))); } static int GetDisplayInfoOrder(Type type) { var attribute = type.GetCustomAttribute(); return attribute?.order ?? int.MaxValue; } [SettingsProvider] static SettingsProvider PreferenceGUI() { var provider = new SettingsProvider(corePreferencePath, SettingsScope.User) { guiHandler = searchContext => { using (new SettingsProviderGUIScope()) { foreach (var providers in s_Providers) { if (providers.header != null) { EditorGUILayout.LabelField(providers.header, EditorStyles.boldLabel); providers.PreferenceGUI(); } } } } }; FillKeywords(provider); return provider; } private static void FillKeywords(SettingsProvider provider) { List keywords = new List(); foreach (var providers in s_Providers) keywords.AddRange(providers.keywords); provider.keywords = keywords; } /// /// Open the Core Rendering Pipeline preference window. /// public static void Open() { SettingsService.OpenUserPreferences(corePreferencePath); } } }