Nessuna descrizione
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

UniversalRenderPipelineGlobalSettings.cs 17KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380
  1. using System;
  2. using System.IO;
  3. using System.ComponentModel;
  4. using System.Collections.Generic;
  5. using UnityEngine.Serialization;
  6. #if UNITY_EDITOR
  7. using UnityEditor;
  8. using UnityEditor.Rendering;
  9. #endif
  10. namespace UnityEngine.Rendering.Universal
  11. {
  12. /// <summary>
  13. /// Universal Render Pipeline's Global Settings.
  14. /// Global settings are unique per Render Pipeline type. In URP, Global Settings contain:
  15. /// - light layer names
  16. /// </summary>
  17. [URPHelpURL("urp-global-settings")]
  18. [DisplayInfo(name = "URP Global Settings Asset", order = CoreUtils.Sections.section4 + 2)]
  19. [SupportedOnRenderPipeline(typeof(UniversalRenderPipelineAsset))]
  20. [DisplayName("URP")]
  21. partial class UniversalRenderPipelineGlobalSettings : RenderPipelineGlobalSettings<UniversalRenderPipelineGlobalSettings, UniversalRenderPipeline>
  22. {
  23. [SerializeField] RenderPipelineGraphicsSettingsContainer m_Settings = new();
  24. protected override List<IRenderPipelineGraphicsSettings> settingsList => m_Settings.settingsList;
  25. #region Version system
  26. internal bool IsAtLastVersion() => k_LastVersion == m_AssetVersion;
  27. internal const int k_LastVersion = 8;
  28. #pragma warning disable CS0414
  29. [SerializeField][FormerlySerializedAs("k_AssetVersion")]
  30. internal int m_AssetVersion = k_LastVersion;
  31. #pragma warning restore CS0414
  32. #if UNITY_EDITOR
  33. public static void UpgradeAsset(int assetInstanceID)
  34. {
  35. if (EditorUtility.InstanceIDToObject(assetInstanceID) is not UniversalRenderPipelineGlobalSettings asset)
  36. return;
  37. int assetVersionBeforeUpgrade = asset.m_AssetVersion;
  38. if (asset.m_AssetVersion < 2)
  39. {
  40. #pragma warning disable 618 // Obsolete warning
  41. // Renamed supportRuntimeDebugDisplay => m_StripDebugVariants, which results in inverted logic
  42. asset.m_StripDebugVariants = !asset.supportRuntimeDebugDisplay;
  43. asset.m_AssetVersion = 2;
  44. #pragma warning restore 618 // Obsolete warning
  45. // For old test projects lets keep post processing stripping enabled, as huge chance they did not used runtime profile creating
  46. #if UNITY_INCLUDE_TESTS
  47. #pragma warning disable 618 // Obsolete warning
  48. asset.m_StripUnusedPostProcessingVariants = true;
  49. #pragma warning restore 618 // Obsolete warning
  50. #endif
  51. }
  52. if (asset.m_AssetVersion < 3)
  53. {
  54. int index = 0;
  55. asset.m_RenderingLayerNames = new string[8];
  56. #pragma warning disable 618 // Obsolete warning
  57. asset.m_RenderingLayerNames[index++] = asset.lightLayerName0;
  58. asset.m_RenderingLayerNames[index++] = asset.lightLayerName1;
  59. asset.m_RenderingLayerNames[index++] = asset.lightLayerName2;
  60. asset.m_RenderingLayerNames[index++] = asset.lightLayerName3;
  61. asset.m_RenderingLayerNames[index++] = asset.lightLayerName4;
  62. asset.m_RenderingLayerNames[index++] = asset.lightLayerName5;
  63. asset.m_RenderingLayerNames[index++] = asset.lightLayerName6;
  64. asset.m_RenderingLayerNames[index++] = asset.lightLayerName7;
  65. #pragma warning restore 618 // Obsolete warning
  66. asset.m_AssetVersion = 3;
  67. DecalProjector.UpdateAllDecalProperties();
  68. }
  69. if (asset.m_AssetVersion < 4)
  70. {
  71. #pragma warning disable 618 // Type or member is obsolete
  72. asset.m_ShaderStrippingSetting.exportShaderVariants = asset.m_ExportShaderVariants;
  73. asset.m_ShaderStrippingSetting.shaderVariantLogLevel = asset.m_ShaderVariantLogLevel;
  74. asset.m_ShaderStrippingSetting.stripRuntimeDebugShaders = asset.m_StripDebugVariants;
  75. asset.m_URPShaderStrippingSetting.stripScreenCoordOverrideVariants = asset.m_StripScreenCoordOverrideVariants;
  76. asset.m_URPShaderStrippingSetting.stripUnusedPostProcessingVariants = asset.m_StripUnusedPostProcessingVariants;
  77. asset.m_URPShaderStrippingSetting.stripUnusedVariants = asset.m_StripUnusedVariants;
  78. #pragma warning restore 618
  79. asset.m_AssetVersion = 4;
  80. }
  81. if (asset.m_AssetVersion < 5)
  82. {
  83. #pragma warning disable 618 // Type or member is obsolete
  84. asset.m_ObsoleteDefaultVolumeProfile = GetOrCreateDefaultVolumeProfile(asset.m_ObsoleteDefaultVolumeProfile);
  85. #pragma warning restore 618 // Type or member is obsolete
  86. asset.m_AssetVersion = 5;
  87. }
  88. if (asset.m_AssetVersion < 6)
  89. {
  90. MigrateToRenderPipelineGraphicsSettings(asset);
  91. #pragma warning disable 618 // Type or member is obsolete
  92. asset.m_EnableRenderGraph = false;
  93. #pragma warning restore 618 // Type or member is obsolete
  94. asset.m_AssetVersion = 6;
  95. }
  96. if (asset.m_AssetVersion < 7)
  97. {
  98. #pragma warning disable 618 // Type or member is obsolete
  99. if (asset.m_RenderingLayerNames != null)
  100. {
  101. for (int i = 1; i < asset.m_RenderingLayerNames.Length; i++)
  102. {
  103. if (i >= RenderingLayerMask.GetRenderingLayerCount())
  104. RenderPipelineEditorUtility.TryAddRenderingLayerName("");
  105. var name = asset.m_RenderingLayerNames[i];
  106. if(string.IsNullOrWhiteSpace(name))
  107. continue;
  108. var currentLayerName = RenderingLayerMask.RenderingLayerToName(i);
  109. if (!string.IsNullOrWhiteSpace(currentLayerName))
  110. currentLayerName += $" - {name}";
  111. else
  112. currentLayerName = name;
  113. RenderPipelineEditorUtility.TrySetRenderingLayerName(i, currentLayerName);
  114. }
  115. }
  116. #pragma warning restore 618 // Type or member is obsolete
  117. asset.m_AssetVersion = 7;
  118. }
  119. // Reload PSDImporter and AsepriteImporter assets for 2D. Importers are triggered before graphics settings are loaded
  120. // This ensures affected assets dependent on default materials from graphics settings are loaded correctly
  121. if (asset.m_AssetVersion < 8)
  122. {
  123. var distinctGuids = AssetDatabase.FindAssets("", new[] { "Assets" });
  124. for (int i = 0; i < distinctGuids.Length; i++)
  125. {
  126. var path = AssetDatabase.GUIDToAssetPath(distinctGuids[i]);
  127. var assetExt = Path.GetExtension(path);
  128. if (assetExt == ".psb" || assetExt == ".psd" ||
  129. assetExt == ".ase" || assetExt == ".aseprite")
  130. AssetDatabase.ImportAsset(path);
  131. }
  132. asset.m_AssetVersion = 8;
  133. }
  134. // If the asset version has changed, means that a migration step has been executed
  135. if (assetVersionBeforeUpgrade != asset.m_AssetVersion)
  136. EditorUtility.SetDirty(asset);
  137. }
  138. public static void MigrateToRenderPipelineGraphicsSettings(UniversalRenderPipelineGlobalSettings data)
  139. {
  140. MigrateToShaderStrippingSetting(data);
  141. MigrateToURPShaderStrippingSetting(data);
  142. MigrateDefaultVolumeProfile(data);
  143. MigrateToRenderGraphSettings(data);
  144. }
  145. private static T GetOrCreateGraphicsSettings<T>(UniversalRenderPipelineGlobalSettings data)
  146. where T : class, IRenderPipelineGraphicsSettings, new()
  147. {
  148. T settings;
  149. if (data.TryGet(typeof(T), out var baseSettings))
  150. {
  151. settings = baseSettings as T;
  152. }
  153. else
  154. {
  155. settings = new T();
  156. data.Add(settings);
  157. }
  158. return settings;
  159. }
  160. static void MigrateToShaderStrippingSetting(UniversalRenderPipelineGlobalSettings data)
  161. {
  162. var shaderStrippingSetting = GetOrCreateGraphicsSettings<ShaderStrippingSetting>(data);
  163. #pragma warning disable 618 // Type or member is obsolete
  164. shaderStrippingSetting.shaderVariantLogLevel = data.m_ShaderStrippingSetting.shaderVariantLogLevel;
  165. shaderStrippingSetting.exportShaderVariants = data.m_ShaderStrippingSetting.exportShaderVariants;
  166. shaderStrippingSetting.stripRuntimeDebugShaders = data.m_ShaderStrippingSetting.stripRuntimeDebugShaders;
  167. #pragma warning restore 618
  168. }
  169. static void MigrateToRenderGraphSettings(UniversalRenderPipelineGlobalSettings data)
  170. {
  171. var rgSettings = GetOrCreateGraphicsSettings<RenderGraphSettings>(data);
  172. #pragma warning disable 618 // Type or member is obsolete
  173. rgSettings.enableRenderCompatibilityMode = !data.m_EnableRenderGraph;
  174. #pragma warning restore 618
  175. }
  176. static void MigrateToURPShaderStrippingSetting(UniversalRenderPipelineGlobalSettings data)
  177. {
  178. var urpShaderStrippingSetting = GetOrCreateGraphicsSettings<URPShaderStrippingSetting>(data);
  179. #pragma warning disable 618 // Type or member is obsolete
  180. urpShaderStrippingSetting.stripScreenCoordOverrideVariants = data.m_URPShaderStrippingSetting.stripScreenCoordOverrideVariants;
  181. urpShaderStrippingSetting.stripUnusedPostProcessingVariants = data.m_URPShaderStrippingSetting.stripUnusedPostProcessingVariants;
  182. urpShaderStrippingSetting.stripUnusedVariants = data.m_URPShaderStrippingSetting.stripUnusedVariants;
  183. #pragma warning restore 618
  184. }
  185. static void MigrateDefaultVolumeProfile(UniversalRenderPipelineGlobalSettings data)
  186. {
  187. #pragma warning disable 618 // Type or member is obsolete
  188. var defaultVolumeProfileSettings = GetOrCreateGraphicsSettings<URPDefaultVolumeProfileSettings>(data);
  189. defaultVolumeProfileSettings.volumeProfile = data.m_ObsoleteDefaultVolumeProfile;
  190. data.m_ObsoleteDefaultVolumeProfile = null; // Discard old reference after it is migrated
  191. #pragma warning restore 618 // Type or member is obsolete
  192. }
  193. #endif // #if UNITY_EDITOR
  194. #endregion
  195. /// <summary>Default name when creating an URP Global Settings asset.</summary>
  196. public const string defaultAssetName = "UniversalRenderPipelineGlobalSettings";
  197. #if UNITY_EDITOR
  198. internal static string defaultPath => $"Assets/{defaultAssetName}.asset";
  199. //Making sure there is at least one UniversalRenderPipelineGlobalSettings instance in the project
  200. internal static UniversalRenderPipelineGlobalSettings Ensure(bool canCreateNewAsset = true)
  201. {
  202. UniversalRenderPipelineGlobalSettings currentInstance = GraphicsSettings.
  203. GetSettingsForRenderPipeline<UniversalRenderPipeline>() as UniversalRenderPipelineGlobalSettings;
  204. if (RenderPipelineGlobalSettingsUtils.TryEnsure<UniversalRenderPipelineGlobalSettings, UniversalRenderPipeline>(ref currentInstance, defaultPath, canCreateNewAsset))
  205. {
  206. if (currentInstance != null && !currentInstance.IsAtLastVersion())
  207. {
  208. UpgradeAsset(currentInstance.GetInstanceID());
  209. AssetDatabase.SaveAssetIfDirty(currentInstance);
  210. }
  211. return currentInstance;
  212. }
  213. return null;
  214. }
  215. public override void Initialize(RenderPipelineGlobalSettings source = null)
  216. {
  217. if (source is UniversalRenderPipelineGlobalSettings globalSettingsSource)
  218. Array.Copy(globalSettingsSource.m_RenderingLayerNames, m_RenderingLayerNames, globalSettingsSource.m_RenderingLayerNames.Length);
  219. // Note: RenderPipelineGraphicsSettings are not populated yet when the global settings asset is being
  220. // initialized, so create the setting before using it
  221. var defaultVolumeProfileSettings = GetOrCreateGraphicsSettings<URPDefaultVolumeProfileSettings>(this);
  222. defaultVolumeProfileSettings.volumeProfile = GetOrCreateDefaultVolumeProfile(defaultVolumeProfileSettings.volumeProfile);
  223. }
  224. #endif // #if UNITY_EDITOR
  225. /// <inheritdoc/>
  226. public override void Reset()
  227. {
  228. base.Reset();
  229. DecalProjector.UpdateAllDecalProperties();
  230. }
  231. internal static VolumeProfile GetOrCreateDefaultVolumeProfile(VolumeProfile defaultVolumeProfile)
  232. {
  233. #if UNITY_EDITOR
  234. if (defaultVolumeProfile == null || defaultVolumeProfile.Equals(null))
  235. {
  236. const string k_DefaultVolumeProfileName = "DefaultVolumeProfile";
  237. const string k_DefaultVolumeProfilePath = "Assets/" + k_DefaultVolumeProfileName + ".asset";
  238. defaultVolumeProfile = CreateInstance<VolumeProfile>();
  239. Debug.Assert(defaultVolumeProfile);
  240. defaultVolumeProfile.name = k_DefaultVolumeProfileName;
  241. AssetDatabase.CreateAsset(defaultVolumeProfile, k_DefaultVolumeProfilePath);
  242. AssetDatabase.SaveAssetIfDirty(defaultVolumeProfile);
  243. AssetDatabase.Refresh();
  244. if (VolumeManager.instance.isInitialized && RenderPipelineManager.currentPipeline is UniversalRenderPipeline)
  245. VolumeManager.instance.SetGlobalDefaultProfile(defaultVolumeProfile);
  246. }
  247. #endif
  248. return defaultVolumeProfile;
  249. }
  250. [SerializeField, FormerlySerializedAs("m_DefaultVolumeProfile")]
  251. [Obsolete("Kept For Migration. #from(2023.3)")]
  252. internal VolumeProfile m_ObsoleteDefaultVolumeProfile;
  253. [SerializeField]
  254. internal string[] m_RenderingLayerNames = new string[] { "Default" };
  255. [SerializeField]
  256. uint m_ValidRenderingLayers;
  257. /// <summary>
  258. /// Names used for display of light layers with Layer's index as prefix.
  259. /// For example: "0: Light Layer Default"
  260. /// </summary>
  261. [Obsolete("This is obsolete, please use prefixedRenderingLayerMaskNames instead.", true)]
  262. public string[] prefixedLightLayerNames => new string[0];
  263. #region Light Layer Names [3D]
  264. /// <summary>Name for light layer 0.</summary>
  265. [Obsolete("This is obsolete, please use renderingLayerMaskNames instead.", false)]
  266. public string lightLayerName0;
  267. /// <summary>Name for light layer 1.</summary>
  268. [Obsolete("This is obsolete, please use renderingLayerMaskNames instead.", false)]
  269. public string lightLayerName1;
  270. /// <summary>Name for light layer 2.</summary>
  271. [Obsolete("This is obsolete, please use renderingLayerMaskNames instead.", false)]
  272. public string lightLayerName2;
  273. /// <summary>Name for light layer 3.</summary>
  274. [Obsolete("This is obsolete, please use renderingLayerMaskNames instead.", false)]
  275. public string lightLayerName3;
  276. /// <summary>Name for light layer 4.</summary>
  277. [Obsolete("This is obsolete, please use renderingLayerMaskNames instead.", false)]
  278. public string lightLayerName4;
  279. /// <summary>Name for light layer 5.</summary>
  280. [Obsolete("This is obsolete, please use renderingLayerMaskNames instead.", false)]
  281. public string lightLayerName5;
  282. /// <summary>Name for light layer 6.</summary>
  283. [Obsolete("This is obsolete, please use renderingLayerMaskNames instead.", false)]
  284. public string lightLayerName6;
  285. /// <summary>Name for light layer 7.</summary>
  286. [Obsolete("This is obsolete, please use renderingLayerNames instead.", false)]
  287. public string lightLayerName7;
  288. /// <summary>
  289. /// Names used for display of light layers.
  290. /// </summary>
  291. [Obsolete("This is obsolete, please use renderingLayerMaskNames instead.", false)]
  292. public string[] lightLayerNames => new string[0];
  293. internal void ResetRenderingLayerNames()
  294. {
  295. m_RenderingLayerNames = new string[] { "Default"};
  296. }
  297. #endregion
  298. #pragma warning disable 618
  299. #pragma warning disable 612
  300. #region APV
  301. // This is temporarily here until we have a core place to put it shared between pipelines.
  302. [SerializeField]
  303. internal ProbeVolumeSceneData apvScenesData;
  304. internal ProbeVolumeSceneData GetOrCreateAPVSceneData()
  305. {
  306. if (apvScenesData == null)
  307. apvScenesData = new ProbeVolumeSceneData(this);
  308. apvScenesData.SetParentObject(this);
  309. return apvScenesData;
  310. }
  311. #pragma warning restore 612
  312. #pragma warning restore 618
  313. #endregion
  314. }
  315. }