using System; using System.Collections.Generic; //needed for list of Custom Post Processes injections using UnityEngine.Serialization; using System.Linq; #if UNITY_EDITOR using UnityEditor; using UnityEditor.Rendering; using UnityEditor.PackageManager; #endif namespace UnityEngine.Rendering.HighDefinition { public partial class HDRenderPipelineAsset : IVersionable, IMigratableAsset { // /!\ For each new version, you must now upgrade asset in HDRP_Runtime, HDRP_Performance and SRP_SmokeTest test project. internal enum Version { None, First, UpgradeFrameSettingsToStruct, AddAfterPostProcessFrameSetting, AddFrameSettingSpecularLighting = 5, // Not used anymore - don't removed the number AddReflectionSettings, AddPostProcessFrameSettings, AddRayTracingFrameSettings, AddFrameSettingDirectSpecularLighting, AddCustomPostprocessAndCustomPass, ScalableSettingsRefactor, ShadowFilteringVeryHighQualityRemoval, SeparateColorGradingAndTonemappingFrameSettings, ReplaceTextureArraysByAtlasForCookieAndPlanar, AddedAdaptiveSSS, RemoveCookieCubeAtlasToOctahedral2D, RoughDistortion, VirtualTexturing, AddedHDRenderPipelineGlobalSettings, DecalSurfaceGradient, RemovalOfUpscaleFilter, CombinedPlanarAndCubemapReflectionAtlases, APVByDefault, MergeDitheringAndLODQualitySetting, UpdatedUpscalers, // If you add more steps here, do not clear settings that are used for the migration to the HDRP Global Settings asset } #region Migration steps private static readonly MigrationDescription k_Migration = MigrationDescription.New( MigrationStep.New(Version.UpgradeFrameSettingsToStruct, (HDRenderPipelineAsset data) => { #pragma warning disable 618 // Type or member is obsolete FrameSettingsOverrideMask unusedMaskForDefault = new FrameSettingsOverrideMask(); if (data.m_ObsoleteFrameSettings != null) FrameSettings.MigrateFromClassVersion(ref data.m_ObsoleteFrameSettings, ref data.m_ObsoleteFrameSettingsMovedToDefaultSettings, ref unusedMaskForDefault); if (data.m_ObsoleteBakedOrCustomReflectionFrameSettings != null) FrameSettings.MigrateFromClassVersion(ref data.m_ObsoleteBakedOrCustomReflectionFrameSettings, ref data.m_ObsoleteBakedOrCustomReflectionFrameSettingsMovedToDefaultSettings, ref unusedMaskForDefault); if (data.m_ObsoleteRealtimeReflectionFrameSettings != null) FrameSettings.MigrateFromClassVersion(ref data.m_ObsoleteRealtimeReflectionFrameSettings, ref data.m_ObsoleteRealtimeReflectionFrameSettingsMovedToDefaultSettings, ref unusedMaskForDefault); #pragma warning restore 618 }), MigrationStep.New(Version.AddAfterPostProcessFrameSetting, (HDRenderPipelineAsset data) => { #pragma warning disable 618 // Type or member is obsolete FrameSettings.MigrateToAfterPostprocess(ref data.m_ObsoleteFrameSettingsMovedToDefaultSettings); #pragma warning restore 618 }), MigrationStep.New(Version.AddReflectionSettings, (HDRenderPipelineAsset data) => { #pragma warning disable 618 // Type or member is obsolete FrameSettings.MigrateToDefaultReflectionSettings(ref data.m_ObsoleteFrameSettingsMovedToDefaultSettings); FrameSettings.MigrateToNoReflectionSettings(ref data.m_ObsoleteBakedOrCustomReflectionFrameSettingsMovedToDefaultSettings); FrameSettings.MigrateToNoReflectionRealtimeSettings(ref data.m_ObsoleteRealtimeReflectionFrameSettingsMovedToDefaultSettings); #pragma warning restore 618 }), MigrationStep.New(Version.AddPostProcessFrameSettings, (HDRenderPipelineAsset data) => { #pragma warning disable 618 // Type or member is obsolete FrameSettings.MigrateToPostProcess(ref data.m_ObsoleteFrameSettingsMovedToDefaultSettings); #pragma warning restore 618 }), MigrationStep.New(Version.AddRayTracingFrameSettings, (HDRenderPipelineAsset data) => { #pragma warning disable 618 // Type or member is obsolete FrameSettings.MigrateToRayTracing(ref data.m_ObsoleteFrameSettingsMovedToDefaultSettings); #pragma warning restore 618 }), MigrationStep.New(Version.AddFrameSettingDirectSpecularLighting, (HDRenderPipelineAsset data) => { #pragma warning disable 618 // Type or member is obsolete FrameSettings.MigrateToDirectSpecularLighting(ref data.m_ObsoleteFrameSettingsMovedToDefaultSettings); FrameSettings.MigrateToNoDirectSpecularLighting(ref data.m_ObsoleteBakedOrCustomReflectionFrameSettingsMovedToDefaultSettings); FrameSettings.MigrateToDirectSpecularLighting(ref data.m_ObsoleteRealtimeReflectionFrameSettingsMovedToDefaultSettings); #pragma warning restore 618 }), MigrationStep.New(Version.AddCustomPostprocessAndCustomPass, (HDRenderPipelineAsset data) => { #pragma warning disable 618 // Type or member is obsolete FrameSettings.MigrateToCustomPostprocessAndCustomPass(ref data.m_ObsoleteFrameSettingsMovedToDefaultSettings); #pragma warning restore 618 }), MigrationStep.New(Version.ScalableSettingsRefactor, (HDRenderPipelineAsset data) => { ref var shadowInit = ref data.m_RenderPipelineSettings.hdShadowInitParams; shadowInit.shadowResolutionArea.schemaId = ScalableSettingSchemaId.With4Levels; shadowInit.shadowResolutionDirectional.schemaId = ScalableSettingSchemaId.With4Levels; shadowInit.shadowResolutionPunctual.schemaId = ScalableSettingSchemaId.With4Levels; }), MigrationStep.New(Version.ShadowFilteringVeryHighQualityRemoval, (HDRenderPipelineAsset data) => { ref var shadowInit = ref data.m_RenderPipelineSettings.hdShadowInitParams; shadowInit.punctualShadowFilteringQuality = shadowInit.punctualShadowFilteringQuality > HDShadowFilteringQuality.High ? HDShadowFilteringQuality.High : shadowInit.punctualShadowFilteringQuality; shadowInit.directionalShadowFilteringQuality = shadowInit.directionalShadowFilteringQuality > HDShadowFilteringQuality.High ? HDShadowFilteringQuality.High : shadowInit.directionalShadowFilteringQuality; }), MigrationStep.New(Version.SeparateColorGradingAndTonemappingFrameSettings, (HDRenderPipelineAsset data) => { #pragma warning disable 618 // Type or member is obsolete FrameSettings.MigrateToSeparateColorGradingAndTonemapping(ref data.m_ObsoleteFrameSettingsMovedToDefaultSettings); #pragma warning restore 618 }), MigrationStep.New(Version.ReplaceTextureArraysByAtlasForCookieAndPlanar, (HDRenderPipelineAsset data) => { ref var lightLoopSettings = ref data.m_RenderPipelineSettings.lightLoopSettings; #pragma warning disable 618 // Type or member is obsolete float cookieAtlasSize = Mathf.Sqrt((int)lightLoopSettings.cookieAtlasSize * (int)lightLoopSettings.cookieAtlasSize * lightLoopSettings.cookieTexArraySize); float planarSize = Mathf.Sqrt((int)lightLoopSettings.planarReflectionAtlasSize * (int)lightLoopSettings.planarReflectionAtlasSize * lightLoopSettings.maxPlanarReflectionOnScreen); // The atlas only supports power of two sizes cookieAtlasSize = (float)Mathf.NextPowerOfTwo((int)cookieAtlasSize); planarSize = (float)Mathf.NextPowerOfTwo((int)planarSize); // Clamp to avoid too large atlases cookieAtlasSize = Mathf.Clamp(cookieAtlasSize, (int)CookieAtlasResolution.CookieResolution256, (int)CookieAtlasResolution.CookieResolution8192); planarSize = Mathf.Clamp(planarSize, (int)PlanarReflectionAtlasResolution.Resolution256, (int)PlanarReflectionAtlasResolution.Resolution8192); lightLoopSettings.cookieAtlasSize = (CookieAtlasResolution)cookieAtlasSize; lightLoopSettings.planarReflectionAtlasSize = (PlanarReflectionAtlasResolution)planarSize; #pragma warning restore 618 }), MigrationStep.New(Version.AddedAdaptiveSSS, (HDRenderPipelineAsset data) => { #pragma warning disable 618 // Type or member is obsolete bool previouslyHighQuality = data.m_RenderPipelineSettings.m_ObsoleteincreaseSssSampleCount; FrameSettings.MigrateSubsurfaceParams(ref data.m_ObsoleteFrameSettingsMovedToDefaultSettings, previouslyHighQuality); FrameSettings.MigrateSubsurfaceParams(ref data.m_ObsoleteBakedOrCustomReflectionFrameSettingsMovedToDefaultSettings, previouslyHighQuality); FrameSettings.MigrateSubsurfaceParams(ref data.m_ObsoleteRealtimeReflectionFrameSettingsMovedToDefaultSettings, previouslyHighQuality); #pragma warning restore 618 }), MigrationStep.New(Version.RemoveCookieCubeAtlasToOctahedral2D, (HDRenderPipelineAsset data) => { ref var lightLoopSettings = ref data.m_RenderPipelineSettings.lightLoopSettings; #pragma warning disable 618 // Type or member is obsolete float cookieAtlasSize = Mathf.Sqrt((int)lightLoopSettings.cookieAtlasSize * (int)lightLoopSettings.cookieAtlasSize * lightLoopSettings.cookieTexArraySize); float planarSize = Mathf.Sqrt((int)lightLoopSettings.planarReflectionAtlasSize * (int)lightLoopSettings.planarReflectionAtlasSize * lightLoopSettings.maxPlanarReflectionOnScreen); #pragma warning restore 618 Debug.Log("HDRP Internally changed the storage of Cube Cookie to use Octahedral Projection inside the 2D Cookie Atlas. It is recommended that you increase the size of the 2D Cookie Atlas if your cookies no longer fit. To fix this, select your HDRP Asset and in the Inspector, go to Lighting > Cookies. In the 2D Atlas Size drop-down, select a larger cookie resolution."); }), MigrationStep.New(Version.RoughDistortion, (HDRenderPipelineAsset data) => { #pragma warning disable 618 // Type or member is obsolete FrameSettings.MigrateRoughDistortion(ref data.m_ObsoleteFrameSettingsMovedToDefaultSettings); FrameSettings.MigrateRoughDistortion(ref data.m_ObsoleteBakedOrCustomReflectionFrameSettingsMovedToDefaultSettings); FrameSettings.MigrateRoughDistortion(ref data.m_ObsoleteRealtimeReflectionFrameSettingsMovedToDefaultSettings); #pragma warning restore 618 }), MigrationStep.New(Version.VirtualTexturing, (HDRenderPipelineAsset data) => { #pragma warning disable 618 // Type or member is obsolete FrameSettings.MigrateVirtualTexturing(ref data.m_ObsoleteFrameSettingsMovedToDefaultSettings); FrameSettings.MigrateVirtualTexturing(ref data.m_ObsoleteBakedOrCustomReflectionFrameSettingsMovedToDefaultSettings); FrameSettings.MigrateVirtualTexturing(ref data.m_ObsoleteRealtimeReflectionFrameSettingsMovedToDefaultSettings); #pragma warning restore 618 }), MigrationStep.New(Version.AddedHDRenderPipelineGlobalSettings, (HDRenderPipelineAsset data) => { #if UNITY_EDITOR if (data == GraphicsSettings.defaultRenderPipeline) HDRenderPipelineGlobalSettings.MigrateFromHDRPAsset(data); #endif #pragma warning disable 618 // Type or member is obsolete data.m_ObsoleteDefaultVolumeProfile = null; data.m_ObsoleteDefaultLookDevProfile = null; data.m_ObsoleteBeforeTransparentCustomPostProcesses = null; data.m_ObsoleteBeforePostProcessCustomPostProcesses = null; data.m_ObsoleteAfterPostProcessCustomPostProcesses = null; data.m_ObsoleteBeforeTAACustomPostProcesses = null; data.m_ObsoleteDiffusionProfileSettingsList = null; data.m_RenderPipelineSettings.m_ObsoleteLightLayerName0 = null; data.m_RenderPipelineSettings.m_ObsoleteLightLayerName1 = null; data.m_RenderPipelineSettings.m_ObsoleteLightLayerName2 = null; data.m_RenderPipelineSettings.m_ObsoleteLightLayerName3 = null; data.m_RenderPipelineSettings.m_ObsoleteLightLayerName4 = null; data.m_RenderPipelineSettings.m_ObsoleteLightLayerName5 = null; data.m_RenderPipelineSettings.m_ObsoleteLightLayerName6 = null; data.m_RenderPipelineSettings.m_ObsoleteLightLayerName7 = null; data.m_RenderPipelineSettings.m_ObsoleteDecalLayerName0 = null; data.m_RenderPipelineSettings.m_ObsoleteDecalLayerName1 = null; data.m_RenderPipelineSettings.m_ObsoleteDecalLayerName2 = null; data.m_RenderPipelineSettings.m_ObsoleteDecalLayerName3 = null; data.m_RenderPipelineSettings.m_ObsoleteDecalLayerName4 = null; data.m_RenderPipelineSettings.m_ObsoleteDecalLayerName5 = null; data.m_RenderPipelineSettings.m_ObsoleteDecalLayerName6 = null; data.m_RenderPipelineSettings.m_ObsoleteDecalLayerName7 = null; #pragma warning restore 618 }), MigrationStep.New(Version.DecalSurfaceGradient, (HDRenderPipelineAsset data) => { data.m_RenderPipelineSettings.supportSurfaceGradient = false; }), #pragma warning disable 618 // Type or member is obsolete MigrationStep.New(Version.RemovalOfUpscaleFilter, (HDRenderPipelineAsset data) => { if (data.m_RenderPipelineSettings.dynamicResolutionSettings.upsampleFilter == DynamicResUpscaleFilter.Bilinear) data.m_RenderPipelineSettings.dynamicResolutionSettings.upsampleFilter = DynamicResUpscaleFilter.CatmullRom; if (data.m_RenderPipelineSettings.dynamicResolutionSettings.upsampleFilter == DynamicResUpscaleFilter.Lanczos) data.m_RenderPipelineSettings.dynamicResolutionSettings.upsampleFilter = DynamicResUpscaleFilter.ContrastAdaptiveSharpen; }), #pragma warning restore 618 MigrationStep.New(Version.CombinedPlanarAndCubemapReflectionAtlases, (HDRenderPipelineAsset data) => { #pragma warning disable 618 // Type or member is obsolete ref var lightLoopSettings = ref data.m_RenderPipelineSettings.lightLoopSettings; CubeReflectionResolution cubeResolution = lightLoopSettings.reflectionCubemapSize; CubeReflectionResolution[] enumValues = (CubeReflectionResolution[])Enum.GetValues(typeof(CubeReflectionResolution)); int index = Mathf.Max(Array.IndexOf(enumValues, cubeResolution), 0); CubeReflectionResolution[] cubeResolutions = new CubeReflectionResolution[] { enumValues[Mathf.Min(index, enumValues.Length - 1)], enumValues[Mathf.Min(index + 1, enumValues.Length - 1)], enumValues[Mathf.Min(index + 2, enumValues.Length - 1)] }; data.m_RenderPipelineSettings.cubeReflectionResolution = new RenderPipelineSettings.ReflectionProbeResolutionScalableSetting(cubeResolutions, ScalableSettingSchemaId.With3Levels); int newCubeReflectionSize = ReflectionProbeTextureCache.GetReflectionProbeSizeInAtlas((int)lightLoopSettings.reflectionCubemapSize); int cubeReflectionAtlasArea = lightLoopSettings.reflectionProbeCacheSize * newCubeReflectionSize * newCubeReflectionSize; int planarReflectionAtlasArea = (int)lightLoopSettings.planarReflectionAtlasSize * (int)lightLoopSettings.planarReflectionAtlasSize; int totalNeededPixelCount = cubeReflectionAtlasArea + planarReflectionAtlasArea; // Set a default value for the reflection probe cache size in case we don't find a suitable atlas resolution (too many probes in upgraded atlas) lightLoopSettings.reflectionProbeTexCacheSize = ReflectionProbeTextureCacheResolution.Resolution16384x16384; // Find closes pixel count in the ReflectionProbeTextureCacheResolution enum: var availableResolutions = Enum.GetValues(typeof(ReflectionProbeTextureCacheResolution)).Cast(); foreach (ReflectionProbeTextureCacheResolution res in availableResolutions.OrderBy(r => (int)r & 0xFFFF)) { int height = (int)res & 0xFFFF; int width = (int)res >> 16; if (width == 0) width = height; int currentPixelCount = width * height; if (currentPixelCount >= totalNeededPixelCount) { lightLoopSettings.reflectionProbeTexCacheSize = res; break; } } lightLoopSettings.maxCubeReflectionOnScreen = Mathf.Clamp(lightLoopSettings.maxEnvLightsOnScreen - lightLoopSettings.maxPlanarReflectionOnScreen, HDRenderPipeline.k_MaxCubeReflectionsOnScreen / 2, HDRenderPipeline.k_MaxCubeReflectionsOnScreen); }), #pragma warning restore 618 MigrationStep.New(Version.APVByDefault, (HDRenderPipelineAsset data) => { #pragma warning disable 618 // Type or member is obsolete if (!data.m_RenderPipelineSettings.oldSupportProbeVolume) { data.m_RenderPipelineSettings.lightProbeSystem = RenderPipelineSettings.LightProbeSystem.LegacyLightProbes; } if (data.m_RenderPipelineSettings.oldSupportProbeVolume || data.m_RenderPipelineSettings.oldLightProbeSystem == RenderPipelineSettings.LightProbeSystem.AdaptiveProbeVolumes) { data.m_RenderPipelineSettings.lightProbeSystem = RenderPipelineSettings.LightProbeSystem.AdaptiveProbeVolumes; } }), #pragma warning restore 618 MigrationStep.New(Version.MergeDitheringAndLODQualitySetting, (HDRenderPipelineAsset data) => { #pragma warning disable 618 // Type or member is obsolete if (!data.m_RenderPipelineSettings.supportDitheringCrossFade) return; QualitySettings.ForEach(() => { if (QualitySettings.renderPipeline == data) { QualitySettings.enableLODCrossFade = true; } }); }), #pragma warning restore 618 MigrationStep.New(Version.UpdatedUpscalers, (HDRenderPipelineAsset data) => { data.m_RenderPipelineSettings.dynamicResolutionSettings.advancedUpscalersByPriority.Clear(); #pragma warning disable 618 // Type or member is obsolete if(!data.m_RenderPipelineSettings.dynamicResolutionSettings.enableDLSS) return; data.m_RenderPipelineSettings.dynamicResolutionSettings.enableDLSS = false; #pragma warning restore 618 data.m_RenderPipelineSettings.dynamicResolutionSettings.advancedUpscalersByPriority.Add(AdvancedUpscalers.DLSS); }) ); #endregion [SerializeField] internal Version m_Version = MigrationDescription.LastVersion(); Version IVersionable.version { get => m_Version; set => m_Version = value; } #pragma warning disable 618 // Type or member is obsolete #region FrameSettings Moved [SerializeField] [FormerlySerializedAs("serializedFrameSettings"), FormerlySerializedAs("m_FrameSettings"), Obsolete("For data migration")] ObsoleteFrameSettings m_ObsoleteFrameSettings; [SerializeField] [FormerlySerializedAs("m_BakedOrCustomReflectionFrameSettings"), Obsolete("For data migration")] ObsoleteFrameSettings m_ObsoleteBakedOrCustomReflectionFrameSettings; [SerializeField] [FormerlySerializedAs("m_RealtimeReflectionFrameSettings"), Obsolete("For data migration")] ObsoleteFrameSettings m_ObsoleteRealtimeReflectionFrameSettings; #endregion #region Settings Moved from the HDRP Asset to HDRenderPipelineGlobalSettings [SerializeField] [FormerlySerializedAs("m_DefaultVolumeProfile"), Obsolete("Moved from HDRPAsset to HDGlobal Settings")] internal VolumeProfile m_ObsoleteDefaultVolumeProfile; [SerializeField] [FormerlySerializedAs("m_DefaultLookDevProfile"), Obsolete("Moved from HDRPAsset to HDGlobal Settings")] internal VolumeProfile m_ObsoleteDefaultLookDevProfile; [SerializeField] [FormerlySerializedAs("m_RenderingPathDefaultCameraFrameSettings"), Obsolete("Moved from HDRPAsset to HDGlobal Settings")] internal FrameSettings m_ObsoleteFrameSettingsMovedToDefaultSettings; [SerializeField] [FormerlySerializedAs("m_RenderingPathDefaultBakedOrCustomReflectionFrameSettings"), Obsolete("Moved from HDRPAsset to HDGlobal Settings")] internal FrameSettings m_ObsoleteBakedOrCustomReflectionFrameSettingsMovedToDefaultSettings; [SerializeField] [FormerlySerializedAs("m_RenderingPathDefaultRealtimeReflectionFrameSettings"), Obsolete("Moved from HDRPAsset to HDGlobal Settings")] internal FrameSettings m_ObsoleteRealtimeReflectionFrameSettingsMovedToDefaultSettings; [SerializeField] [FormerlySerializedAs("beforeTransparentCustomPostProcesses"), Obsolete("Moved from HDRPAsset to HDGlobal Settings")] internal List m_ObsoleteBeforeTransparentCustomPostProcesses; [SerializeField] [FormerlySerializedAs("beforePostProcessCustomPostProcesses"), Obsolete("Moved from HDRPAsset to HDGlobal Settings")] internal List m_ObsoleteBeforePostProcessCustomPostProcesses; [SerializeField] [FormerlySerializedAs("afterPostProcessCustomPostProcesses"), Obsolete("Moved from HDRPAsset to HDGlobal Settings")] internal List m_ObsoleteAfterPostProcessCustomPostProcesses; [SerializeField] [FormerlySerializedAs("beforeTAACustomPostProcesses"), Obsolete("Moved from HDRPAsset to HDGlobal Settings")] internal List m_ObsoleteBeforeTAACustomPostProcesses; [SerializeField] [FormerlySerializedAs("shaderVariantLogLevel"), Obsolete("Moved from HDRPAsset to HDGlobal Settings")] internal int m_ObsoleteShaderVariantLogLevel; [SerializeField] [FormerlySerializedAs("m_LensAttenuation"), Obsolete("Moved from HDRPAsset to HDGlobal Settings")] internal LensAttenuationMode m_ObsoleteLensAttenuation; [SerializeField] [FormerlySerializedAs("diffusionProfileSettingsList"), Obsolete("Moved from HDRPAsset to HDGlobal Settings")] internal DiffusionProfileSettings[] m_ObsoleteDiffusionProfileSettingsList; #endregion #pragma warning restore 618 #if UNITY_EDITOR const string packageName = "com.unity.render-pipelines.high-definition"; [InitializeOnLoadMethod] static void SubscribeToPacManEvents() { UnityEditor.PackageManager.Events.registeredPackages += RegisteredPackagesEventHandler; } static void RegisteredPackagesEventHandler(PackageRegistrationEventArgs packageRegistrationEventArgs) { foreach (var addedPackage in packageRegistrationEventArgs.added) { if (addedPackage.name == packageName) { MigrateDueToHDRPPackageUpdate(); return; } } for (int i = 0; i <= packageRegistrationEventArgs.changedTo.Count; i++) { if (i >= packageRegistrationEventArgs.changedTo.Count) continue; if (packageRegistrationEventArgs.changedTo[i].name == packageName) { MigrateDueToHDRPPackageUpdate(); return; } } } static void MigrateDueToHDRPPackageUpdate() { // Migrate all HDRPAsset but also Resources assets and any HDRenderPipelineGlobalSettings (always migrated last) foreach (IMigratableAsset asset in CoreUtils.LoadAllAssets().OrderBy(asset => asset is HDRenderPipelineGlobalSettings ? 1 : 0)) asset.Migrate(); } bool IMigratableAsset.Migrate() => Migrate(); bool IMigratableAsset.IsAtLastVersion() => m_Version >= MigrationDescription.LastVersion(); internal bool IsVersionBelowAddedHDRenderPipelineGlobalSettings() => m_Version < Version.AddedHDRenderPipelineGlobalSettings; #endif bool Migrate() => k_Migration.Migrate(this); } }