From 0d6ae17f9fa6230c1c85f4d9846f0ecc0c8bc77a Mon Sep 17 00:00:00 2001 From: victorlsc Date: Sun, 28 Feb 2021 20:37:46 +0000 Subject: [PATCH 1/4] OverridableFrameSettingsArea.Field.overrideable and OverridableFrameSettingsArea.Field.customOverrideable are duplicate delegates: - They are only called in OverridableFrameSettingsArea.Field.IsOverrideableWithDependencies. - overrideable first gets a chance to declare the field as not overridable, and then customOverrideable gets a chance to override the final result. - customOverrideable is called once for each FrameSettingsFieldAttribute.dependencies, sometimes resulting in duplicate run of the same function with the same input multiple times. - customOverrideable is also coupled with some "positive / negative dependency" system making it hard to understand unnecessarily. It is neater to keep only OverridableFrameSettingsArea.Field.overrideable and delete OverridableFrameSettingsArea.Field.customOverrideable, while adding a ignoreOverride boolean. --- .../Settings/FrameSettingsUI.Drawers.cs | 72 ++++++------------- .../Settings/OverridableFrameSettingsArea.cs | 12 ++-- 2 files changed, 24 insertions(+), 60 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/Settings/FrameSettingsUI.Drawers.cs b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/Settings/FrameSettingsUI.Drawers.cs index 9c856cf1e03..1f8fd71b8d9 100644 --- a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/Settings/FrameSettingsUI.Drawers.cs +++ b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/Settings/FrameSettingsUI.Drawers.cs @@ -183,59 +183,20 @@ static void Drawer_SectionRenderingSettings(SerializedFrameSettings serialized, bool msaaEnablable = hdrpSettings.supportMSAA && ((hdrpAssetSupportForward && (frameSettingsOverrideToForward || defaultForwardUsed)) || hdrpAssetIsForward) && !hdrpSettings.supportRayTracing; area.AmmendInfo(FrameSettingsField.MSAA, overrideable: () => msaaEnablable, - overridedDefaultValue: msaaEnablable && defaultFrameSettings.IsEnabled(FrameSettingsField.MSAA), - customOverrideable: () => - { - switch (hdrpSettings.supportedLitShaderMode) - { - case RenderPipelineSettings.SupportedLitShaderMode.ForwardOnly: - return false; //negative dependency - case RenderPipelineSettings.SupportedLitShaderMode.DeferredOnly: - return true; //negative dependency - case RenderPipelineSettings.SupportedLitShaderMode.Both: - return !(frameSettingsOverrideToForward || defaultForwardUsed); //negative dependency - default: - throw new System.ArgumentOutOfRangeException("Unknown ShaderLitMode"); - } - }); + ignoreDependencies: true, + overridedDefaultValue: msaaEnablable && defaultFrameSettings.IsEnabled(FrameSettingsField.MSAA)); bool depthPrepassEnablable = (hdrpAssetSupportDeferred && (defaultDeferredUsed || frameSettingsOverrideToDeferred)) || (hdrpAssetIsDeferred); area.AmmendInfo(FrameSettingsField.DepthPrepassWithDeferredRendering, overrideable: () => depthPrepassEnablable, - overridedDefaultValue: depthPrepassEnablable && defaultFrameSettings.IsEnabled(FrameSettingsField.DepthPrepassWithDeferredRendering), - customOverrideable: () => - { - switch (hdrpSettings.supportedLitShaderMode) - { - case RenderPipelineSettings.SupportedLitShaderMode.ForwardOnly: - return false; - case RenderPipelineSettings.SupportedLitShaderMode.DeferredOnly: - return true; - case RenderPipelineSettings.SupportedLitShaderMode.Both: - return frameSettingsOverrideToDeferred || defaultDeferredUsed; - default: - throw new System.ArgumentOutOfRangeException("Unknown ShaderLitMode"); - } - }); + ignoreDependencies: true, + overridedDefaultValue: depthPrepassEnablable && defaultFrameSettings.IsEnabled(FrameSettingsField.DepthPrepassWithDeferredRendering)); bool clearGBufferEnablable = (hdrpAssetSupportDeferred && (defaultDeferredUsed || frameSettingsOverrideToDeferred)) || (hdrpAssetIsDeferred); area.AmmendInfo(FrameSettingsField.ClearGBuffers, overrideable: () => clearGBufferEnablable, - overridedDefaultValue: clearGBufferEnablable && defaultFrameSettings.IsEnabled(FrameSettingsField.ClearGBuffers), - customOverrideable: () => - { - switch (hdrpSettings.supportedLitShaderMode) - { - case RenderPipelineSettings.SupportedLitShaderMode.ForwardOnly: - return false; - case RenderPipelineSettings.SupportedLitShaderMode.DeferredOnly: - return true; - case RenderPipelineSettings.SupportedLitShaderMode.Both: - return frameSettingsOverrideToDeferred || defaultDeferredUsed; - default: - throw new System.ArgumentOutOfRangeException("Unknown ShaderLitMode"); - } - }); + ignoreDependencies: true, + overridedDefaultValue: clearGBufferEnablable && defaultFrameSettings.IsEnabled(FrameSettingsField.ClearGBuffers)); area.AmmendInfo(FrameSettingsField.RayTracing, overrideable: () => hdrpSettings.supportRayTracing); #if !ENABLE_VIRTUALTEXTURES @@ -262,14 +223,16 @@ static void Drawer_SectionRenderingSettings(SerializedFrameSettings serialized, overridedDefaultValue: ScalableLevel3ForFrameSettingsUIOnly.Low, customGetter: () => (ScalableLevel3ForFrameSettingsUIOnly)serialized.lodBiasQualityLevel.intValue, customSetter: v => serialized.lodBiasQualityLevel.intValue = (int)v, - customOverrideable: () => serialized.lodBiasMode.GetEnumValue() != LODBiasMode.OverrideQualitySettings, + overrideable: () => serialized.lodBiasMode.GetEnumValue() != LODBiasMode.OverrideQualitySettings, + ignoreDependencies: true, hasMixedValues: serialized.lodBiasQualityLevel.hasMultipleDifferentValues); area.AmmendInfo(FrameSettingsField.LODBias, overridedDefaultValue: hdrpSettings.lodBias[serialized.lodBiasQualityLevel.intValue], customGetter: () => serialized.lodBias.floatValue, customSetter: v => serialized.lodBias.floatValue = (float)v, - customOverrideable: () => serialized.lodBiasMode.GetEnumValue() != LODBiasMode.FromQualitySettings, + overrideable: () => serialized.lodBiasMode.GetEnumValue() != LODBiasMode.FromQualitySettings, + ignoreDependencies: true, labelOverride: serialized.lodBiasMode.GetEnumValue() == LODBiasMode.ScaleQualitySettings ? "Scale Factor" : "LOD Bias", hasMixedValues: serialized.lodBias.hasMultipleDifferentValues); @@ -284,14 +247,16 @@ static void Drawer_SectionRenderingSettings(SerializedFrameSettings serialized, overridedDefaultValue: ScalableLevel3ForFrameSettingsUIOnly.Low, customGetter: () => (ScalableLevel3ForFrameSettingsUIOnly)serialized.maximumLODLevelQualityLevel.intValue, customSetter: v => serialized.maximumLODLevelQualityLevel.intValue = (int)v, - customOverrideable: () => serialized.maximumLODLevelMode.GetEnumValue() != MaximumLODLevelMode.OverrideQualitySettings, + overrideable: () => serialized.maximumLODLevelMode.GetEnumValue() != MaximumLODLevelMode.OverrideQualitySettings, + ignoreDependencies: true, hasMixedValues: serialized.maximumLODLevelQualityLevel.hasMultipleDifferentValues); area.AmmendInfo(FrameSettingsField.MaximumLODLevel, overridedDefaultValue: hdrpSettings.maximumLODLevel[serialized.maximumLODLevelQualityLevel.intValue], customGetter: () => serialized.maximumLODLevel.intValue, customSetter: v => serialized.maximumLODLevel.intValue = (int)v, - customOverrideable: () => serialized.maximumLODLevelMode.GetEnumValue() != MaximumLODLevelMode.FromQualitySettings, + overrideable: () => serialized.maximumLODLevelMode.GetEnumValue() != MaximumLODLevelMode.FromQualitySettings, + ignoreDependencies: true, labelOverride: serialized.maximumLODLevelMode.GetEnumValue() == MaximumLODLevelMode.OffsetQualitySettings ? "Offset Factor" : "Maximum LOD Level", hasMixedValues: serialized.maximumLODLevel.hasMultipleDifferentValues); @@ -336,26 +301,29 @@ static void Drawer_SectionLightingSettings(SerializedFrameSettings serialized, E overridedDefaultValue: SssQualityMode.FromQualitySettings, customGetter: () => serialized.sssQualityMode.GetEnumValue(), customSetter: v => serialized.sssQualityMode.SetEnumValue((SssQualityMode)v), - customOverrideable: () => hdrpSettings.supportSubsurfaceScattering + overrideable: () => hdrpSettings.supportSubsurfaceScattering && (serialized.IsEnabled(FrameSettingsField.SubsurfaceScattering) ?? false), + ignoreDependencies: true, hasMixedValues: serialized.sssQualityMode.hasMultipleDifferentValues ); area.AmmendInfo(FrameSettingsField.SssQualityLevel, overridedDefaultValue: ScalableLevel3ForFrameSettingsUIOnly.Low, customGetter: () => (ScalableLevel3ForFrameSettingsUIOnly)serialized.sssQualityLevel.intValue, // 3 levels customSetter: v => serialized.sssQualityLevel.intValue = Math.Max(0, Math.Min((int)v, 2)), // Levels 0-2 - customOverrideable: () => hdrpSettings.supportSubsurfaceScattering + overrideable: () => hdrpSettings.supportSubsurfaceScattering && (serialized.IsEnabled(FrameSettingsField.SubsurfaceScattering) ?? false) && (serialized.sssQualityMode.GetEnumValue() == SssQualityMode.FromQualitySettings), + ignoreDependencies: true, hasMixedValues: serialized.sssQualityLevel.hasMultipleDifferentValues ); area.AmmendInfo(FrameSettingsField.SssCustomSampleBudget, overridedDefaultValue: (int)DefaultSssSampleBudgetForQualityLevel.Low, customGetter: () => serialized.sssCustomSampleBudget.intValue, customSetter: v => serialized.sssCustomSampleBudget.intValue = Math.Max(1, Math.Min((int)v, (int)DefaultSssSampleBudgetForQualityLevel.Max)), - customOverrideable: () => hdrpSettings.supportSubsurfaceScattering + overrideable: () => hdrpSettings.supportSubsurfaceScattering && (serialized.IsEnabled(FrameSettingsField.SubsurfaceScattering) ?? false) && (serialized.sssQualityMode.GetEnumValue() != SssQualityMode.FromQualitySettings), + ignoreDependencies: true, hasMixedValues: serialized.sssCustomSampleBudget.hasMultipleDifferentValues ); diff --git a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/Settings/OverridableFrameSettingsArea.cs b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/Settings/OverridableFrameSettingsArea.cs index 5d4fe2acc5e..43a566f3cb2 100644 --- a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/Settings/OverridableFrameSettingsArea.cs +++ b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/Settings/OverridableFrameSettingsArea.cs @@ -42,7 +42,7 @@ private struct Field { public FrameSettingsField field; public Func overrideable; - public Func customOverrideable; + public bool ignoreDependencies; public Func customGetter; public Action customSetter; public object overridedDefaultValue; @@ -60,7 +60,7 @@ public bool IsOverrideableWithDependencies(SerializedFrameSettings serialized, F FrameSettingsFieldAttribute attribute = attributes[field]; bool locallyOverrideable = overrideable == null || overrideable(); FrameSettingsField[] dependencies = attribute.dependencies; - if (dependencies == null || !locallyOverrideable) + if (dependencies == null || ignoreDependencies || !locallyOverrideable) return locallyOverrideable; bool dependenciesOverrideable = true; @@ -96,7 +96,7 @@ public static OverridableFrameSettingsArea GetGroupContent(int groupIndex, Frame return area; } - public void AmmendInfo(FrameSettingsField field, Func overrideable = null, Func customGetter = null, Action customSetter = null, object overridedDefaultValue = null, Func customOverrideable = null, string labelOverride = null, bool hasMixedValues = false) + public void AmmendInfo(FrameSettingsField field, Func overrideable = null, bool ignoreDependencies = false, Func customGetter = null, Action customSetter = null, object overridedDefaultValue = null, string labelOverride = null, bool hasMixedValues = false) { var matchIndex = fields.FindIndex(f => f.field == field); @@ -106,8 +106,7 @@ public void AmmendInfo(FrameSettingsField field, Func overrideable = null, var match = fields[matchIndex]; if (overrideable != null) match.overrideable = overrideable; - if (customOverrideable != null) - match.customOverrideable = customOverrideable; + match.ignoreDependencies = ignoreDependencies; if (customGetter != null) match.customGetter = customGetter; if (customSetter != null) @@ -123,9 +122,6 @@ public void AmmendInfo(FrameSettingsField field, Func overrideable = null, static bool EvaluateBoolWithOverride(FrameSettingsField field, Field forField, FrameSettings defaultFrameSettings, SerializedFrameSettings serializedFrameSettings, bool negative) { bool value; - if (forField.customOverrideable != null) - return forField.customOverrideable() ^ negative; - if (serializedFrameSettings.GetOverrides(field)) value = serializedFrameSettings.IsEnabled(field) ?? false; else From 946ef27170ea019dcc74056a3eb87c3f87f92204 Mon Sep 17 00:00:00 2001 From: victorlsc Date: Sun, 28 Feb 2021 20:39:24 +0000 Subject: [PATCH 2/4] With the previous commit, declaring a field with both positive and negative dependency no longer has weird problem with custom override-able delegate. So we give AlphaToMask a positive and a negative dependency as is needed. But still the AlphaToMask field needs a custom override-able delegate to handle cases like when HDRP Asset force deferred while frame setting has forward Lit Shader Mode, so we added a custom override-able delegate too. --- .../RenderPipeline/Settings/FrameSettingsUI.Drawers.cs | 6 ++++++ .../Runtime/RenderPipeline/Settings/FrameSettings.cs | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/Settings/FrameSettingsUI.Drawers.cs b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/Settings/FrameSettingsUI.Drawers.cs index 1f8fd71b8d9..2d9873aa9fb 100644 --- a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/Settings/FrameSettingsUI.Drawers.cs +++ b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/Settings/FrameSettingsUI.Drawers.cs @@ -186,6 +186,12 @@ static void Drawer_SectionRenderingSettings(SerializedFrameSettings serialized, ignoreDependencies: true, overridedDefaultValue: msaaEnablable && defaultFrameSettings.IsEnabled(FrameSettingsField.MSAA)); + bool msaaIsOff = (msaaEnablable && serialized.GetOverrides(FrameSettingsField.MSAA)) ? !(serialized.IsEnabled(FrameSettingsField.MSAA) ?? false) : !defaultFrameSettings.IsEnabled(FrameSettingsField.MSAA); + area.AmmendInfo(FrameSettingsField.AlphaToMask, + overrideable: () => msaaEnablable && !msaaIsOff, + ignoreDependencies: true, + overridedDefaultValue: msaaEnablable && defaultFrameSettings.IsEnabled(FrameSettingsField.AlphaToMask) && !msaaIsOff); + bool depthPrepassEnablable = (hdrpAssetSupportDeferred && (defaultDeferredUsed || frameSettingsOverrideToDeferred)) || (hdrpAssetIsDeferred); area.AmmendInfo(FrameSettingsField.DepthPrepassWithDeferredRendering, overrideable: () => depthPrepassEnablable, diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Settings/FrameSettings.cs b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Settings/FrameSettings.cs index 3bd479c4499..94550b68b03 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Settings/FrameSettings.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Settings/FrameSettings.cs @@ -103,7 +103,7 @@ public enum FrameSettingsField [FrameSettingsField(0, displayedName: "MSAA within Forward", negativeDependencies: new[] { LitShaderMode }, customOrderInGroup: 3, tooltip: "When enabled, Cameras using these Frame Settings calculate MSAA when they render the Scene. Set Lit Shader Mode to Forward to access this option.")] MSAA = 31, /// When enabled, Cameras using these Frame Settings use Alpha To Mask. Activate MSAA to access this option. - [FrameSettingsField(0, displayedName: "Alpha To Mask", positiveDependencies: new[] { MSAA }, customOrderInGroup: 3, tooltip: "When enabled, Cameras using these Frame Settings use Alpha To Mask. Activate MSAA to access this option.")] + [FrameSettingsField(0, displayedName: "Alpha To Mask", negativeDependencies: new[] { LitShaderMode }, positiveDependencies: new[] { MSAA }, customOrderInGroup: 3, tooltip: "When enabled, Cameras using these Frame Settings use Alpha To Mask. Activate MSAA to access this option.")] AlphaToMask = 56, /// When enabled, Cameras using these Frame Settings render opaque GameObjects. [FrameSettingsField(0, autoName: OpaqueObjects, customOrderInGroup: 4, tooltip: "When enabled, Cameras using these Frame Settings render opaque GameObjects.")] From 2432b5740bfe1a0e4fd62a144e194731db0f2670 Mon Sep 17 00:00:00 2001 From: victorlsc Date: Sun, 28 Feb 2021 21:14:56 +0000 Subject: [PATCH 3/4] update CHANGELOG.md --- com.unity.render-pipelines.high-definition/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/com.unity.render-pipelines.high-definition/CHANGELOG.md b/com.unity.render-pipelines.high-definition/CHANGELOG.md index b690ac4dace..6a3ade3aba0 100644 --- a/com.unity.render-pipelines.high-definition/CHANGELOG.md +++ b/com.unity.render-pipelines.high-definition/CHANGELOG.md @@ -59,6 +59,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - Fixed nullref when adding a volume component in a Volume profile asset (case 1317156). - Fixed decal normal for double sided materials (case 1312065). - Fixed multiple HDRP Frame Settings panel issues: missing "Refraction" Frame Setting. Fixing ordering of Rough Distortion, it should now be under the Distortion setting. +- Fixed ability to override AlphaToMask FrameSetting while camera in deferred lit shader mode - Fixed issue with automatic exposure settings not updating scene view. - Fixed issue with velocity rejection in post-DoF TAA. Fixing this reduces ghosting (case 1304381). From 86c540177d20029cef43d0b93e0eb97a5b46e307 Mon Sep 17 00:00:00 2001 From: sebastienlagarde Date: Mon, 1 Mar 2021 10:02:18 +0100 Subject: [PATCH 4/4] Update CHANGELOG.md --- com.unity.render-pipelines.high-definition/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.render-pipelines.high-definition/CHANGELOG.md b/com.unity.render-pipelines.high-definition/CHANGELOG.md index 6a3ade3aba0..7ee61754f2e 100644 --- a/com.unity.render-pipelines.high-definition/CHANGELOG.md +++ b/com.unity.render-pipelines.high-definition/CHANGELOG.md @@ -59,9 +59,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - Fixed nullref when adding a volume component in a Volume profile asset (case 1317156). - Fixed decal normal for double sided materials (case 1312065). - Fixed multiple HDRP Frame Settings panel issues: missing "Refraction" Frame Setting. Fixing ordering of Rough Distortion, it should now be under the Distortion setting. -- Fixed ability to override AlphaToMask FrameSetting while camera in deferred lit shader mode - Fixed issue with automatic exposure settings not updating scene view. - Fixed issue with velocity rejection in post-DoF TAA. Fixing this reduces ghosting (case 1304381). +- Fixed ability to override AlphaToMask FrameSetting while camera in deferred lit shader mode ### Changed - Changed Window/Render Pipeline/HD Render Pipeline Wizard to Window/Rendering/HDRP Wizard