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.
 
 
 
 
 

416 lines
23 KiB

using System;
using System.Linq;
#if UNITY_EDITOR
using UnityEditor.Rendering;
using UnityEngine.Assertions;
#endif
namespace UnityEngine.Rendering.HighDefinition
{
partial class HDRenderPipelineGlobalSettings : IVersionable<HDRenderPipelineGlobalSettings.Version>, IMigratableAsset
{
// Keep in mind that if there is no HDRenderPipelineGlobalSettings,
// it can be created from one HDRPAsset in GraphicSettings before version AddedHDRenderPipelineGlobalSettings.
// When it occurs we force Version to be First again for all migration step to occures again.
//
// /!\ If you add data that are not from HDRPAsset and then add a migration pattern on them,
// don't forget to add your migration step into skipedStepWhenCreatedFromHDRPAsset.
//
// /!\ Also for each new version, you must now upgrade asset in HDRP_Runtime, HDRP_Performance and SRP_SmokeTest test project.
internal enum Version
{
First,
UpdateMSAA,
UpdateLensFlare,
MovedSupportRuntimeDebugDisplayToGlobalSettings,
DisableAutoRegistration,
MoveDiffusionProfilesToVolume,
GenericRenderingLayers,
SupportRuntimeDebugDisplayToStripRuntimeDebugShaders,
EnableAmethystFeaturesByDefault,
ShaderStrippingSettings,
RenderingPathFrameSettings,
CustomPostProcessOrdersSettings,
SetUpIncluderRenderPipelineAssetGraphicsSettings,
ToRenderPipelineGraphicsSettings,
RenderingLayerMask,
}
static Version[] skipedStepWhenCreatedFromHDRPAsset = new Version[] { };
[SerializeField]
internal Version m_Version = MigrationDescription.LastVersion<Version>();
Version IVersionable<Version>.version { get => m_Version; set => m_Version = value; }
#if UNITY_EDITOR
static readonly MigrationDescription<Version, HDRenderPipelineGlobalSettings> k_Migration = MigrationDescription.New(
MigrationStep.New(Version.UpdateMSAA, (HDRenderPipelineGlobalSettings data) =>
{
#pragma warning disable 618 // Type or member is obsolete
FrameSettingsOverrideMask unusedMaskForDefault = new FrameSettingsOverrideMask();
FrameSettings.MigrateMSAA(ref data.m_ObsoleteRenderingPathDefaultCameraFrameSettings, ref unusedMaskForDefault);
FrameSettings.MigrateMSAA(ref data.m_ObsoleteRenderingPathDefaultBakedOrCustomReflectionFrameSettings, ref unusedMaskForDefault);
FrameSettings.MigrateMSAA(ref data.m_ObsoleteRenderingPathDefaultRealtimeReflectionFrameSettings, ref unusedMaskForDefault);
#pragma warning restore 618
}),
MigrationStep.New(Version.UpdateLensFlare, (HDRenderPipelineGlobalSettings data) =>
{
#pragma warning disable 618 // Type or member is obsolete
FrameSettings.MigrateToLensFlare(ref data.m_ObsoleteRenderingPathDefaultCameraFrameSettings);
#pragma warning restore 618
}),
MigrationStep.New(Version.MovedSupportRuntimeDebugDisplayToGlobalSettings, (HDRenderPipelineGlobalSettings data) =>
{
#pragma warning disable 618 // Type or member is obsolete
if (GraphicsSettings.currentRenderPipeline is HDRenderPipelineAsset activePipeline)
{
data.m_SupportRuntimeDebugDisplay = activePipeline.currentPlatformRenderPipelineSettings.m_ObsoleteSupportRuntimeDebugDisplay;
}
#pragma warning restore 618
}),
MigrationStep.New(Version.DisableAutoRegistration, (HDRenderPipelineGlobalSettings data) =>
{
#pragma warning disable 618 // Type or member is obsolete
// Field is on for new projects, but disable it for existing projects
data.autoRegisterDiffusionProfiles = false;
#pragma warning restore 618
}),
MigrationStep.New(Version.MoveDiffusionProfilesToVolume, (HDRenderPipelineGlobalSettings data) =>
{
#pragma warning disable 618 // Type or member is obsolete
if (data.m_ObsoleteDiffusionProfileSettingsList == null ||
data.m_ObsoleteDiffusionProfileSettingsList.Length == 0)
return;
// Ensure the default volume exists at this point
var defaultVolumeProfile = GetOrCreateGraphicsSettings<HDRenderPipelineEditorAssets>(data).defaultVolumeProfile;
if (data.m_ObsoleteDefaultVolumeProfile != null && VolumeUtils.IsDefaultVolumeProfile(data.m_ObsoleteDefaultVolumeProfile, defaultVolumeProfile))
{
// Profile from resources is read only in released packages, so we have to copy it to the assets folder
data.m_ObsoleteDefaultVolumeProfile = null;
}
if (data.m_ObsoleteDefaultVolumeProfile == null)
{
data.m_ObsoleteDefaultVolumeProfile = VolumeUtils.CopyVolumeProfileFromResourcesToAssets(defaultVolumeProfile);
}
UnityEditor.AssetDatabase.MakeEditable(UnityEditor.AssetDatabase.GetAssetPath(data.m_ObsoleteDefaultVolumeProfile));
VolumeUtils.TryAddDiffusionProfiles(data.m_ObsoleteDefaultVolumeProfile, data.m_ObsoleteDiffusionProfileSettingsList);
#pragma warning restore 618
}),
MigrationStep.New(Version.GenericRenderingLayers, (HDRenderPipelineGlobalSettings data) =>
{
#pragma warning disable 618 // Type or member is obsolete
data.renderingLayerNames = new string[16]
{
data.lightLayerName0,
data.lightLayerName1,
data.lightLayerName2,
data.lightLayerName3,
data.lightLayerName4,
data.lightLayerName5,
data.lightLayerName6,
data.lightLayerName7,
data.decalLayerName0,
data.decalLayerName1,
data.decalLayerName2,
data.decalLayerName3,
data.decalLayerName4,
data.decalLayerName5,
data.decalLayerName6,
data.decalLayerName7,
};
data.GetDefaultFrameSettings(FrameSettingsRenderType.Camera).SetEnabled(FrameSettingsField.RenderingLayerMaskBuffer, true);
#pragma warning restore 618
}),
MigrationStep.New(Version.SupportRuntimeDebugDisplayToStripRuntimeDebugShaders, (HDRenderPipelineGlobalSettings data) =>
{
#pragma warning disable 618 // Type or member is obsolete
data.m_StripDebugVariants = !data.m_SupportRuntimeDebugDisplay; // Inversion logic
#pragma warning restore 618
}),
MigrationStep.New(Version.EnableAmethystFeaturesByDefault, (HDRenderPipelineGlobalSettings data) =>
{
#pragma warning disable 618 // Type or member is obsolete
FrameSettings.MigrateAmethystFeatures(ref data.m_ObsoleteRenderingPathDefaultCameraFrameSettings);
#pragma warning restore 618
}),
MigrationStep.New(Version.ShaderStrippingSettings, (HDRenderPipelineGlobalSettings data) =>
{
#pragma warning disable 618 // Type or member is obsolete
data.m_ShaderStrippingSetting.exportShaderVariants = data.m_ExportShaderVariants;
data.m_ShaderStrippingSetting.shaderVariantLogLevel = data.m_ShaderVariantLogLevel;
data.m_ShaderStrippingSetting.stripRuntimeDebugShaders= data.m_StripDebugVariants;
#pragma warning restore 618
}),
MigrationStep.New(Version.RenderingPathFrameSettings, (HDRenderPipelineGlobalSettings data) =>
{
#pragma warning disable 618 // Type or member is obsolete
data.m_ObsoleteRenderingPath.GetDefaultFrameSettings(FrameSettingsRenderType.Camera) = data.m_ObsoleteRenderingPathDefaultCameraFrameSettings;
data.m_ObsoleteRenderingPath.GetDefaultFrameSettings(FrameSettingsRenderType.CustomOrBakedReflection) = data.m_ObsoleteRenderingPathDefaultBakedOrCustomReflectionFrameSettings;
data.m_ObsoleteRenderingPath.GetDefaultFrameSettings(FrameSettingsRenderType.RealtimeReflection) = data.m_ObsoleteRenderingPathDefaultRealtimeReflectionFrameSettings;
#pragma warning restore 618
}),
MigrationStep.New(Version.CustomPostProcessOrdersSettings, (HDRenderPipelineGlobalSettings data) =>
{
#pragma warning disable 618 // Type or member is obsolete
data.m_CustomPostProcessOrdersSettings.afterPostProcessBlursCustomPostProcesses.AddRange(data.afterPostProcessBlursCustomPostProcesses);
data.m_CustomPostProcessOrdersSettings.afterPostProcessCustomPostProcesses.AddRange(data.afterPostProcessCustomPostProcesses);
data.m_CustomPostProcessOrdersSettings.beforePostProcessCustomPostProcesses.AddRange(data.beforePostProcessCustomPostProcesses);
data.m_CustomPostProcessOrdersSettings.beforeTAACustomPostProcesses.AddRange(data.beforeTAACustomPostProcesses);
data.m_CustomPostProcessOrdersSettings.beforeTransparentCustomPostProcesses.AddRange(data.beforeTransparentCustomPostProcesses);
#pragma warning restore 618
}),
MigrationStep.New(Version.SetUpIncluderRenderPipelineAssetGraphicsSettings, (HDRenderPipelineGlobalSettings data) => data.SetUpRPAssetIncluded()),
MigrationStep.New(Version.ToRenderPipelineGraphicsSettings, (HDRenderPipelineGlobalSettings data) =>
{
MigrateToRenderPipelineGraphicsSettings(data);
}),
MigrationStep.New(Version.RenderingLayerMask, (HDRenderPipelineGlobalSettings data) =>
{
#pragma warning disable 618 // Type or member is obsolete
if (data.renderingLayerNames == null)
return;
for (int i = 1; i < data.renderingLayerNames.Length; i++)
{
if (i >= UnityEngine.RenderingLayerMask.GetRenderingLayerCount())
RenderPipelineEditorUtility.TryAddRenderingLayerName("");
var name = data.renderingLayerNames[i];
if(string.IsNullOrWhiteSpace(name))
continue;
var currentLayerName = UnityEngine.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
})
);
public bool Migrate()
=> k_Migration.Migrate(this);
bool IMigratableAsset.IsAtLastVersion()
=> m_Version >= MigrationDescription.LastVersion<Version>();
internal static void MigrateFromHDRPAsset(HDRenderPipelineAsset oldAsset)
{
if (instance != null && !instance.Equals(null) && !(instance.m_Version == Version.First))
return;
//1. Create the instance or load current one
HDRenderPipelineGlobalSettings assetToUpgrade = instance;
if (assetToUpgrade == null || assetToUpgrade.Equals(null))
{
assetToUpgrade = RenderPipelineGlobalSettingsUtils.Create<HDRenderPipelineGlobalSettings>(defaultPath);
EditorGraphicsSettings.SetRenderPipelineGlobalSettingsAsset<HDRenderPipeline>(assetToUpgrade);
}
Debug.Assert(assetToUpgrade);
//2. Migrate obsolete assets (version DefaultSettingsAsAnAsset)
#pragma warning disable 618 // Type or member is obsolete
assetToUpgrade.m_ObsoleteDefaultVolumeProfile = oldAsset.m_ObsoleteDefaultVolumeProfile;
assetToUpgrade.m_ObsoleteLookDevVolumeProfile = oldAsset.m_ObsoleteDefaultLookDevProfile;
assetToUpgrade.m_ObsoleteRenderingPathDefaultCameraFrameSettings = oldAsset.m_ObsoleteFrameSettingsMovedToDefaultSettings;
assetToUpgrade.m_ObsoleteRenderingPathDefaultBakedOrCustomReflectionFrameSettings = oldAsset.m_ObsoleteBakedOrCustomReflectionFrameSettingsMovedToDefaultSettings;
assetToUpgrade.m_ObsoleteRenderingPathDefaultRealtimeReflectionFrameSettings = oldAsset.m_ObsoleteRealtimeReflectionFrameSettingsMovedToDefaultSettings;
assetToUpgrade.beforeTransparentCustomPostProcesses.AddRange(oldAsset.m_ObsoleteBeforeTransparentCustomPostProcesses);
assetToUpgrade.beforePostProcessCustomPostProcesses.AddRange(oldAsset.m_ObsoleteBeforePostProcessCustomPostProcesses);
assetToUpgrade.afterPostProcessCustomPostProcesses.AddRange(oldAsset.m_ObsoleteAfterPostProcessCustomPostProcesses);
assetToUpgrade.beforeTAACustomPostProcesses.AddRange(oldAsset.m_ObsoleteBeforeTAACustomPostProcesses);
assetToUpgrade.lightLayerName0 = oldAsset.currentPlatformRenderPipelineSettings.m_ObsoleteLightLayerName0;
assetToUpgrade.lightLayerName1 = oldAsset.currentPlatformRenderPipelineSettings.m_ObsoleteLightLayerName1;
assetToUpgrade.lightLayerName2 = oldAsset.currentPlatformRenderPipelineSettings.m_ObsoleteLightLayerName2;
assetToUpgrade.lightLayerName3 = oldAsset.currentPlatformRenderPipelineSettings.m_ObsoleteLightLayerName3;
assetToUpgrade.lightLayerName4 = oldAsset.currentPlatformRenderPipelineSettings.m_ObsoleteLightLayerName4;
assetToUpgrade.lightLayerName5 = oldAsset.currentPlatformRenderPipelineSettings.m_ObsoleteLightLayerName5;
assetToUpgrade.lightLayerName6 = oldAsset.currentPlatformRenderPipelineSettings.m_ObsoleteLightLayerName6;
assetToUpgrade.lightLayerName7 = oldAsset.currentPlatformRenderPipelineSettings.m_ObsoleteLightLayerName7;
if (oldAsset.currentPlatformRenderPipelineSettings.m_ObsoleteDecalLayerName0 != null)
{
assetToUpgrade.decalLayerName0 = oldAsset.currentPlatformRenderPipelineSettings.m_ObsoleteDecalLayerName0;
assetToUpgrade.decalLayerName1 = oldAsset.currentPlatformRenderPipelineSettings.m_ObsoleteDecalLayerName1;
assetToUpgrade.decalLayerName2 = oldAsset.currentPlatformRenderPipelineSettings.m_ObsoleteDecalLayerName2;
assetToUpgrade.decalLayerName3 = oldAsset.currentPlatformRenderPipelineSettings.m_ObsoleteDecalLayerName3;
assetToUpgrade.decalLayerName4 = oldAsset.currentPlatformRenderPipelineSettings.m_ObsoleteDecalLayerName4;
assetToUpgrade.decalLayerName5 = oldAsset.currentPlatformRenderPipelineSettings.m_ObsoleteDecalLayerName5;
assetToUpgrade.decalLayerName6 = oldAsset.currentPlatformRenderPipelineSettings.m_ObsoleteDecalLayerName6;
assetToUpgrade.decalLayerName7 = oldAsset.currentPlatformRenderPipelineSettings.m_ObsoleteDecalLayerName7;
}
assetToUpgrade.m_ShaderVariantLogLevel = (ShaderVariantLogLevel) oldAsset.m_ObsoleteShaderVariantLogLevel;
assetToUpgrade.lensAttenuationMode = oldAsset.m_ObsoleteLensAttenuation;
// we need to make sure the old diffusion profile had time to upgrade before moving it away
if (oldAsset.diffusionProfileSettings != null)
oldAsset.diffusionProfileSettings.TryToUpgrade();
int oldSize = oldAsset.m_ObsoleteDiffusionProfileSettingsList?.Length ?? 0;
System.Array.Resize(ref assetToUpgrade.m_ObsoleteDiffusionProfileSettingsList, oldSize);
for (int i = 0; i < oldSize; ++i)
assetToUpgrade.m_ObsoleteDiffusionProfileSettingsList[i] = oldAsset.m_ObsoleteDiffusionProfileSettingsList[i];
#pragma warning restore 618
//3. Set version to next & Launch remaining of migration
// If we created it from HDRPAsset, we want to pass it from all migration step that are relevant as copied data are at version First
assetToUpgrade.m_Version = Version.First; //Step only apply on version older
for (Version i = Version.First; i <= MigrationDescription.LastVersion<Version>(); ++i)
{
if (skipedStepWhenCreatedFromHDRPAsset.Contains(i))
continue;
k_Migration.ExecuteStep(assetToUpgrade, i);
}
// Above ExecuteStep will change version. Bring it back to last one.
assetToUpgrade.m_Version = MigrationDescription.LastVersion<Version>();
UnityEditor.EditorUtility.SetDirty(assetToUpgrade);
}
#region MigrateToRenderPipelineGraphicsSettings
public static void MigrateToRenderPipelineGraphicsSettings(HDRenderPipelineGlobalSettings data)
{
MigrateToShaderStrippingSetting(data);
MigrateRenderingPathFrameSettings(data);
MigrateMiscSection(data);
MigrateCustomPostProcessOrdersSettings(data);
MigrateDefaultVolumeProfile(data);
MigrateLookDevVolumeProfile(data);
}
private static T GetOrCreateGraphicsSettings<T>(HDRenderPipelineGlobalSettings 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;
}
public static void MigrateMiscSection(HDRenderPipelineGlobalSettings data)
{
#pragma warning disable 618 // Type or member is obsolete
var diffusionProfileDefaultSettings = GetOrCreateGraphicsSettings<DiffusionProfileDefaultSettings>(data);
diffusionProfileDefaultSettings.autoRegister = data.autoRegisterDiffusionProfiles;
var specularFade = GetOrCreateGraphicsSettings<SpecularFadeSettings>(data);
specularFade.enabled = data.specularFade;
var colorGrading = GetOrCreateGraphicsSettings<ColorGradingSettings>(data);
colorGrading.space = data.colorGradingSpace;
var lens = GetOrCreateGraphicsSettings<LensSettings>(data);
lens.attenuationMode = data.lensAttenuationMode;
var analyticDerivative = GetOrCreateGraphicsSettings<AnalyticDerivativeSettings>(data);
analyticDerivative.debugOutput = data.analyticDerivativeDebugOutput;
analyticDerivative.emulation = data.analyticDerivativeEmulation;
var renderGraphSettings = GetOrCreateGraphicsSettings<RenderGraphSettings>(data);
renderGraphSettings.dynamicRenderPassCullingEnabled = data.rendererListCulling;
#pragma warning restore 618
}
public static void MigrateDefaultVolumeProfile(HDRenderPipelineGlobalSettings data)
{
#pragma warning disable 618 // Type or member is obsolete
if (data.m_ObsoleteDefaultVolumeProfile == null)
{
var defaultVolumeProfileFromResources = GraphicsSettings.GetRenderPipelineSettings<HDRenderPipelineEditorAssets>().defaultVolumeProfile;
data.m_ObsoleteDefaultVolumeProfile = VolumeUtils.CopyVolumeProfileFromResourcesToAssets(defaultVolumeProfileFromResources);
}
var defaultVolumeProfileSettings = GetOrCreateGraphicsSettings<HDRPDefaultVolumeProfileSettings>(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
}
public static void MigrateLookDevVolumeProfile(HDRenderPipelineGlobalSettings data)
{
#pragma warning disable 618 // Type or member is obsolete
if (data.m_ObsoleteLookDevVolumeProfile == null)
{
var lookDevProfileFromResources = GetOrCreateGraphicsSettings<HDRenderPipelineEditorAssets>(data).lookDevVolumeProfile;
data.m_ObsoleteLookDevVolumeProfile = VolumeUtils.CopyVolumeProfileFromResourcesToAssets(lookDevProfileFromResources);
}
var lookDevVolumeProfileSettings = GetOrCreateGraphicsSettings<LookDevVolumeProfileSettings>(data);
lookDevVolumeProfileSettings.volumeProfile = data.m_ObsoleteLookDevVolumeProfile;
data.m_ObsoleteLookDevVolumeProfile = null; // Discard old reference after it is migrated
#pragma warning restore 618 // Type or member is obsolete
}
public static void MigrateToShaderStrippingSetting(HDRenderPipelineGlobalSettings 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 readonly FrameSettingsRenderType[] k_RenderPaths =
new[] { FrameSettingsRenderType.Camera, FrameSettingsRenderType.CustomOrBakedReflection, FrameSettingsRenderType.RealtimeReflection };
internal static void MigrateRenderingPathFrameSettings(HDRenderPipelineGlobalSettings data)
{
RenderingPathFrameSettings renderingPathFrameSettings = GetOrCreateGraphicsSettings<RenderingPathFrameSettings>(data);
#pragma warning disable 618 // Type or member is obsolete
foreach (var path in k_RenderPaths)
renderingPathFrameSettings.GetDefaultFrameSettings(path) = data.m_ObsoleteRenderingPath.GetDefaultFrameSettings(path);
#pragma warning restore 618
}
internal static void MigrateCustomPostProcessOrdersSettings(HDRenderPipelineGlobalSettings data)
{
CustomPostProcessOrdersSettings customPostProcessOrdersSettings = GetOrCreateGraphicsSettings<CustomPostProcessOrdersSettings>(data);
#pragma warning disable 618 // Type or member is obsolete
customPostProcessOrdersSettings.beforeTAACustomPostProcesses =
data.m_CustomPostProcessOrdersSettings.beforeTAACustomPostProcesses;
customPostProcessOrdersSettings.beforePostProcessCustomPostProcesses =
data.m_CustomPostProcessOrdersSettings.beforePostProcessCustomPostProcesses;
customPostProcessOrdersSettings.beforeTransparentCustomPostProcesses =
data.m_CustomPostProcessOrdersSettings.beforeTransparentCustomPostProcesses;
customPostProcessOrdersSettings.afterPostProcessBlursCustomPostProcesses =
data.m_CustomPostProcessOrdersSettings.afterPostProcessBlursCustomPostProcesses;
customPostProcessOrdersSettings.afterPostProcessCustomPostProcesses =
data.m_CustomPostProcessOrdersSettings.afterPostProcessCustomPostProcesses;
#pragma warning restore 618
}
#endregion
#endif
}
}