123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349 |
- using System;
- using UnityEditor;
- using UnityEngine.Serialization;
- 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")]
- partial class UniversalRenderPipelineGlobalSettings : RenderPipelineGlobalSettings, ISerializationCallbackReceiver
- {
- #region Version system
- #pragma warning disable CS0414
- [SerializeField] int k_AssetVersion = 2;
- #pragma warning restore CS0414
- public void OnBeforeSerialize()
- {
- }
- public void OnAfterDeserialize()
- {
- #if UNITY_EDITOR
- if (k_AssetVersion != 2)
- {
- EditorApplication.delayCall += () => UpgradeAsset(this.GetInstanceID());
- }
- #endif
- }
- #if UNITY_EDITOR
- static void UpgradeAsset(int assetInstanceID)
- {
- UniversalRenderPipelineGlobalSettings asset = EditorUtility.InstanceIDToObject(assetInstanceID) as UniversalRenderPipelineGlobalSettings;
- if (asset.k_AssetVersion < 2)
- {
- #pragma warning disable 618 // Obsolete warning
- // Renamed supportRuntimeDebugDisplay => stripDebugVariants, which results in inverted logic
- asset.m_StripDebugVariants = !asset.supportRuntimeDebugDisplay;
- asset.k_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
- asset.m_StripUnusedPostProcessingVariants = true;
- #endif
- }
- EditorUtility.SetDirty(asset);
- }
- #endif
- #endregion
- private static UniversalRenderPipelineGlobalSettings cachedInstance = null;
- /// <summary>
- /// Active URP Global Settings asset. If the value is null then no UniversalRenderPipelineGlobalSettings has been registered to the Graphics Settings with the UniversalRenderPipeline.
- /// </summary>
- public static UniversalRenderPipelineGlobalSettings instance
- {
- get
- {
- #if !UNITY_EDITOR
- // The URP Global Settings could have been changed by script, undo/redo (case 1342987), or file update - file versioning, let us make sure we display the correct one
- // In a Player, we do not need to worry about those changes as we only support loading one
- if (cachedInstance == null)
- #endif
- cachedInstance = GraphicsSettings.GetSettingsForRenderPipeline<UniversalRenderPipeline>() as UniversalRenderPipelineGlobalSettings;
- return cachedInstance;
- }
- }
- static internal void UpdateGraphicsSettings(UniversalRenderPipelineGlobalSettings newSettings)
- {
- if (newSettings == cachedInstance)
- return;
- if (newSettings != null)
- GraphicsSettings.RegisterRenderPipelineSettings<UniversalRenderPipeline>(newSettings as RenderPipelineGlobalSettings);
- else
- GraphicsSettings.UnregisterRenderPipelineSettings<UniversalRenderPipeline>();
- cachedInstance = newSettings;
- }
- /// <summary>Default name when creating an URP Global Settings asset.</summary>
- public static readonly string defaultAssetName = "UniversalRenderPipelineGlobalSettings";
- #if UNITY_EDITOR
- //Making sure there is at least one UniversalRenderPipelineGlobalSettings instance in the project
- internal static UniversalRenderPipelineGlobalSettings Ensure(string folderPath = "", bool canCreateNewAsset = true)
- {
- if (UniversalRenderPipelineGlobalSettings.instance)
- return UniversalRenderPipelineGlobalSettings.instance;
- UniversalRenderPipelineGlobalSettings assetCreated = null;
- string path = $"Assets/{folderPath}/{defaultAssetName}.asset";
- assetCreated = AssetDatabase.LoadAssetAtPath<UniversalRenderPipelineGlobalSettings>(path);
- if (assetCreated == null)
- {
- var guidGlobalSettingsAssets = AssetDatabase.FindAssets("t:UniversalRenderPipelineGlobalSettings");
- //If we could not find the asset at the default path, find the first one
- if (guidGlobalSettingsAssets.Length > 0)
- {
- var curGUID = guidGlobalSettingsAssets[0];
- path = AssetDatabase.GUIDToAssetPath(curGUID);
- assetCreated = AssetDatabase.LoadAssetAtPath<UniversalRenderPipelineGlobalSettings>(path);
- }
- else if (canCreateNewAsset)// or create one altogether
- {
- if (!AssetDatabase.IsValidFolder("Assets/" + folderPath))
- AssetDatabase.CreateFolder("Assets", folderPath);
- assetCreated = Create(path);
- // TODO: Reenable after next urp template is published
- //Debug.LogWarning("No URP Global Settings Asset is assigned. One will be created for you. If you want to modify it, go to Project Settings > Graphics > URP Settings.");
- }
- else
- {
- Debug.LogError("If you are building a Player, make sure to save an URP Global Settings asset by opening the project in the Editor first.");
- return null;
- }
- }
- Debug.Assert(assetCreated, "Could not create URP's Global Settings - URP may not work correctly - Open Project Settings > Graphics > URP Settings for additional help.");
- UpdateGraphicsSettings(assetCreated);
- return UniversalRenderPipelineGlobalSettings.instance;
- }
- internal static UniversalRenderPipelineGlobalSettings Create(string path, UniversalRenderPipelineGlobalSettings src = null)
- {
- UniversalRenderPipelineGlobalSettings assetCreated = null;
- // make sure the asset does not already exists
- assetCreated = AssetDatabase.LoadAssetAtPath<UniversalRenderPipelineGlobalSettings>(path);
- if (assetCreated == null)
- {
- assetCreated = ScriptableObject.CreateInstance<UniversalRenderPipelineGlobalSettings>();
- if (assetCreated != null)
- {
- assetCreated.name = System.IO.Path.GetFileName(path);
- }
- AssetDatabase.CreateAsset(assetCreated, path);
- Debug.Assert(assetCreated);
- }
- if (assetCreated)
- {
- if (src != null)
- {
- assetCreated.lightLayerName0 = System.String.Copy(src.lightLayerName0);
- assetCreated.lightLayerName1 = System.String.Copy(src.lightLayerName1);
- assetCreated.lightLayerName2 = System.String.Copy(src.lightLayerName2);
- assetCreated.lightLayerName3 = System.String.Copy(src.lightLayerName3);
- assetCreated.lightLayerName4 = System.String.Copy(src.lightLayerName4);
- assetCreated.lightLayerName5 = System.String.Copy(src.lightLayerName5);
- assetCreated.lightLayerName6 = System.String.Copy(src.lightLayerName6);
- assetCreated.lightLayerName7 = System.String.Copy(src.lightLayerName7);
- }
- AssetDatabase.SaveAssets();
- AssetDatabase.Refresh();
- }
- return assetCreated;
- }
- #endif
- void Reset()
- {
- UpdateRenderingLayerNames();
- }
- [System.NonSerialized]
- string[] m_RenderingLayerNames;
- string[] renderingLayerNames
- {
- get
- {
- if (m_RenderingLayerNames == null)
- UpdateRenderingLayerNames();
- return m_RenderingLayerNames;
- }
- }
- [System.NonSerialized]
- string[] m_PrefixedRenderingLayerNames;
- string[] prefixedRenderingLayerNames
- {
- get
- {
- if (m_PrefixedRenderingLayerNames == null)
- UpdateRenderingLayerNames();
- return m_PrefixedRenderingLayerNames;
- }
- }
- /// <summary>Names used for display of rendering layer masks.</summary>
- public string[] renderingLayerMaskNames => renderingLayerNames;
- /// <summary>Names used for display of rendering layer masks with a prefix.</summary>
- public string[] prefixedRenderingLayerMaskNames => prefixedRenderingLayerNames;
- /// <summary>Regenerate Rendering Layer names and their prefixed versions.</summary>
- internal void UpdateRenderingLayerNames()
- {
- if (m_RenderingLayerNames == null)
- m_RenderingLayerNames = new string[32];
- int index = 0;
- m_RenderingLayerNames[index++] = lightLayerName0;
- m_RenderingLayerNames[index++] = lightLayerName1;
- m_RenderingLayerNames[index++] = lightLayerName2;
- m_RenderingLayerNames[index++] = lightLayerName3;
- m_RenderingLayerNames[index++] = lightLayerName4;
- m_RenderingLayerNames[index++] = lightLayerName5;
- m_RenderingLayerNames[index++] = lightLayerName6;
- m_RenderingLayerNames[index++] = lightLayerName7;
- // Unused
- for (int i = index; i < m_RenderingLayerNames.Length; ++i)
- {
- m_RenderingLayerNames[i] = string.Format("Unused {0}", i);
- }
- // Update prefixed
- if (m_PrefixedRenderingLayerNames == null)
- m_PrefixedRenderingLayerNames = new string[32];
- if (m_PrefixedLightLayerNames == null)
- m_PrefixedLightLayerNames = new string[8];
- for (int i = 0; i < m_PrefixedRenderingLayerNames.Length; ++i)
- {
- m_PrefixedRenderingLayerNames[i] = string.Format("{0}: {1}", i, m_RenderingLayerNames[i]);
- if (i < 8)
- m_PrefixedLightLayerNames[i] = m_PrefixedRenderingLayerNames[i];
- }
- }
- [System.NonSerialized]
- string[] m_PrefixedLightLayerNames = null;
- /// <summary>
- /// Names used for display of light layers with Layer's index as prefix.
- /// For example: "0: Light Layer Default"
- /// </summary>
- public string[] prefixedLightLayerNames
- {
- get
- {
- if (m_PrefixedLightLayerNames == null)
- UpdateRenderingLayerNames();
- return m_PrefixedLightLayerNames;
- }
- }
- #region Light Layer Names [3D]
- static readonly string[] k_DefaultLightLayerNames = { "Light Layer default", "Light Layer 1", "Light Layer 2", "Light Layer 3", "Light Layer 4", "Light Layer 5", "Light Layer 6", "Light Layer 7" };
- /// <summary>Name for light layer 0.</summary>
- public string lightLayerName0 = k_DefaultLightLayerNames[0];
- /// <summary>Name for light layer 1.</summary>
- public string lightLayerName1 = k_DefaultLightLayerNames[1];
- /// <summary>Name for light layer 2.</summary>
- public string lightLayerName2 = k_DefaultLightLayerNames[2];
- /// <summary>Name for light layer 3.</summary>
- public string lightLayerName3 = k_DefaultLightLayerNames[3];
- /// <summary>Name for light layer 4.</summary>
- public string lightLayerName4 = k_DefaultLightLayerNames[4];
- /// <summary>Name for light layer 5.</summary>
- public string lightLayerName5 = k_DefaultLightLayerNames[5];
- /// <summary>Name for light layer 6.</summary>
- public string lightLayerName6 = k_DefaultLightLayerNames[6];
- /// <summary>Name for light layer 7.</summary>
- public string lightLayerName7 = k_DefaultLightLayerNames[7];
- [System.NonSerialized]
- string[] m_LightLayerNames = null;
- /// <summary>
- /// Names used for display of light layers.
- /// </summary>
- public string[] lightLayerNames
- {
- get
- {
- if (m_LightLayerNames == null)
- {
- m_LightLayerNames = new string[8];
- }
- m_LightLayerNames[0] = lightLayerName0;
- m_LightLayerNames[1] = lightLayerName1;
- m_LightLayerNames[2] = lightLayerName2;
- m_LightLayerNames[3] = lightLayerName3;
- m_LightLayerNames[4] = lightLayerName4;
- m_LightLayerNames[5] = lightLayerName5;
- m_LightLayerNames[6] = lightLayerName6;
- m_LightLayerNames[7] = lightLayerName7;
- return m_LightLayerNames;
- }
- }
- internal void ResetRenderingLayerNames()
- {
- lightLayerName0 = k_DefaultLightLayerNames[0];
- lightLayerName1 = k_DefaultLightLayerNames[1];
- lightLayerName2 = k_DefaultLightLayerNames[2];
- lightLayerName3 = k_DefaultLightLayerNames[3];
- lightLayerName4 = k_DefaultLightLayerNames[4];
- lightLayerName5 = k_DefaultLightLayerNames[5];
- lightLayerName6 = k_DefaultLightLayerNames[6];
- lightLayerName7 = k_DefaultLightLayerNames[7];
- }
- #endregion
- #region Misc Settings
- [SerializeField] bool m_StripDebugVariants = true;
- [SerializeField] bool m_StripUnusedPostProcessingVariants = false;
- [SerializeField] bool m_StripUnusedVariants = true;
- /// <summary>
- /// Controls whether debug display shaders for Rendering Debugger are available in Player builds.
- /// </summary>
- [Obsolete("Please use stripRuntimeDebugShaders instead.", false)]
- public bool supportRuntimeDebugDisplay = false;
- /// <summary>
- /// Controls whether debug display shaders for Rendering Debugger are available in Player builds.
- /// </summary>
- public bool stripDebugVariants { get => m_StripDebugVariants; set { m_StripDebugVariants = value; } }
- /// <summary>
- /// Controls whether strips automatically post processing shader variants based on <see cref="VolumeProfile"/> components.
- /// It strips based on VolumeProfiles in project and not scenes that actually uses it.
- /// </summary>
- public bool stripUnusedPostProcessingVariants { get => m_StripUnusedPostProcessingVariants; set { m_StripUnusedPostProcessingVariants = value; } }
- /// <summary>
- /// Controls whether strip off variants if the feature is enabled.
- /// </summary>
- public bool stripUnusedVariants { get => m_StripUnusedVariants; set { m_StripUnusedVariants = value; } }
- #endregion
- }
- }
|