123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380 |
- using System;
- using System.IO;
- using System.ComponentModel;
- using System.Collections.Generic;
- using UnityEngine.Serialization;
- #if UNITY_EDITOR
- using UnityEditor;
- using UnityEditor.Rendering;
- #endif
-
- namespace UnityEngine.Rendering.Universal
- {
- /// <summary>
- /// Universal Render Pipeline's Global Settings.
- /// Global settings are unique per Render Pipeline type. In URP, Global Settings contain:
- /// - light layer names
- /// </summary>
- [URPHelpURL("urp-global-settings")]
- [DisplayInfo(name = "URP Global Settings Asset", order = CoreUtils.Sections.section4 + 2)]
- [SupportedOnRenderPipeline(typeof(UniversalRenderPipelineAsset))]
- [DisplayName("URP")]
- partial class UniversalRenderPipelineGlobalSettings : RenderPipelineGlobalSettings<UniversalRenderPipelineGlobalSettings, UniversalRenderPipeline>
- {
- [SerializeField] RenderPipelineGraphicsSettingsContainer m_Settings = new();
- protected override List<IRenderPipelineGraphicsSettings> settingsList => m_Settings.settingsList;
-
- #region Version system
-
- internal bool IsAtLastVersion() => k_LastVersion == m_AssetVersion;
-
- internal const int k_LastVersion = 8;
-
- #pragma warning disable CS0414
- [SerializeField][FormerlySerializedAs("k_AssetVersion")]
- internal int m_AssetVersion = k_LastVersion;
- #pragma warning restore CS0414
-
- #if UNITY_EDITOR
- public static void UpgradeAsset(int assetInstanceID)
- {
- if (EditorUtility.InstanceIDToObject(assetInstanceID) is not UniversalRenderPipelineGlobalSettings asset)
- return;
-
- int assetVersionBeforeUpgrade = asset.m_AssetVersion;
-
- if (asset.m_AssetVersion < 2)
- {
- #pragma warning disable 618 // Obsolete warning
- // Renamed supportRuntimeDebugDisplay => m_StripDebugVariants, which results in inverted logic
- asset.m_StripDebugVariants = !asset.supportRuntimeDebugDisplay;
- asset.m_AssetVersion = 2;
- #pragma warning restore 618 // Obsolete warning
-
- // For old test projects lets keep post processing stripping enabled, as huge chance they did not used runtime profile creating
- #if UNITY_INCLUDE_TESTS
- #pragma warning disable 618 // Obsolete warning
- asset.m_StripUnusedPostProcessingVariants = true;
- #pragma warning restore 618 // Obsolete warning
- #endif
- }
-
- if (asset.m_AssetVersion < 3)
- {
- int index = 0;
- asset.m_RenderingLayerNames = new string[8];
- #pragma warning disable 618 // Obsolete warning
- asset.m_RenderingLayerNames[index++] = asset.lightLayerName0;
- asset.m_RenderingLayerNames[index++] = asset.lightLayerName1;
- asset.m_RenderingLayerNames[index++] = asset.lightLayerName2;
- asset.m_RenderingLayerNames[index++] = asset.lightLayerName3;
- asset.m_RenderingLayerNames[index++] = asset.lightLayerName4;
- asset.m_RenderingLayerNames[index++] = asset.lightLayerName5;
- asset.m_RenderingLayerNames[index++] = asset.lightLayerName6;
- asset.m_RenderingLayerNames[index++] = asset.lightLayerName7;
- #pragma warning restore 618 // Obsolete warning
- asset.m_AssetVersion = 3;
- DecalProjector.UpdateAllDecalProperties();
- }
-
- if (asset.m_AssetVersion < 4)
- {
- #pragma warning disable 618 // Type or member is obsolete
- asset.m_ShaderStrippingSetting.exportShaderVariants = asset.m_ExportShaderVariants;
- asset.m_ShaderStrippingSetting.shaderVariantLogLevel = asset.m_ShaderVariantLogLevel;
- asset.m_ShaderStrippingSetting.stripRuntimeDebugShaders = asset.m_StripDebugVariants;
- asset.m_URPShaderStrippingSetting.stripScreenCoordOverrideVariants = asset.m_StripScreenCoordOverrideVariants;
- asset.m_URPShaderStrippingSetting.stripUnusedPostProcessingVariants = asset.m_StripUnusedPostProcessingVariants;
- asset.m_URPShaderStrippingSetting.stripUnusedVariants = asset.m_StripUnusedVariants;
- #pragma warning restore 618
-
- asset.m_AssetVersion = 4;
- }
-
- if (asset.m_AssetVersion < 5)
- {
- #pragma warning disable 618 // Type or member is obsolete
- asset.m_ObsoleteDefaultVolumeProfile = GetOrCreateDefaultVolumeProfile(asset.m_ObsoleteDefaultVolumeProfile);
- #pragma warning restore 618 // Type or member is obsolete
- asset.m_AssetVersion = 5;
- }
-
- if (asset.m_AssetVersion < 6)
- {
- MigrateToRenderPipelineGraphicsSettings(asset);
- #pragma warning disable 618 // Type or member is obsolete
- asset.m_EnableRenderGraph = false;
- #pragma warning restore 618 // Type or member is obsolete
- asset.m_AssetVersion = 6;
- }
-
- if (asset.m_AssetVersion < 7)
- {
- #pragma warning disable 618 // Type or member is obsolete
- if (asset.m_RenderingLayerNames != null)
- {
- for (int i = 1; i < asset.m_RenderingLayerNames.Length; i++)
- {
- if (i >= RenderingLayerMask.GetRenderingLayerCount())
- RenderPipelineEditorUtility.TryAddRenderingLayerName("");
-
- var name = asset.m_RenderingLayerNames[i];
- if(string.IsNullOrWhiteSpace(name))
- continue;
-
- var currentLayerName = RenderingLayerMask.RenderingLayerToName(i);
- if (!string.IsNullOrWhiteSpace(currentLayerName))
- currentLayerName += $" - {name}";
- else
- currentLayerName = name;
- RenderPipelineEditorUtility.TrySetRenderingLayerName(i, currentLayerName);
- }
- }
-
- #pragma warning restore 618 // Type or member is obsolete
- asset.m_AssetVersion = 7;
- }
-
- // Reload PSDImporter and AsepriteImporter assets for 2D. Importers are triggered before graphics settings are loaded
- // This ensures affected assets dependent on default materials from graphics settings are loaded correctly
- if (asset.m_AssetVersion < 8)
- {
- var distinctGuids = AssetDatabase.FindAssets("", new[] { "Assets" });
-
- for (int i = 0; i < distinctGuids.Length; i++)
- {
- var path = AssetDatabase.GUIDToAssetPath(distinctGuids[i]);
- var assetExt = Path.GetExtension(path);
-
- if (assetExt == ".psb" || assetExt == ".psd" ||
- assetExt == ".ase" || assetExt == ".aseprite")
- AssetDatabase.ImportAsset(path);
- }
-
- asset.m_AssetVersion = 8;
- }
-
- // If the asset version has changed, means that a migration step has been executed
- if (assetVersionBeforeUpgrade != asset.m_AssetVersion)
- EditorUtility.SetDirty(asset);
- }
-
- public static void MigrateToRenderPipelineGraphicsSettings(UniversalRenderPipelineGlobalSettings data)
- {
- MigrateToShaderStrippingSetting(data);
- MigrateToURPShaderStrippingSetting(data);
- MigrateDefaultVolumeProfile(data);
- MigrateToRenderGraphSettings(data);
- }
-
- private static T GetOrCreateGraphicsSettings<T>(UniversalRenderPipelineGlobalSettings data)
- where T : class, IRenderPipelineGraphicsSettings, new()
- {
- T settings;
-
- if (data.TryGet(typeof(T), out var baseSettings))
- {
- settings = baseSettings as T;
- }
- else
- {
- settings = new T();
- data.Add(settings);
- }
-
- return settings;
- }
-
- static void MigrateToShaderStrippingSetting(UniversalRenderPipelineGlobalSettings data)
- {
- var shaderStrippingSetting = GetOrCreateGraphicsSettings<ShaderStrippingSetting>(data);
-
- #pragma warning disable 618 // Type or member is obsolete
- shaderStrippingSetting.shaderVariantLogLevel = data.m_ShaderStrippingSetting.shaderVariantLogLevel;
- shaderStrippingSetting.exportShaderVariants = data.m_ShaderStrippingSetting.exportShaderVariants;
- shaderStrippingSetting.stripRuntimeDebugShaders = data.m_ShaderStrippingSetting.stripRuntimeDebugShaders;
- #pragma warning restore 618
- }
-
- static void MigrateToRenderGraphSettings(UniversalRenderPipelineGlobalSettings data)
- {
- var rgSettings = GetOrCreateGraphicsSettings<RenderGraphSettings>(data);
-
- #pragma warning disable 618 // Type or member is obsolete
- rgSettings.enableRenderCompatibilityMode = !data.m_EnableRenderGraph;
- #pragma warning restore 618
- }
-
- static void MigrateToURPShaderStrippingSetting(UniversalRenderPipelineGlobalSettings data)
- {
- var urpShaderStrippingSetting = GetOrCreateGraphicsSettings<URPShaderStrippingSetting>(data);
-
- #pragma warning disable 618 // Type or member is obsolete
- urpShaderStrippingSetting.stripScreenCoordOverrideVariants = data.m_URPShaderStrippingSetting.stripScreenCoordOverrideVariants;
- urpShaderStrippingSetting.stripUnusedPostProcessingVariants = data.m_URPShaderStrippingSetting.stripUnusedPostProcessingVariants;
- urpShaderStrippingSetting.stripUnusedVariants = data.m_URPShaderStrippingSetting.stripUnusedVariants;
- #pragma warning restore 618
- }
-
- static void MigrateDefaultVolumeProfile(UniversalRenderPipelineGlobalSettings data)
- {
- #pragma warning disable 618 // Type or member is obsolete
- var defaultVolumeProfileSettings = GetOrCreateGraphicsSettings<URPDefaultVolumeProfileSettings>(data);
- defaultVolumeProfileSettings.volumeProfile = data.m_ObsoleteDefaultVolumeProfile;
- data.m_ObsoleteDefaultVolumeProfile = null; // Discard old reference after it is migrated
- #pragma warning restore 618 // Type or member is obsolete
- }
-
- #endif // #if UNITY_EDITOR
-
- #endregion
-
- /// <summary>Default name when creating an URP Global Settings asset.</summary>
- public const string defaultAssetName = "UniversalRenderPipelineGlobalSettings";
-
- #if UNITY_EDITOR
- internal static string defaultPath => $"Assets/{defaultAssetName}.asset";
-
- //Making sure there is at least one UniversalRenderPipelineGlobalSettings instance in the project
- internal static UniversalRenderPipelineGlobalSettings Ensure(bool canCreateNewAsset = true)
- {
- UniversalRenderPipelineGlobalSettings currentInstance = GraphicsSettings.
- GetSettingsForRenderPipeline<UniversalRenderPipeline>() as UniversalRenderPipelineGlobalSettings;
-
- if (RenderPipelineGlobalSettingsUtils.TryEnsure<UniversalRenderPipelineGlobalSettings, UniversalRenderPipeline>(ref currentInstance, defaultPath, canCreateNewAsset))
- {
- if (currentInstance != null && !currentInstance.IsAtLastVersion())
- {
- UpgradeAsset(currentInstance.GetInstanceID());
- AssetDatabase.SaveAssetIfDirty(currentInstance);
- }
-
- return currentInstance;
- }
-
- return null;
- }
-
- public override void Initialize(RenderPipelineGlobalSettings source = null)
- {
- if (source is UniversalRenderPipelineGlobalSettings globalSettingsSource)
- Array.Copy(globalSettingsSource.m_RenderingLayerNames, m_RenderingLayerNames, globalSettingsSource.m_RenderingLayerNames.Length);
-
- // Note: RenderPipelineGraphicsSettings are not populated yet when the global settings asset is being
- // initialized, so create the setting before using it
- var defaultVolumeProfileSettings = GetOrCreateGraphicsSettings<URPDefaultVolumeProfileSettings>(this);
- defaultVolumeProfileSettings.volumeProfile = GetOrCreateDefaultVolumeProfile(defaultVolumeProfileSettings.volumeProfile);
- }
-
- #endif // #if UNITY_EDITOR
-
- /// <inheritdoc/>
- public override void Reset()
- {
- base.Reset();
- DecalProjector.UpdateAllDecalProperties();
- }
-
- internal static VolumeProfile GetOrCreateDefaultVolumeProfile(VolumeProfile defaultVolumeProfile)
- {
- #if UNITY_EDITOR
- if (defaultVolumeProfile == null || defaultVolumeProfile.Equals(null))
- {
- const string k_DefaultVolumeProfileName = "DefaultVolumeProfile";
- const string k_DefaultVolumeProfilePath = "Assets/" + k_DefaultVolumeProfileName + ".asset";
-
- defaultVolumeProfile = CreateInstance<VolumeProfile>();
- Debug.Assert(defaultVolumeProfile);
-
- defaultVolumeProfile.name = k_DefaultVolumeProfileName;
- AssetDatabase.CreateAsset(defaultVolumeProfile, k_DefaultVolumeProfilePath);
-
- AssetDatabase.SaveAssetIfDirty(defaultVolumeProfile);
- AssetDatabase.Refresh();
-
- if (VolumeManager.instance.isInitialized && RenderPipelineManager.currentPipeline is UniversalRenderPipeline)
- VolumeManager.instance.SetGlobalDefaultProfile(defaultVolumeProfile);
- }
- #endif
- return defaultVolumeProfile;
- }
-
- [SerializeField, FormerlySerializedAs("m_DefaultVolumeProfile")]
- [Obsolete("Kept For Migration. #from(2023.3)")]
- internal VolumeProfile m_ObsoleteDefaultVolumeProfile;
-
- [SerializeField]
- internal string[] m_RenderingLayerNames = new string[] { "Default" };
-
- [SerializeField]
- uint m_ValidRenderingLayers;
-
- /// <summary>
- /// Names used for display of light layers with Layer's index as prefix.
- /// For example: "0: Light Layer Default"
- /// </summary>
- [Obsolete("This is obsolete, please use prefixedRenderingLayerMaskNames instead.", true)]
- public string[] prefixedLightLayerNames => new string[0];
-
-
- #region Light Layer Names [3D]
-
- /// <summary>Name for light layer 0.</summary>
- [Obsolete("This is obsolete, please use renderingLayerMaskNames instead.", false)]
- public string lightLayerName0;
- /// <summary>Name for light layer 1.</summary>
- [Obsolete("This is obsolete, please use renderingLayerMaskNames instead.", false)]
- public string lightLayerName1;
- /// <summary>Name for light layer 2.</summary>
- [Obsolete("This is obsolete, please use renderingLayerMaskNames instead.", false)]
- public string lightLayerName2;
- /// <summary>Name for light layer 3.</summary>
- [Obsolete("This is obsolete, please use renderingLayerMaskNames instead.", false)]
- public string lightLayerName3;
- /// <summary>Name for light layer 4.</summary>
- [Obsolete("This is obsolete, please use renderingLayerMaskNames instead.", false)]
- public string lightLayerName4;
- /// <summary>Name for light layer 5.</summary>
- [Obsolete("This is obsolete, please use renderingLayerMaskNames instead.", false)]
- public string lightLayerName5;
- /// <summary>Name for light layer 6.</summary>
- [Obsolete("This is obsolete, please use renderingLayerMaskNames instead.", false)]
- public string lightLayerName6;
- /// <summary>Name for light layer 7.</summary>
- [Obsolete("This is obsolete, please use renderingLayerNames instead.", false)]
- public string lightLayerName7;
-
- /// <summary>
- /// Names used for display of light layers.
- /// </summary>
- [Obsolete("This is obsolete, please use renderingLayerMaskNames instead.", false)]
- public string[] lightLayerNames => new string[0];
-
- internal void ResetRenderingLayerNames()
- {
- m_RenderingLayerNames = new string[] { "Default"};
- }
-
- #endregion
-
- #pragma warning disable 618
- #pragma warning disable 612
- #region APV
- // This is temporarily here until we have a core place to put it shared between pipelines.
- [SerializeField]
- internal ProbeVolumeSceneData apvScenesData;
-
- internal ProbeVolumeSceneData GetOrCreateAPVSceneData()
- {
- if (apvScenesData == null)
- apvScenesData = new ProbeVolumeSceneData(this);
-
- apvScenesData.SetParentObject(this);
- return apvScenesData;
- }
- #pragma warning restore 612
- #pragma warning restore 618
-
- #endregion
- }
- }
|