From 1ba5abb9598f355d0d50092015b9a67edae9e31e Mon Sep 17 00:00:00 2001 From: Pavlos Mavridis Date: Wed, 10 Jun 2020 00:57:56 +0200 Subject: [PATCH 01/39] Improve DoF UX --- .../PostProcessing/DepthOfFieldEditor.cs | 134 +++++++++++++----- .../Editor/RenderPipeline/HDEditorUtils.cs | 24 ++++ .../VolumeComponentWithQualityEditor.cs | 64 ++++++++- 3 files changed, 181 insertions(+), 41 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs index b83fe275edf..45181143199 100644 --- a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs @@ -58,68 +58,124 @@ public override void OnInspectorGUI() { PropertyField(m_FocusMode); + // Draw the focus mode controls int mode = m_FocusMode.value.intValue; if (mode == (int)DepthOfFieldMode.Off) - return; + { + GUI.enabled = false; + } + + HDEditorUtils.BeginIndent(); + DrawFocusSettings(mode); + HDEditorUtils.EndIndent(); + EditorGUILayout.Space(); + + // Draw the quality controls base.OnInspectorGUI(); + HDEditorUtils.BeginIndent(); + DrawQualitySettings(); + HDEditorUtils.EndIndent(); - bool advanced = isInAdvancedMode; + GUI.enabled = true; + } - if (mode == (int)DepthOfFieldMode.UsePhysicalCamera) + void DrawFocusSettings(int mode) + { + if (mode == (int)DepthOfFieldMode.Off) + { + // When DoF is off, display a focus distance at infinity + var val = m_FocusDistance.value.floatValue; + m_FocusDistance.value.floatValue = Mathf.Infinity; + PropertyField(m_FocusDistance); + m_FocusDistance.value.floatValue = val; + } + else if (mode == (int)DepthOfFieldMode.UsePhysicalCamera) { PropertyField(m_FocusDistance); - - if (advanced) - { - GUI.enabled = useCustomValue; - EditorGUILayout.LabelField("Near Blur", EditorStyles.miniLabel); - PropertyField(m_NearSampleCount, EditorGUIUtility.TrTextContent("Sample Count")); - PropertyField(m_NearMaxBlur, EditorGUIUtility.TrTextContent("Max Radius")); - - EditorGUILayout.LabelField("Far Blur", EditorStyles.miniLabel); - PropertyField(m_FarSampleCount, EditorGUIUtility.TrTextContent("Sample Count")); - PropertyField(m_FarMaxBlur, EditorGUIUtility.TrTextContent("Max Radius")); - GUI.enabled = true; - } } else if (mode == (int)DepthOfFieldMode.Manual) { - EditorGUILayout.Space(); - - EditorGUILayout.LabelField("Near Blur", EditorStyles.miniLabel); + EditorGUILayout.LabelField("Near Range", EditorStyles.miniLabel); PropertyField(m_NearFocusStart, EditorGUIUtility.TrTextContent("Start")); PropertyField(m_NearFocusEnd, EditorGUIUtility.TrTextContent("End")); - if (advanced) - { - GUI.enabled = useCustomValue; - PropertyField(m_NearSampleCount, EditorGUIUtility.TrTextContent("Sample Count")); - PropertyField(m_NearMaxBlur, EditorGUIUtility.TrTextContent("Max Radius")); - GUI.enabled = true; - } - - EditorGUILayout.LabelField("Far Blur", EditorStyles.miniLabel); + EditorGUILayout.LabelField("Far Range", EditorStyles.miniLabel); PropertyField(m_FarFocusStart, EditorGUIUtility.TrTextContent("Start")); PropertyField(m_FarFocusEnd, EditorGUIUtility.TrTextContent("End")); - - if (advanced) - { - GUI.enabled = useCustomValue; - PropertyField(m_FarSampleCount, EditorGUIUtility.TrTextContent("Sample Count")); - PropertyField(m_FarMaxBlur, EditorGUIUtility.TrTextContent("Max Radius")); - GUI.enabled = true; - } } + } + + void DrawQualitySettings() + { + EditorGUI.BeginChangeCheck(); + EditorGUILayout.LabelField("Near Blur", EditorStyles.miniLabel); + PropertyField(m_NearSampleCount, EditorGUIUtility.TrTextContent("Sample Count")); + PropertyField(m_NearMaxBlur, EditorGUIUtility.TrTextContent("Max Radius")); + + EditorGUILayout.LabelField("Far Blur", EditorStyles.miniLabel); + PropertyField(m_FarSampleCount, EditorGUIUtility.TrTextContent("Sample Count")); + PropertyField(m_FarMaxBlur, EditorGUIUtility.TrTextContent("Max Radius")); - if (advanced) + if (isInAdvancedMode) { - GUI.enabled = useCustomValue; EditorGUILayout.LabelField("Advanced Tweaks", EditorStyles.miniLabel); PropertyField(m_Resolution); PropertyField(m_HighQualityFiltering); - GUI.enabled = true; } + + if (EditorGUI.EndChangeCheck()) + { + QualitySettingsWereChanged(); + } + } + + class QualitySettings + { + public int nearSampleCount; + public float nearMaxBlur; + public int farSampleCount; + public float farMaxBlur; + public DepthOfFieldResolution resolution; + public bool hqFiltering; + } + + public override void LoadSettingsFromObject(object settings) + { + QualitySettings qualitySettings = settings as QualitySettings; + + m_NearSampleCount.value.intValue = qualitySettings.nearSampleCount; + m_NearMaxBlur.value.floatValue = qualitySettings.nearMaxBlur; + m_FarSampleCount.value.intValue = qualitySettings.farSampleCount; + m_FarMaxBlur.value.floatValue = qualitySettings.farMaxBlur; + m_Resolution.value.intValue = (int) qualitySettings.resolution; + m_HighQualityFiltering.value.boolValue = qualitySettings.hqFiltering; + } + + public override void LoadSettingsFromQualityPreset(RenderPipelineSettings settings, int level) + { + m_NearSampleCount.value.intValue = settings.postProcessQualitySettings.NearBlurSampleCount[level]; + m_NearMaxBlur.value.floatValue = settings.postProcessQualitySettings.NearBlurMaxRadius[level]; + + m_FarSampleCount.value.intValue = settings.postProcessQualitySettings.FarBlurSampleCount[level]; + m_FarMaxBlur.value.floatValue = settings.postProcessQualitySettings.FarBlurMaxRadius[level]; + + m_Resolution.value.intValue = (int) settings.postProcessQualitySettings.DoFResolution[level]; + m_HighQualityFiltering.value.boolValue = settings.postProcessQualitySettings.DoFHighQualityFiltering[level]; + } + + public override object SaveCustomQualitySettingsAsObject(object history) + { + + QualitySettings qualitySettings = (history != null) ? history as QualitySettings : new QualitySettings(); + + qualitySettings.nearSampleCount = m_NearSampleCount.value.intValue; + qualitySettings.nearMaxBlur = m_NearMaxBlur.value.floatValue; + qualitySettings.farSampleCount = m_FarSampleCount.value.intValue; + qualitySettings.farMaxBlur = m_FarMaxBlur.value.floatValue; + qualitySettings.resolution = (DepthOfFieldResolution) m_Resolution.value.intValue; + qualitySettings.hqFiltering = m_HighQualityFiltering.value.boolValue; + return qualitySettings; } } } diff --git a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/HDEditorUtils.cs b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/HDEditorUtils.cs index 29c7745ea9b..feec94f331e 100644 --- a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/HDEditorUtils.cs +++ b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/HDEditorUtils.cs @@ -277,6 +277,30 @@ internal static void HandlePrefixLabelWithIndent(Rect totalPosition, Rect labelP labelPosition.x += EditorGUI.indentLevel * 15; EditorGUI.HandlePrefixLabel(totalPosition, labelPosition, label); } + + /// + /// Like EditorGUI.indentLevel++ but this one will also indent the override checkboxes + /// + internal static void BeginIndent() + { + // When using EditorGUI.indentLevel++, the clicking on the checkboxes does not work properly due to some issues on the C++ side. + // This function is a work-around for this issue. + const float offset = 15f; + GUILayout.BeginHorizontal(); + EditorGUILayout.Space(offset, false); + GUILayout.BeginVertical(); + EditorGUIUtility.labelWidth -= offset; + } + + /// + /// To be used for resetting the indetation after calling BeginIndent + /// + internal static void EndIndent() + { + EditorGUIUtility.labelWidth = 0f; + GUILayout.EndVertical(); + GUILayout.EndHorizontal(); + } } internal static partial class SerializedPropertyExtension diff --git a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs index c790e1c7918..02632da9968 100644 --- a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs @@ -1,3 +1,5 @@ +using System.Runtime.CompilerServices; +using UnityEngine.Rendering; using UnityEngine.Rendering.HighDefinition; namespace UnityEditor.Rendering.HighDefinition @@ -6,6 +8,9 @@ internal abstract class VolumeComponentWithQualityEditor : VolumeComponentEditor { // Quality settings SerializedDataParameter m_QualitySetting; + static ConditionalWeakTable s_CustomSettingsHistory = new ConditionalWeakTable(); + + static readonly int k_CustomQuality = ScalableSettingLevelParameter.LevelCount; public override void OnEnable() { @@ -13,9 +18,64 @@ public override void OnEnable() m_QualitySetting = Unpack(o.Find(x => x.quality)); } - public override void OnInspectorGUI() =>PropertyField(m_QualitySetting); + public override void OnInspectorGUI() + { + int prevQualityLevel = m_QualitySetting.value.intValue; + + EditorGUI.BeginChangeCheck(); + PropertyField(m_QualitySetting); + + // When the quality changes, we want to detect and reflect the changes in the UI + if (EditorGUI.EndChangeCheck()) + { + serializedObject.Update(); + int newQualityLevel = m_QualitySetting.value.intValue; + + + if (newQualityLevel == k_CustomQuality && prevQualityLevel != k_CustomQuality) + { + // If custom quality was selected, then load the last custom quality settings the user has used in this volume + object history = null; + s_CustomSettingsHistory.TryGetValue(serializedObject.targetObject, out history); + if (history != null) + { + LoadSettingsFromObject(history); + } + } + else + { + // If we are going to use a quality preset, then load the preset values so they are reflected in the UI + var pipeline = (HDRenderPipeline)RenderPipelineManager.currentPipeline; + if (pipeline != null) + { + // If we switch from a custom quality level, then save these values so we can re-use them if teh user switches back + if (prevQualityLevel == k_CustomQuality) + { + int key = serializedObject.targetObject.GetInstanceID(); + object history = null; + s_CustomSettingsHistory.TryGetValue(serializedObject.targetObject, out history); + if (history != null) + { + SaveCustomQualitySettingsAsObject(history); + } + else + { + s_CustomSettingsHistory.Add(serializedObject.targetObject, SaveCustomQualitySettingsAsObject()); + } + } + LoadSettingsFromQualityPreset(pipeline.currentPlatformRenderPipelineSettings, newQualityLevel); + } + } + } + } + + protected bool useCustomValue => m_QualitySetting.value.intValue == k_CustomQuality; + + public void QualitySettingsWereChanged() { m_QualitySetting.value.intValue = k_CustomQuality; } + public virtual void LoadSettingsFromQualityPreset(RenderPipelineSettings settings, int level) { } + public virtual void LoadSettingsFromObject(object settings) { } + public virtual object SaveCustomQualitySettingsAsObject(object history = null) { return null;} - protected bool useCustomValue => m_QualitySetting.value.intValue == ScalableSettingLevelParameter.LevelCount; } } From b61c5a1ecee0e732d2219bbf63dbb1106f1bbb9f Mon Sep 17 00:00:00 2001 From: Pavlos Mavridis Date: Wed, 10 Jun 2020 01:05:52 +0200 Subject: [PATCH 02/39] Changelog --- 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 69d1b936354..e50057855fb 100644 --- a/com.unity.render-pipelines.high-definition/CHANGELOG.md +++ b/com.unity.render-pipelines.high-definition/CHANGELOG.md @@ -802,6 +802,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - Increased path tracing BSDFs roughness range from [0.001, 0.999] to [0.00001, 0.99999]. - Changing the default SSGI radius for the all configurations. - Changed the default parameters for quality RTGI to match expected behavior. +- Improved DoF UI/UX (case 1240204) ## [7.1.1] - 2019-09-05 From 8f49a9ea3496bf369874fa4abf31b476bd49863d Mon Sep 17 00:00:00 2001 From: Pavlos Mavridis Date: Wed, 10 Jun 2020 09:35:23 +0200 Subject: [PATCH 03/39] Comments --- .../PostProcessing/DepthOfFieldEditor.cs | 9 ++++--- .../VolumeComponentWithQualityEditor.cs | 27 ++++++++++++++++--- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs index 45181143199..8f12e56d4f4 100644 --- a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs @@ -130,7 +130,9 @@ void DrawQualitySettings() } } - class QualitySettings + /// An opaque binary blob storing preset settings (used to remember what were the last custom settings that were used). + /// For the functionality to save and restore the settings + class QualitySettingsBlob { public int nearSampleCount; public float nearMaxBlur; @@ -142,7 +144,7 @@ class QualitySettings public override void LoadSettingsFromObject(object settings) { - QualitySettings qualitySettings = settings as QualitySettings; + QualitySettingsBlob qualitySettings = settings as QualitySettingsBlob; m_NearSampleCount.value.intValue = qualitySettings.nearSampleCount; m_NearMaxBlur.value.floatValue = qualitySettings.nearMaxBlur; @@ -166,8 +168,7 @@ public override void LoadSettingsFromQualityPreset(RenderPipelineSettings settin public override object SaveCustomQualitySettingsAsObject(object history) { - - QualitySettings qualitySettings = (history != null) ? history as QualitySettings : new QualitySettings(); + QualitySettingsBlob qualitySettings = (history != null) ? history as QualitySettingsBlob : new QualitySettingsBlob(); qualitySettings.nearSampleCount = m_NearSampleCount.value.intValue; qualitySettings.nearMaxBlur = m_NearMaxBlur.value.floatValue; diff --git a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs index 02632da9968..67db8ffc089 100644 --- a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs @@ -8,6 +8,9 @@ internal abstract class VolumeComponentWithQualityEditor : VolumeComponentEditor { // Quality settings SerializedDataParameter m_QualitySetting; + + // Note: Editors are refreshed on gui changes by the volume system, so any state that we want to store here needs to be a static (or in a serialized variable) + // We use ConditionalWeakTable instead of a Dictionary of InstanceIDs to get automatic clean-up of dead entries in the table static ConditionalWeakTable s_CustomSettingsHistory = new ConditionalWeakTable(); static readonly int k_CustomQuality = ScalableSettingLevelParameter.LevelCount; @@ -25,13 +28,14 @@ public override void OnInspectorGUI() EditorGUI.BeginChangeCheck(); PropertyField(m_QualitySetting); - // When the quality changes, we want to detect and reflect the changes in the UI + // When a quality preset changes, we want to detect and reflect the settings in the UI. PropertyFields mirror the contents of one memory loccation, so + // the idea is that we copy the presets to that location. This logic is optional, if volume components don't override the helper functions at the end, + // they will continue to work, but the preset settings will not be reflected in the UI. if (EditorGUI.EndChangeCheck()) { serializedObject.Update(); int newQualityLevel = m_QualitySetting.value.intValue; - - + if (newQualityLevel == k_CustomQuality && prevQualityLevel != k_CustomQuality) { // If custom quality was selected, then load the last custom quality settings the user has used in this volume @@ -71,10 +75,25 @@ public override void OnInspectorGUI() protected bool useCustomValue => m_QualitySetting.value.intValue == k_CustomQuality; + /// + /// This should be called after the user manually edits a quality setting that appears in a preset. After calling this function, the quality preset will change to Custom. + /// public void QualitySettingsWereChanged() { m_QualitySetting.value.intValue = k_CustomQuality; } + + /// + /// This function should be overriden by a volume component to load preset settings from RenderPipelineSettings + /// public virtual void LoadSettingsFromQualityPreset(RenderPipelineSettings settings, int level) { } + + /// + /// This function should be overriden by a volume component to return an opaque object (binary blob) with the custom quality settings currently in use. + /// + public virtual object SaveCustomQualitySettingsAsObject(object history = null) { return null; } + + /// + /// This function should be overriden by a volume component to load a custom preset setting from an opaque binary blob (as returned from SaveCustomQualitySettingsAsObject) + /// public virtual void LoadSettingsFromObject(object settings) { } - public virtual object SaveCustomQualitySettingsAsObject(object history = null) { return null;} } From 928d890a108bcb4d76f912f3ee6c4e46a0a61a84 Mon Sep 17 00:00:00 2001 From: Pavlos Mavridis Date: Wed, 10 Jun 2020 11:06:43 +0200 Subject: [PATCH 04/39] Avoid storing nulls in the history table --- .../RenderPipeline/VolumeComponentWithQualityEditor.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs index 67db8ffc089..c34ef3feffb 100644 --- a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs @@ -64,7 +64,13 @@ public override void OnInspectorGUI() } else { - s_CustomSettingsHistory.Add(serializedObject.targetObject, SaveCustomQualitySettingsAsObject()); + // Only keep track of custom settings for components that implement the new interface (and return not null) + history = SaveCustomQualitySettingsAsObject(); + if (history != null) + { + s_CustomSettingsHistory.Add(serializedObject.targetObject, history); + } + } } LoadSettingsFromQualityPreset(pipeline.currentPlatformRenderPipelineSettings, newQualityLevel); From 933448c0a544a9844cdf365deb9790170dcfc6d9 Mon Sep 17 00:00:00 2001 From: Pavlos Mavridis Date: Wed, 10 Jun 2020 12:24:46 +0200 Subject: [PATCH 05/39] Properly read selected quality preset + other bugfix --- .../VolumeComponentWithQualityEditor.cs | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs index c34ef3feffb..b33812d071c 100644 --- a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs @@ -24,7 +24,7 @@ public override void OnEnable() public override void OnInspectorGUI() { int prevQualityLevel = m_QualitySetting.value.intValue; - + EditorGUI.BeginChangeCheck(); PropertyField(m_QualitySetting); @@ -33,17 +33,24 @@ public override void OnInspectorGUI() // they will continue to work, but the preset settings will not be reflected in the UI. if (EditorGUI.EndChangeCheck()) { - serializedObject.Update(); - int newQualityLevel = m_QualitySetting.value.intValue; - - if (newQualityLevel == k_CustomQuality && prevQualityLevel != k_CustomQuality) + // The ScalableSettingLevelParameterEditor updates the value of the referenced object directly (and not the reflected one), + // so this is what we have to do to get the new value selected by the user: + var o = m_QualitySetting.GetObjectRef(); + var (preset, custom) = o.levelAndOverride; + int newQualityLevel = custom ? 3 : preset; + m_QualitySetting.value.intValue = newQualityLevel; + + if (newQualityLevel == k_CustomQuality) { - // If custom quality was selected, then load the last custom quality settings the user has used in this volume - object history = null; - s_CustomSettingsHistory.TryGetValue(serializedObject.targetObject, out history); - if (history != null) + // If we have switched to custom quality from a preset, then load the last custom quality settings the user has used in this volume + if (prevQualityLevel != k_CustomQuality) { - LoadSettingsFromObject(history); + object history = null; + s_CustomSettingsHistory.TryGetValue(serializedObject.targetObject, out history); + if (history != null) + { + LoadSettingsFromObject(history); + } } } else From 9d1e0f0205045aa6d8780dab992426d3961d1205 Mon Sep 17 00:00:00 2001 From: Pavlos Mavridis Date: Wed, 10 Jun 2020 13:41:53 +0200 Subject: [PATCH 06/39] typo --- .../Editor/RenderPipeline/HDEditorUtils.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/HDEditorUtils.cs b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/HDEditorUtils.cs index feec94f331e..3007a4a775f 100644 --- a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/HDEditorUtils.cs +++ b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/HDEditorUtils.cs @@ -293,7 +293,7 @@ internal static void BeginIndent() } /// - /// To be used for resetting the indetation after calling BeginIndent + /// To be used for resetting the indentation after calling BeginIndent /// internal static void EndIndent() { From 0f896e4070223998d4992c84a7988e841944ee32 Mon Sep 17 00:00:00 2001 From: Pavlos Mavridis Date: Wed, 10 Jun 2020 13:45:26 +0200 Subject: [PATCH 07/39] changed comment position --- .../Editor/PostProcessing/DepthOfFieldEditor.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs index 8f12e56d4f4..09f2a3f53b5 100644 --- a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs @@ -58,13 +58,13 @@ public override void OnInspectorGUI() { PropertyField(m_FocusMode); - // Draw the focus mode controls int mode = m_FocusMode.value.intValue; if (mode == (int)DepthOfFieldMode.Off) { GUI.enabled = false; } + // Draw the focus mode controls HDEditorUtils.BeginIndent(); DrawFocusSettings(mode); HDEditorUtils.EndIndent(); From bfe7bd56e1bed2cfdd135b4439c82d7e17a5309b Mon Sep 17 00:00:00 2001 From: Pavlos Mavridis Date: Thu, 11 Jun 2020 10:50:05 +0200 Subject: [PATCH 08/39] don't switch to custom quality if the values were not changed --- .../PostProcessing/DepthOfFieldEditor.cs | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs index 09f2a3f53b5..3cdd558a18d 100644 --- a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs @@ -108,6 +108,7 @@ void DrawFocusSettings(int mode) void DrawQualitySettings() { + object oldSettings = SaveCustomQualitySettingsAsObject(); EditorGUI.BeginChangeCheck(); EditorGUILayout.LabelField("Near Blur", EditorStyles.miniLabel); PropertyField(m_NearSampleCount, EditorGUIUtility.TrTextContent("Sample Count")); @@ -126,7 +127,10 @@ void DrawQualitySettings() if (EditorGUI.EndChangeCheck()) { - QualitySettingsWereChanged(); + object newSettings = SaveCustomQualitySettingsAsObject(); + + if (!oldSettings.Equals(newSettings)) + QualitySettingsWereChanged(); } } @@ -140,6 +144,22 @@ class QualitySettingsBlob public float farMaxBlur; public DepthOfFieldResolution resolution; public bool hqFiltering; + + public override bool Equals(object obj) + { + QualitySettingsBlob right = obj as QualitySettingsBlob; + if (right == null) + { + return false; + } + + return nearSampleCount == right.nearSampleCount + && nearMaxBlur == right.nearMaxBlur + && farSampleCount == right.farSampleCount + && farMaxBlur == right.farMaxBlur + && resolution == right.resolution + && hqFiltering == right.hqFiltering; + } } public override void LoadSettingsFromObject(object settings) @@ -166,7 +186,7 @@ public override void LoadSettingsFromQualityPreset(RenderPipelineSettings settin m_HighQualityFiltering.value.boolValue = settings.postProcessQualitySettings.DoFHighQualityFiltering[level]; } - public override object SaveCustomQualitySettingsAsObject(object history) + public override object SaveCustomQualitySettingsAsObject(object history = null) { QualitySettingsBlob qualitySettings = (history != null) ? history as QualitySettingsBlob : new QualitySettingsBlob(); From ea1b874a8420c5b5f49ba4fbfdcad411d253366b Mon Sep 17 00:00:00 2001 From: Pavlos Mavridis Date: Thu, 11 Jun 2020 18:06:04 +0200 Subject: [PATCH 09/39] avoid compiler warning --- .../PostProcessing/DepthOfFieldEditor.cs | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs index 3cdd558a18d..944f5874e4a 100644 --- a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs @@ -129,7 +129,7 @@ void DrawQualitySettings() { object newSettings = SaveCustomQualitySettingsAsObject(); - if (!oldSettings.Equals(newSettings)) + if (!QualitySettingsBlob.IsEqual(oldSettings as QualitySettingsBlob, newSettings as QualitySettingsBlob)) QualitySettingsWereChanged(); } } @@ -145,20 +145,24 @@ class QualitySettingsBlob public DepthOfFieldResolution resolution; public bool hqFiltering; - public override bool Equals(object obj) + public static bool IsEqual(QualitySettingsBlob left, QualitySettingsBlob right) { - QualitySettingsBlob right = obj as QualitySettingsBlob; - if (right == null) + if ((right == null && left != null) || (right != null && left == null)) { return false; } - return nearSampleCount == right.nearSampleCount - && nearMaxBlur == right.nearMaxBlur - && farSampleCount == right.farSampleCount - && farMaxBlur == right.farMaxBlur - && resolution == right.resolution - && hqFiltering == right.hqFiltering; + if (right == null && left == null) + { + return true; + } + + return left.nearSampleCount == right.nearSampleCount + && left.nearMaxBlur == right.nearMaxBlur + && left.farSampleCount == right.farSampleCount + && left.farMaxBlur == right.farMaxBlur + && left.resolution == right.resolution + && left.hqFiltering == right.hqFiltering; } } From 7920df51476894f6a182ad437c7c2b2f8d93745c Mon Sep 17 00:00:00 2001 From: Pavlos Mavridis Date: Fri, 12 Jun 2020 10:45:28 +0200 Subject: [PATCH 10/39] more UX improvements --- .../Editor/PostProcessing/DepthOfFieldEditor.cs | 10 ++++++++++ .../RenderPipeline/VolumeComponentWithQualityEditor.cs | 1 + 2 files changed, 11 insertions(+) diff --git a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs index 944f5874e4a..426fa2e93b0 100644 --- a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs @@ -74,6 +74,7 @@ public override void OnInspectorGUI() // Draw the quality controls base.OnInspectorGUI(); HDEditorUtils.BeginIndent(); + GUI.enabled = base.overrideState; DrawQualitySettings(); HDEditorUtils.EndIndent(); @@ -188,6 +189,15 @@ public override void LoadSettingsFromQualityPreset(RenderPipelineSettings settin m_Resolution.value.intValue = (int) settings.postProcessQualitySettings.DoFResolution[level]; m_HighQualityFiltering.value.boolValue = settings.postProcessQualitySettings.DoFHighQualityFiltering[level]; + + // set all quality override states to true, to indicate that these values are actually used + m_NearSampleCount.overrideState.boolValue = true; + m_NearMaxBlur.overrideState.boolValue = true; + m_FarSampleCount.overrideState.boolValue = true; + m_FarMaxBlur.overrideState.boolValue = true; + m_Resolution.overrideState.boolValue = true; + m_HighQualityFiltering.overrideState.boolValue = true; + } public override object SaveCustomQualitySettingsAsObject(object history = null) diff --git a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs index b33812d071c..3d4cbb9e06e 100644 --- a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs @@ -87,6 +87,7 @@ public override void OnInspectorGUI() } protected bool useCustomValue => m_QualitySetting.value.intValue == k_CustomQuality; + protected bool overrideState => m_QualitySetting.overrideState.boolValue; /// /// This should be called after the user manually edits a quality setting that appears in a preset. After calling this function, the quality preset will change to Custom. From 25dc52ffc9f249dc0cbbcafb099994f206b4cef9 Mon Sep 17 00:00:00 2001 From: Pavlos Mavridis Date: Fri, 12 Jun 2020 11:42:37 +0200 Subject: [PATCH 11/39] make the override state of quality settings part of the memory we keep for custom settings --- .../PostProcessing/DepthOfFieldEditor.cs | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs index 426fa2e93b0..7771119a478 100644 --- a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs @@ -146,6 +146,8 @@ class QualitySettingsBlob public DepthOfFieldResolution resolution; public bool hqFiltering; + public bool[] overrideState = new bool[6]; + public static bool IsEqual(QualitySettingsBlob left, QualitySettingsBlob right) { if ((right == null && left != null) || (right != null && left == null)) @@ -158,6 +160,14 @@ public static bool IsEqual(QualitySettingsBlob left, QualitySettingsBlob right) return true; } + for (int i=0; i < left.overrideState.Length; ++i) + { + if (left.overrideState[i] != right.overrideState[i]) + { + return false; + } + } + return left.nearSampleCount == right.nearSampleCount && left.nearMaxBlur == right.nearMaxBlur && left.farSampleCount == right.farSampleCount @@ -177,6 +187,13 @@ public override void LoadSettingsFromObject(object settings) m_FarMaxBlur.value.floatValue = qualitySettings.farMaxBlur; m_Resolution.value.intValue = (int) qualitySettings.resolution; m_HighQualityFiltering.value.boolValue = qualitySettings.hqFiltering; + + m_NearSampleCount.overrideState.boolValue = qualitySettings.overrideState[0]; + m_NearMaxBlur.overrideState.boolValue = qualitySettings.overrideState[1]; + m_FarSampleCount.overrideState.boolValue = qualitySettings.overrideState[2]; + m_FarMaxBlur.overrideState.boolValue = qualitySettings.overrideState[3]; + m_Resolution.overrideState.boolValue = qualitySettings.overrideState[4]; + m_HighQualityFiltering.overrideState.boolValue = qualitySettings.overrideState[5]; } public override void LoadSettingsFromQualityPreset(RenderPipelineSettings settings, int level) @@ -210,6 +227,14 @@ public override object SaveCustomQualitySettingsAsObject(object history = null) qualitySettings.farMaxBlur = m_FarMaxBlur.value.floatValue; qualitySettings.resolution = (DepthOfFieldResolution) m_Resolution.value.intValue; qualitySettings.hqFiltering = m_HighQualityFiltering.value.boolValue; + + qualitySettings.overrideState[0] = m_NearSampleCount.overrideState.boolValue; + qualitySettings.overrideState[1] = m_NearMaxBlur.overrideState.boolValue; + qualitySettings.overrideState[2] = m_FarSampleCount.overrideState.boolValue; + qualitySettings.overrideState[3] = m_FarMaxBlur.overrideState.boolValue; + qualitySettings.overrideState[4] = m_Resolution.overrideState.boolValue; + qualitySettings.overrideState[5] = m_HighQualityFiltering.overrideState.boolValue; + return qualitySettings; } } From 114fbcc18f97f99e5898618a92d2441c9ece8fd7 Mon Sep 17 00:00:00 2001 From: Pavlos Mavridis Date: Fri, 12 Jun 2020 13:30:04 +0200 Subject: [PATCH 12/39] fix minor UI issue when DoFis disabled --- .../Editor/PostProcessing/DepthOfFieldEditor.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs index 7771119a478..eae91f55b7e 100644 --- a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs @@ -74,7 +74,7 @@ public override void OnInspectorGUI() // Draw the quality controls base.OnInspectorGUI(); HDEditorUtils.BeginIndent(); - GUI.enabled = base.overrideState; + GUI.enabled = GUI.enabled && base.overrideState; DrawQualitySettings(); HDEditorUtils.EndIndent(); From a58074d7ff9b9c7155b84f3cc50fae2222f15faa Mon Sep 17 00:00:00 2001 From: John Parsaie Date: Wed, 8 Jul 2020 18:03:05 -0400 Subject: [PATCH 13/39] Serialization for quality parameters was fixed, so we can ask for the new quality level directly --- .../RenderPipeline/VolumeComponentWithQualityEditor.cs | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs index 3d4cbb9e06e..d4866114914 100644 --- a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs @@ -33,12 +33,7 @@ public override void OnInspectorGUI() // they will continue to work, but the preset settings will not be reflected in the UI. if (EditorGUI.EndChangeCheck()) { - // The ScalableSettingLevelParameterEditor updates the value of the referenced object directly (and not the reflected one), - // so this is what we have to do to get the new value selected by the user: - var o = m_QualitySetting.GetObjectRef(); - var (preset, custom) = o.levelAndOverride; - int newQualityLevel = custom ? 3 : preset; - m_QualitySetting.value.intValue = newQualityLevel; + int newQualityLevel = m_QualitySetting.value.intValue; if (newQualityLevel == k_CustomQuality) { From a1cfe51510786ce00edfa3bbe82c9d51ebcb8cbc Mon Sep 17 00:00:00 2001 From: John Parsaie Date: Thu, 9 Jul 2020 10:40:55 -0400 Subject: [PATCH 14/39] Introduce the HDEditorUtils.IndentScope --- .../PostProcessing/DepthOfFieldEditor.cs | 21 ++++++----- .../Editor/RenderPipeline/HDEditorUtils.cs | 35 +++++++++---------- 2 files changed, 29 insertions(+), 27 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs index 83864f21b10..44e71baedf4 100644 --- a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs @@ -78,19 +78,22 @@ public override void OnInspectorGUI() GUI.enabled = false; } - // Draw the focus mode controls - HDEditorUtils.BeginIndent(); - DrawFocusSettings(mode); - HDEditorUtils.EndIndent(); + using (new HDEditorUtils.IndentScope()) + { + // Draw the focus mode controls + DrawFocusSettings(mode); + } EditorGUILayout.Space(); - // Draw the quality controls base.OnInspectorGUI(); - HDEditorUtils.BeginIndent(); - GUI.enabled = GUI.enabled && base.overrideState; - DrawQualitySettings(); - HDEditorUtils.EndIndent(); + + using (new HDEditorUtils.IndentScope()) + { + // Draw the quality controls + GUI.enabled = GUI.enabled && base.overrideState; + DrawQualitySettings(); + } GUI.enabled = true; } diff --git a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/HDEditorUtils.cs b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/HDEditorUtils.cs index 2dbc5d9eb2d..954624aba96 100644 --- a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/HDEditorUtils.cs +++ b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/HDEditorUtils.cs @@ -295,27 +295,26 @@ internal static void HandlePrefixLabelWithIndent(Rect totalPosition, Rect labelP } /// - /// Like EditorGUI.indentLevel++ but this one will also indent the override checkboxes + /// Like EditorGUI.IndentLevelScope but this one will also indent the override checkboxes. /// - internal static void BeginIndent() + internal class IndentScope : GUI.Scope { - // When using EditorGUI.indentLevel++, the clicking on the checkboxes does not work properly due to some issues on the C++ side. - // This function is a work-around for this issue. - const float offset = 15f; - GUILayout.BeginHorizontal(); - EditorGUILayout.Space(offset, false); - GUILayout.BeginVertical(); - EditorGUIUtility.labelWidth -= offset; - } + public IndentScope(int offset = 15) + { + // When using EditorGUI.indentLevel++, the clicking on the checkboxes does not work properly due to some issues on the C++ side. + // This scope is a work-around for this issue. + GUILayout.BeginHorizontal(); + EditorGUILayout.Space(offset, false); + GUILayout.BeginVertical(); + EditorGUIUtility.labelWidth -= offset; + } - /// - /// To be used for resetting the indentation after calling BeginIndent - /// - internal static void EndIndent() - { - EditorGUIUtility.labelWidth = 0f; - GUILayout.EndVertical(); - GUILayout.EndHorizontal(); + protected override void CloseScope() + { + EditorGUIUtility.labelWidth = 0f; + GUILayout.EndVertical(); + GUILayout.EndHorizontal(); + } } } From 8e2da0fc76593549292dacb623db5ce75513e7f5 Mon Sep 17 00:00:00 2001 From: John Parsaie Date: Thu, 9 Jul 2020 15:50:14 -0400 Subject: [PATCH 15/39] Generalize the quality setting blob before introducing changes to the rest of the quality volume editors --- .../PostProcessing/DepthOfFieldEditor.cs | 39 +++++----------- .../VolumeComponentWithQualityEditor.cs | 45 ++++++++++++++++--- 2 files changed, 49 insertions(+), 35 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs index 44e71baedf4..424c3bec29a 100644 --- a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs @@ -147,14 +147,12 @@ void DrawQualitySettings() { object newSettings = SaveCustomQualitySettingsAsObject(); - if (!QualitySettingsBlob.IsEqual(oldSettings as QualitySettingsBlob, newSettings as QualitySettingsBlob)) + if (!DepthOfFieldQualitySettingsBlob.IsEqual(oldSettings as DepthOfFieldQualitySettingsBlob, newSettings as DepthOfFieldQualitySettingsBlob)) QualitySettingsWereChanged(); } } - /// An opaque binary blob storing preset settings (used to remember what were the last custom settings that were used). - /// For the functionality to save and restore the settings - class QualitySettingsBlob + class DepthOfFieldQualitySettingsBlob : QualitySettingsBlob { public int nearSampleCount; public float nearMaxBlur; @@ -163,29 +161,12 @@ class QualitySettingsBlob public DepthOfFieldResolution resolution; public bool hqFiltering; - public bool[] overrideState = new bool[6]; + public DepthOfFieldQualitySettingsBlob() : base(6) {} - public static bool IsEqual(QualitySettingsBlob left, QualitySettingsBlob right) + public static bool IsEqual(DepthOfFieldQualitySettingsBlob left, DepthOfFieldQualitySettingsBlob right) { - if ((right == null && left != null) || (right != null && left == null)) - { - return false; - } - - if (right == null && left == null) - { - return true; - } - - for (int i=0; i < left.overrideState.Length; ++i) - { - if (left.overrideState[i] != right.overrideState[i]) - { - return false; - } - } - - return left.nearSampleCount == right.nearSampleCount + return QualitySettingsBlob.IsEqual(left, right) + && left.nearSampleCount == right.nearSampleCount && left.nearMaxBlur == right.nearMaxBlur && left.farSampleCount == right.farSampleCount && left.farMaxBlur == right.farMaxBlur @@ -194,9 +175,9 @@ public static bool IsEqual(QualitySettingsBlob left, QualitySettingsBlob right) } } - public override void LoadSettingsFromObject(object settings) + public override void LoadSettingsFromObject(QualitySettingsBlob settings) { - QualitySettingsBlob qualitySettings = settings as QualitySettingsBlob; + DepthOfFieldQualitySettingsBlob qualitySettings = settings as DepthOfFieldQualitySettingsBlob; m_NearSampleCount.value.intValue = qualitySettings.nearSampleCount; m_NearMaxBlur.value.floatValue = qualitySettings.nearMaxBlur; @@ -234,9 +215,9 @@ public override void LoadSettingsFromQualityPreset(RenderPipelineSettings settin } - public override object SaveCustomQualitySettingsAsObject(object history = null) + public override QualitySettingsBlob SaveCustomQualitySettingsAsObject(QualitySettingsBlob history = null) { - QualitySettingsBlob qualitySettings = (history != null) ? history as QualitySettingsBlob : new QualitySettingsBlob(); + DepthOfFieldQualitySettingsBlob qualitySettings = (history != null) ? history as DepthOfFieldQualitySettingsBlob : new DepthOfFieldQualitySettingsBlob(); qualitySettings.nearSampleCount = m_NearSampleCount.value.intValue; qualitySettings.nearMaxBlur = m_NearMaxBlur.value.floatValue; diff --git a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs index d4866114914..e43428e5a49 100644 --- a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs @@ -9,9 +9,43 @@ internal abstract class VolumeComponentWithQualityEditor : VolumeComponentEditor // Quality settings SerializedDataParameter m_QualitySetting; + // An opaque binary blob storing preset settings (used to remember what were the last custom settings that were used). + internal abstract class QualitySettingsBlob + { + public bool[] overrideState; + + protected QualitySettingsBlob(int settingsCount) + { + overrideState = new bool[settingsCount]; + } + + protected static bool IsEqual (QualitySettingsBlob left, QualitySettingsBlob right) + { + if ((right == null && left != null) || (right != null && left == null)) + { + return false; + } + + if (right == null && left == null) + { + return true; + } + + for (int i = 0; i < left.overrideState.Length; ++i) + { + if (left.overrideState[i] != right.overrideState[i]) + { + return false; + } + } + + return true; + } + } + // Note: Editors are refreshed on gui changes by the volume system, so any state that we want to store here needs to be a static (or in a serialized variable) // We use ConditionalWeakTable instead of a Dictionary of InstanceIDs to get automatic clean-up of dead entries in the table - static ConditionalWeakTable s_CustomSettingsHistory = new ConditionalWeakTable(); + static ConditionalWeakTable s_CustomSettingsHistory = new ConditionalWeakTable(); static readonly int k_CustomQuality = ScalableSettingLevelParameter.LevelCount; @@ -40,7 +74,7 @@ public override void OnInspectorGUI() // If we have switched to custom quality from a preset, then load the last custom quality settings the user has used in this volume if (prevQualityLevel != k_CustomQuality) { - object history = null; + QualitySettingsBlob history = null; s_CustomSettingsHistory.TryGetValue(serializedObject.targetObject, out history); if (history != null) { @@ -57,8 +91,7 @@ public override void OnInspectorGUI() // If we switch from a custom quality level, then save these values so we can re-use them if teh user switches back if (prevQualityLevel == k_CustomQuality) { - int key = serializedObject.targetObject.GetInstanceID(); - object history = null; + QualitySettingsBlob history = null; s_CustomSettingsHistory.TryGetValue(serializedObject.targetObject, out history); if (history != null) { @@ -97,12 +130,12 @@ public virtual void LoadSettingsFromQualityPreset(RenderPipelineSettings setting /// /// This function should be overriden by a volume component to return an opaque object (binary blob) with the custom quality settings currently in use. /// - public virtual object SaveCustomQualitySettingsAsObject(object history = null) { return null; } + public virtual QualitySettingsBlob SaveCustomQualitySettingsAsObject(QualitySettingsBlob history = null) { return null; } /// /// This function should be overriden by a volume component to load a custom preset setting from an opaque binary blob (as returned from SaveCustomQualitySettingsAsObject) /// - public virtual void LoadSettingsFromObject(object settings) { } + public virtual void LoadSettingsFromObject(QualitySettingsBlob settings) { } } From 0f8e91bc6960293625f8cc9ab0ad3cba64b425be Mon Sep 17 00:00:00 2001 From: John Parsaie Date: Thu, 9 Jul 2020 16:43:55 -0400 Subject: [PATCH 16/39] Introduce scalability change for chromatic abberation --- .../ChromaticAberrationEditor.cs | 66 +++++++++++++++++-- .../PostProcessing/DepthOfFieldEditor.cs | 4 +- .../VolumeComponentWithQualityEditor.cs | 4 +- 3 files changed, 66 insertions(+), 8 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/ChromaticAberrationEditor.cs b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/ChromaticAberrationEditor.cs index 19aec57dc05..8c05cdfb85e 100644 --- a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/ChromaticAberrationEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/ChromaticAberrationEditor.cs @@ -23,14 +23,72 @@ public override void OnEnable() public override void OnInspectorGUI() { - base.OnInspectorGUI(); - PropertyField(m_SpectralLUT); PropertyField(m_Intensity); - GUI.enabled = useCustomValue; - PropertyField(m_MaxSamples); + + base.OnInspectorGUI(); + using (new HDEditorUtils.IndentScope()) + { + GUI.enabled = GUI.enabled && base.overrideState; + DrawQualitySettings(); + } + GUI.enabled = true; } + + void DrawQualitySettings() + { + QualitySettingsBlob oldSettings = SaveCustomQualitySettingsAsObject(); + EditorGUI.BeginChangeCheck(); + + PropertyField(m_MaxSamples); + + if (EditorGUI.EndChangeCheck()) + { + QualitySettingsBlob newSettings = SaveCustomQualitySettingsAsObject(); + + if (!ChromaticAberrationQualitySettingsBlob.IsEqual(oldSettings as ChromaticAberrationQualitySettingsBlob, newSettings as ChromaticAberrationQualitySettingsBlob)) + QualitySettingsWereChanged(); + } + } + + class ChromaticAberrationQualitySettingsBlob : QualitySettingsBlob + { + public int maxSamples; + + public ChromaticAberrationQualitySettingsBlob() : base(1) { } + + public static bool IsEqual(ChromaticAberrationQualitySettingsBlob left, ChromaticAberrationQualitySettingsBlob right) + { + return QualitySettingsBlob.IsEqual(left, right) + && left.maxSamples == right.maxSamples; + } + } + + public override void LoadSettingsFromObject(QualitySettingsBlob settings) + { + ChromaticAberrationQualitySettingsBlob qualitySettings = settings as ChromaticAberrationQualitySettingsBlob; + + m_MaxSamples.value.intValue = qualitySettings.maxSamples; + m_MaxSamples.overrideState.boolValue = qualitySettings.overrideState[0]; + } + + public override void LoadSettingsFromQualityPreset(RenderPipelineSettings settings, int level) + { + m_MaxSamples.value.intValue = settings.postProcessQualitySettings.ChromaticAberrationMaxSamples[level]; + + m_MaxSamples.overrideState.boolValue = true; + } + + public override QualitySettingsBlob SaveCustomQualitySettingsAsObject(QualitySettingsBlob history = null) + { + ChromaticAberrationQualitySettingsBlob qualitySettings = (history != null) ? history as ChromaticAberrationQualitySettingsBlob : new ChromaticAberrationQualitySettingsBlob(); + + qualitySettings.maxSamples = m_MaxSamples.value.intValue; + qualitySettings.overrideState[0] = m_MaxSamples.overrideState.boolValue; + + return qualitySettings; + } } } diff --git a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs index 424c3bec29a..25b10565200 100644 --- a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs @@ -126,7 +126,7 @@ void DrawFocusSettings(int mode) void DrawQualitySettings() { - object oldSettings = SaveCustomQualitySettingsAsObject(); + QualitySettingsBlob oldSettings = SaveCustomQualitySettingsAsObject(); EditorGUI.BeginChangeCheck(); EditorGUILayout.LabelField("Near Blur", EditorStyles.miniLabel); PropertyField(m_NearSampleCount, EditorGUIUtility.TrTextContent("Sample Count")); @@ -145,7 +145,7 @@ void DrawQualitySettings() if (EditorGUI.EndChangeCheck()) { - object newSettings = SaveCustomQualitySettingsAsObject(); + QualitySettingsBlob newSettings = SaveCustomQualitySettingsAsObject(); if (!DepthOfFieldQualitySettingsBlob.IsEqual(oldSettings as DepthOfFieldQualitySettingsBlob, newSettings as DepthOfFieldQualitySettingsBlob)) QualitySettingsWereChanged(); diff --git a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs index e43428e5a49..cd37c5947dd 100644 --- a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs @@ -14,9 +14,9 @@ internal abstract class QualitySettingsBlob { public bool[] overrideState; - protected QualitySettingsBlob(int settingsCount) + protected QualitySettingsBlob(int overrideCount) { - overrideState = new bool[settingsCount]; + overrideState = new bool[overrideCount]; } protected static bool IsEqual (QualitySettingsBlob left, QualitySettingsBlob right) From a51d8ac32b6ebaea6c894b48687d17cf610c7da8 Mon Sep 17 00:00:00 2001 From: John Parsaie Date: Thu, 9 Jul 2020 17:06:05 -0400 Subject: [PATCH 17/39] Introduce scalability change for contact shadow --- .../Lighting/Shadow/ContactShadowsEditor.cs | 62 ++++++++++++++++++- 1 file changed, 60 insertions(+), 2 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/Lighting/Shadow/ContactShadowsEditor.cs b/com.unity.render-pipelines.high-definition/Editor/Lighting/Shadow/ContactShadowsEditor.cs index a97685d796e..1f668530ecc 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Lighting/Shadow/ContactShadowsEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Lighting/Shadow/ContactShadowsEditor.cs @@ -49,11 +49,69 @@ public override void OnInspectorGUI() PropertyField(m_FadeInDistance, EditorGUIUtility.TrTextContent("Fade In Distance", "Sets the distance over which HDRP fades Contact Shadows in when past the Min Distance. Uses meters.")); PropertyField(m_FadeDistance, EditorGUIUtility.TrTextContent("Fade Out Distance", "Sets the distance over which HDRP fades Contact Shadows out when at the Max Distance. Uses meters.")); PropertyField(m_Opacity, EditorGUIUtility.TrTextContent("Opacity", "Controls the opacity of the Contact Shadow.")); + base.OnInspectorGUI(); - GUI.enabled = useCustomValue; - PropertyField(m_SampleCount, EditorGUIUtility.TrTextContent("Sample Count", "Controls the number of samples HDRP uses for ray casting.")); + + using (new HDEditorUtils.IndentScope()) + { + GUI.enabled = GUI.enabled && base.overrideState; + DrawQualitySettings(); + } + GUI.enabled = true; } } + + void DrawQualitySettings() + { + QualitySettingsBlob oldSettings = SaveCustomQualitySettingsAsObject(); + EditorGUI.BeginChangeCheck(); + + PropertyField(m_SampleCount, EditorGUIUtility.TrTextContent("Sample Count", "Controls the number of samples HDRP uses for ray casting.")); + + if (EditorGUI.EndChangeCheck()) + { + QualitySettingsBlob newSettings = SaveCustomQualitySettingsAsObject(); + + if (!ContactShadowsQualitySettingsBlob.IsEqual(oldSettings as ContactShadowsQualitySettingsBlob, newSettings as ContactShadowsQualitySettingsBlob)) + QualitySettingsWereChanged(); + } + } + + class ContactShadowsQualitySettingsBlob : QualitySettingsBlob + { + public int sampleCount; + + public ContactShadowsQualitySettingsBlob() : base(1) { } + + public static bool IsEqual(ContactShadowsQualitySettingsBlob left, ContactShadowsQualitySettingsBlob right) + { + return QualitySettingsBlob.IsEqual(left, right) + && left.sampleCount == right.sampleCount; + } + } + + public override void LoadSettingsFromObject(QualitySettingsBlob settings) + { + ContactShadowsQualitySettingsBlob qualitySettings = settings as ContactShadowsQualitySettingsBlob; + m_SampleCount.value.intValue = qualitySettings.sampleCount; + m_SampleCount.overrideState.boolValue = qualitySettings.overrideState[0]; + } + + public override void LoadSettingsFromQualityPreset(RenderPipelineSettings settings, int level) + { + m_SampleCount.value.intValue = settings.lightingQualitySettings.ContactShadowSampleCount[level]; + m_SampleCount.overrideState.boolValue = true; + } + + public override QualitySettingsBlob SaveCustomQualitySettingsAsObject(QualitySettingsBlob history = null) + { + ContactShadowsQualitySettingsBlob qualitySettings = (history != null) ? history as ContactShadowsQualitySettingsBlob : new ContactShadowsQualitySettingsBlob(); + + qualitySettings.sampleCount = m_SampleCount.value.intValue; + qualitySettings.overrideState[0] = m_SampleCount.overrideState.boolValue; + + return qualitySettings; + } } } From f1148f142343ce768b73d398c9d9a6bef7b69597 Mon Sep 17 00:00:00 2001 From: John Parsaie Date: Thu, 9 Jul 2020 18:31:19 -0400 Subject: [PATCH 18/39] Introduce quality setting change for bloom --- .../Editor/PostProcessing/BloomEditor.cs | 79 +++++++++++++++++-- 1 file changed, 72 insertions(+), 7 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/BloomEditor.cs b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/BloomEditor.cs index 50f85234fce..82881e1c6a0 100644 --- a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/BloomEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/BloomEditor.cs @@ -41,8 +41,6 @@ public override void OnEnable() public override void OnInspectorGUI() { - base.OnInspectorGUI(); - EditorGUILayout.LabelField("Bloom", EditorStyles.miniLabel); PropertyField(m_Threshold); PropertyField(m_Intensity); @@ -52,18 +50,85 @@ public override void OnInspectorGUI() EditorGUILayout.LabelField("Lens Dirt", EditorStyles.miniLabel); PropertyField(m_DirtTexture, EditorGUIUtility.TrTextContent("Texture")); PropertyField(m_DirtIntensity, EditorGUIUtility.TrTextContent("Intensity")); + + base.OnInspectorGUI(); + using (new HDEditorUtils.IndentScope()) + { + GUI.enabled = GUI.enabled && base.overrideState; + DrawQualitySettings(); + } if (isInAdvancedMode) { EditorGUILayout.LabelField("Advanced Tweaks", EditorStyles.miniLabel); - GUI.enabled = useCustomValue; - PropertyField(m_Resolution); - PropertyField(m_HighQualityFiltering); - GUI.enabled = true; - PropertyField(m_Anamorphic); } } + + void DrawQualitySettings() + { + QualitySettingsBlob oldSettings = SaveCustomQualitySettingsAsObject(); + EditorGUI.BeginChangeCheck(); + + PropertyField(m_Resolution); + PropertyField(m_HighQualityFiltering); + + if (EditorGUI.EndChangeCheck()) + { + QualitySettingsBlob newSettings = SaveCustomQualitySettingsAsObject(); + + if (!BloomQualitySettingsBlob.IsEqual(oldSettings as BloomQualitySettingsBlob, newSettings as BloomQualitySettingsBlob)) + QualitySettingsWereChanged(); + } + } + + class BloomQualitySettingsBlob : QualitySettingsBlob + { + public BloomResolution resolution; + public bool hqFiltering; + + public BloomQualitySettingsBlob() : base(2) { } + + public static bool IsEqual(BloomQualitySettingsBlob left, BloomQualitySettingsBlob right) + { + return QualitySettingsBlob.IsEqual(left, right) + && left.resolution == right.resolution + && left.hqFiltering == right.hqFiltering; + } + } + + public override void LoadSettingsFromObject(QualitySettingsBlob settings) + { + BloomQualitySettingsBlob qualitySettings = settings as BloomQualitySettingsBlob; + + m_Resolution.value.intValue = (int)qualitySettings.resolution; + m_HighQualityFiltering.value.boolValue = qualitySettings.hqFiltering; + + m_Resolution.overrideState.boolValue = qualitySettings.overrideState[0]; + m_HighQualityFiltering.overrideState.boolValue = qualitySettings.overrideState[1]; + } + + public override void LoadSettingsFromQualityPreset(RenderPipelineSettings settings, int level) + { + m_Resolution.value.intValue = (int)settings.postProcessQualitySettings.BloomRes[level]; + m_HighQualityFiltering.value.boolValue = settings.postProcessQualitySettings.BloomHighQualityFiltering[level]; + + m_Resolution.overrideState.boolValue = true; + m_HighQualityFiltering.overrideState.boolValue = true; + } + + public override QualitySettingsBlob SaveCustomQualitySettingsAsObject(QualitySettingsBlob history = null) + { + BloomQualitySettingsBlob qualitySettings = (history != null) ? history as BloomQualitySettingsBlob : new BloomQualitySettingsBlob(); + + qualitySettings.resolution = (BloomResolution)m_Resolution.value.intValue; + qualitySettings.hqFiltering = m_HighQualityFiltering.value.boolValue; + + qualitySettings.overrideState[0] = m_Resolution.overrideState.boolValue; + qualitySettings.overrideState[1] = m_HighQualityFiltering.overrideState.boolValue; + + return qualitySettings; + } } } From 620e54bfedb86ff61333fc09529a444de7bb1c79 Mon Sep 17 00:00:00 2001 From: John Parsaie Date: Sun, 12 Jul 2020 11:27:55 -0400 Subject: [PATCH 19/39] Further generalize the quality setting blob to cut down on repetitive save/load functionality --- .../VolumeComponentWithQualityEditor.cs | 111 ++++++++++++++++-- 1 file changed, 99 insertions(+), 12 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs index cd37c5947dd..a870368f053 100644 --- a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs @@ -1,3 +1,5 @@ +using System; +using System.Collections.Generic; using System.Runtime.CompilerServices; using UnityEngine.Rendering; using UnityEngine.Rendering.HighDefinition; @@ -9,38 +11,123 @@ internal abstract class VolumeComponentWithQualityEditor : VolumeComponentEditor // Quality settings SerializedDataParameter m_QualitySetting; - // An opaque binary blob storing preset settings (used to remember what were the last custom settings that were used). - internal abstract class QualitySettingsBlob + // An opaque blob storing preset settings (used to remember what were the last custom settings that were used). + internal class QualitySettingsBlob { - public bool[] overrideState; - - protected QualitySettingsBlob(int overrideCount) + private struct QualitySetting { - overrideState = new bool[overrideCount]; + public bool state; + public object value; } + + Dictionary settings = new Dictionary(); - protected static bool IsEqual (QualitySettingsBlob left, QualitySettingsBlob right) + public static bool IsEqual (QualitySettingsBlob left, QualitySettingsBlob right) { + if (right == null && left == null) + { + return true; + } + if ((right == null && left != null) || (right != null && left == null)) { return false; } - if (right == null && left == null) + if (left.settings.Count != right.settings.Count) { - return true; + return false; } - for (int i = 0; i < left.overrideState.Length; ++i) + foreach (var pair in left.settings) { - if (left.overrideState[i] != right.overrideState[i]) + if (right.settings.TryGetValue(pair.Key, out var setting)) { - return false; + if (pair.Value.value != setting.value) + { + return false; + } } } return true; } + + // TODO: Override GetHashCode? + int Hash(SerializedDataParameter setting) + { + int hash = setting.GetHashCode(); + + unchecked + { + hash = 23 * setting.value.GetHashCode(); + hash = 23 * setting.overrideState.GetHashCode(); + } + + return hash; + } + + public void Save(SerializedDataParameter setting) where T : struct + { + QualitySetting s; + s.state = setting.overrideState.boolValue; + s.value = setting.value.GetInline(); + + int key = Hash(setting); + if (settings.ContainsKey(key)) + { + settings[key] = s; + } + else + { + settings.Add(key, s); + } + } + + public void TryLoad(ref SerializedDataParameter setting) where T : struct + { + if (settings.TryGetValue(Hash(setting), out QualitySetting s)) + { + setting.value.SetInline((T)s.value); + setting.overrideState.boolValue = s.state; + } + } + } + + public struct QualityScope : IDisposable + { + bool m_Disposed; + VolumeComponentWithQualityEditor m_QualityComponent; + QualitySettingsBlob m_Settings; + + public QualityScope(VolumeComponentWithQualityEditor component) + { + m_Disposed = false; + m_QualityComponent = component; + m_Settings = m_QualityComponent.SaveCustomQualitySettingsAsObject(); + EditorGUI.BeginChangeCheck(); + } + + public void Dispose() + { + Dispose(true); + } + + void Dispose(bool disposing) + { + if (m_Disposed) + return; + + if (disposing && EditorGUI.EndChangeCheck()) + { + QualitySettingsBlob newSettings = m_QualityComponent?.SaveCustomQualitySettingsAsObject(); + + if (!QualitySettingsBlob.IsEqual(m_Settings, newSettings)) + m_QualityComponent?.QualitySettingsWereChanged(); + } + + m_Disposed = true; + } } // Note: Editors are refreshed on gui changes by the volume system, so any state that we want to store here needs to be a static (or in a serialized variable) From 99f6e34463fe9c3b213ae3d93bcece69383110d8 Mon Sep 17 00:00:00 2001 From: John Parsaie Date: Sun, 12 Jul 2020 11:28:47 -0400 Subject: [PATCH 20/39] Update contact shadow, bloom, CA, and DOF editors to reflect the quality setting blob update --- .../Lighting/Shadow/ContactShadowsEditor.cs | 41 ++----- .../Editor/PostProcessing/BloomEditor.cs | 54 ++------- .../ChromaticAberrationEditor.cs | 43 ++----- .../PostProcessing/DepthOfFieldEditor.cs | 112 ++++++------------ 4 files changed, 63 insertions(+), 187 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/Lighting/Shadow/ContactShadowsEditor.cs b/com.unity.render-pipelines.high-definition/Editor/Lighting/Shadow/ContactShadowsEditor.cs index 1f668530ecc..9bca4546c3c 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Lighting/Shadow/ContactShadowsEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Lighting/Shadow/ContactShadowsEditor.cs @@ -61,41 +61,28 @@ public override void OnInspectorGUI() GUI.enabled = true; } } - + void DrawQualitySettings() { - QualitySettingsBlob oldSettings = SaveCustomQualitySettingsAsObject(); - EditorGUI.BeginChangeCheck(); - - PropertyField(m_SampleCount, EditorGUIUtility.TrTextContent("Sample Count", "Controls the number of samples HDRP uses for ray casting.")); - - if (EditorGUI.EndChangeCheck()) + using (new QualityScope(this)) { - QualitySettingsBlob newSettings = SaveCustomQualitySettingsAsObject(); - - if (!ContactShadowsQualitySettingsBlob.IsEqual(oldSettings as ContactShadowsQualitySettingsBlob, newSettings as ContactShadowsQualitySettingsBlob)) - QualitySettingsWereChanged(); + PropertyField(m_SampleCount, EditorGUIUtility.TrTextContent("Sample Count", "Controls the number of samples HDRP uses for ray casting.")); } } - class ContactShadowsQualitySettingsBlob : QualitySettingsBlob + public override QualitySettingsBlob SaveCustomQualitySettingsAsObject(QualitySettingsBlob settings = null) { - public int sampleCount; + if (settings == null) + settings = new QualitySettingsBlob(); - public ContactShadowsQualitySettingsBlob() : base(1) { } + settings.Save(m_SampleCount); - public static bool IsEqual(ContactShadowsQualitySettingsBlob left, ContactShadowsQualitySettingsBlob right) - { - return QualitySettingsBlob.IsEqual(left, right) - && left.sampleCount == right.sampleCount; - } + return settings; } public override void LoadSettingsFromObject(QualitySettingsBlob settings) { - ContactShadowsQualitySettingsBlob qualitySettings = settings as ContactShadowsQualitySettingsBlob; - m_SampleCount.value.intValue = qualitySettings.sampleCount; - m_SampleCount.overrideState.boolValue = qualitySettings.overrideState[0]; + settings.TryLoad(ref m_SampleCount); } public override void LoadSettingsFromQualityPreset(RenderPipelineSettings settings, int level) @@ -103,15 +90,5 @@ public override void LoadSettingsFromQualityPreset(RenderPipelineSettings settin m_SampleCount.value.intValue = settings.lightingQualitySettings.ContactShadowSampleCount[level]; m_SampleCount.overrideState.boolValue = true; } - - public override QualitySettingsBlob SaveCustomQualitySettingsAsObject(QualitySettingsBlob history = null) - { - ContactShadowsQualitySettingsBlob qualitySettings = (history != null) ? history as ContactShadowsQualitySettingsBlob : new ContactShadowsQualitySettingsBlob(); - - qualitySettings.sampleCount = m_SampleCount.value.intValue; - qualitySettings.overrideState[0] = m_SampleCount.overrideState.boolValue; - - return qualitySettings; - } } } diff --git a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/BloomEditor.cs b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/BloomEditor.cs index 82881e1c6a0..26e1aafe073 100644 --- a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/BloomEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/BloomEditor.cs @@ -65,48 +65,31 @@ public override void OnInspectorGUI() PropertyField(m_Anamorphic); } } - + void DrawQualitySettings() { - QualitySettingsBlob oldSettings = SaveCustomQualitySettingsAsObject(); - EditorGUI.BeginChangeCheck(); - - PropertyField(m_Resolution); - PropertyField(m_HighQualityFiltering); - - if (EditorGUI.EndChangeCheck()) + using (new QualityScope(this)) { - QualitySettingsBlob newSettings = SaveCustomQualitySettingsAsObject(); - - if (!BloomQualitySettingsBlob.IsEqual(oldSettings as BloomQualitySettingsBlob, newSettings as BloomQualitySettingsBlob)) - QualitySettingsWereChanged(); + PropertyField(m_Resolution); + PropertyField(m_HighQualityFiltering); } } - class BloomQualitySettingsBlob : QualitySettingsBlob + public override QualitySettingsBlob SaveCustomQualitySettingsAsObject(QualitySettingsBlob settings = null) { - public BloomResolution resolution; - public bool hqFiltering; + if (settings == null) + settings = new QualitySettingsBlob(); - public BloomQualitySettingsBlob() : base(2) { } + settings.Save(m_Resolution); + settings.Save(m_HighQualityFiltering); - public static bool IsEqual(BloomQualitySettingsBlob left, BloomQualitySettingsBlob right) - { - return QualitySettingsBlob.IsEqual(left, right) - && left.resolution == right.resolution - && left.hqFiltering == right.hqFiltering; - } + return settings; } public override void LoadSettingsFromObject(QualitySettingsBlob settings) { - BloomQualitySettingsBlob qualitySettings = settings as BloomQualitySettingsBlob; - - m_Resolution.value.intValue = (int)qualitySettings.resolution; - m_HighQualityFiltering.value.boolValue = qualitySettings.hqFiltering; - - m_Resolution.overrideState.boolValue = qualitySettings.overrideState[0]; - m_HighQualityFiltering.overrideState.boolValue = qualitySettings.overrideState[1]; + settings.TryLoad(ref m_Resolution); + settings.TryLoad(ref m_HighQualityFiltering); } public override void LoadSettingsFromQualityPreset(RenderPipelineSettings settings, int level) @@ -117,18 +100,5 @@ public override void LoadSettingsFromQualityPreset(RenderPipelineSettings settin m_Resolution.overrideState.boolValue = true; m_HighQualityFiltering.overrideState.boolValue = true; } - - public override QualitySettingsBlob SaveCustomQualitySettingsAsObject(QualitySettingsBlob history = null) - { - BloomQualitySettingsBlob qualitySettings = (history != null) ? history as BloomQualitySettingsBlob : new BloomQualitySettingsBlob(); - - qualitySettings.resolution = (BloomResolution)m_Resolution.value.intValue; - qualitySettings.hqFiltering = m_HighQualityFiltering.value.boolValue; - - qualitySettings.overrideState[0] = m_Resolution.overrideState.boolValue; - qualitySettings.overrideState[1] = m_HighQualityFiltering.overrideState.boolValue; - - return qualitySettings; - } } } diff --git a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/ChromaticAberrationEditor.cs b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/ChromaticAberrationEditor.cs index 8c05cdfb85e..9eaf9856915 100644 --- a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/ChromaticAberrationEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/ChromaticAberrationEditor.cs @@ -35,60 +35,35 @@ public override void OnInspectorGUI() GUI.enabled = true; } - + void DrawQualitySettings() { - QualitySettingsBlob oldSettings = SaveCustomQualitySettingsAsObject(); - EditorGUI.BeginChangeCheck(); - - PropertyField(m_MaxSamples); - - if (EditorGUI.EndChangeCheck()) + using (new QualityScope(this)) { - QualitySettingsBlob newSettings = SaveCustomQualitySettingsAsObject(); - - if (!ChromaticAberrationQualitySettingsBlob.IsEqual(oldSettings as ChromaticAberrationQualitySettingsBlob, newSettings as ChromaticAberrationQualitySettingsBlob)) - QualitySettingsWereChanged(); + PropertyField(m_MaxSamples); } } - class ChromaticAberrationQualitySettingsBlob : QualitySettingsBlob + public override QualitySettingsBlob SaveCustomQualitySettingsAsObject(QualitySettingsBlob settings = null) { - public int maxSamples; + if (settings == null) + settings = new QualitySettingsBlob(); - public ChromaticAberrationQualitySettingsBlob() : base(1) { } + settings.Save(m_MaxSamples); - public static bool IsEqual(ChromaticAberrationQualitySettingsBlob left, ChromaticAberrationQualitySettingsBlob right) - { - return QualitySettingsBlob.IsEqual(left, right) - && left.maxSamples == right.maxSamples; - } + return settings; } public override void LoadSettingsFromObject(QualitySettingsBlob settings) { - ChromaticAberrationQualitySettingsBlob qualitySettings = settings as ChromaticAberrationQualitySettingsBlob; - - m_MaxSamples.value.intValue = qualitySettings.maxSamples; - m_MaxSamples.overrideState.boolValue = qualitySettings.overrideState[0]; + settings.TryLoad(ref m_MaxSamples); } public override void LoadSettingsFromQualityPreset(RenderPipelineSettings settings, int level) { m_MaxSamples.value.intValue = settings.postProcessQualitySettings.ChromaticAberrationMaxSamples[level]; - m_MaxSamples.overrideState.boolValue = true; } - - public override QualitySettingsBlob SaveCustomQualitySettingsAsObject(QualitySettingsBlob history = null) - { - ChromaticAberrationQualitySettingsBlob qualitySettings = (history != null) ? history as ChromaticAberrationQualitySettingsBlob : new ChromaticAberrationQualitySettingsBlob(); - - qualitySettings.maxSamples = m_MaxSamples.value.intValue; - qualitySettings.overrideState[0] = m_MaxSamples.overrideState.boolValue; - - return qualitySettings; - } } } diff --git a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs index 25b10565200..70a628c9591 100644 --- a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs @@ -126,72 +126,48 @@ void DrawFocusSettings(int mode) void DrawQualitySettings() { - QualitySettingsBlob oldSettings = SaveCustomQualitySettingsAsObject(); - EditorGUI.BeginChangeCheck(); - EditorGUILayout.LabelField("Near Blur", EditorStyles.miniLabel); - PropertyField(m_NearSampleCount, EditorGUIUtility.TrTextContent("Sample Count")); - PropertyField(m_NearMaxBlur, EditorGUIUtility.TrTextContent("Max Radius")); - - EditorGUILayout.LabelField("Far Blur", EditorStyles.miniLabel); - PropertyField(m_FarSampleCount, EditorGUIUtility.TrTextContent("Sample Count")); - PropertyField(m_FarMaxBlur, EditorGUIUtility.TrTextContent("Max Radius")); - - if (isInAdvancedMode) + using (new QualityScope(this)) { - EditorGUILayout.LabelField("Advanced Tweaks", EditorStyles.miniLabel); - PropertyField(m_Resolution); - PropertyField(m_HighQualityFiltering); - } - - if (EditorGUI.EndChangeCheck()) - { - QualitySettingsBlob newSettings = SaveCustomQualitySettingsAsObject(); - - if (!DepthOfFieldQualitySettingsBlob.IsEqual(oldSettings as DepthOfFieldQualitySettingsBlob, newSettings as DepthOfFieldQualitySettingsBlob)) - QualitySettingsWereChanged(); + EditorGUILayout.LabelField("Near Blur", EditorStyles.miniLabel); + PropertyField(m_NearSampleCount, EditorGUIUtility.TrTextContent("Sample Count")); + PropertyField(m_NearMaxBlur, EditorGUIUtility.TrTextContent("Max Radius")); + + EditorGUILayout.LabelField("Far Blur", EditorStyles.miniLabel); + PropertyField(m_FarSampleCount, EditorGUIUtility.TrTextContent("Sample Count")); + PropertyField(m_FarMaxBlur, EditorGUIUtility.TrTextContent("Max Radius")); + + if (isInAdvancedMode) + { + EditorGUILayout.LabelField("Advanced Tweaks", EditorStyles.miniLabel); + PropertyField(m_Resolution); + PropertyField(m_HighQualityFiltering); + } } } - - class DepthOfFieldQualitySettingsBlob : QualitySettingsBlob + + public override QualitySettingsBlob SaveCustomQualitySettingsAsObject(QualitySettingsBlob settings = null) { - public int nearSampleCount; - public float nearMaxBlur; - public int farSampleCount; - public float farMaxBlur; - public DepthOfFieldResolution resolution; - public bool hqFiltering; + if (settings == null) + settings = new QualitySettingsBlob(); - public DepthOfFieldQualitySettingsBlob() : base(6) {} + settings.Save(m_NearSampleCount); + settings.Save(m_NearMaxBlur); + settings.Save(m_FarSampleCount); + settings.Save(m_FarMaxBlur); + settings.Save(m_Resolution); + settings.Save(m_HighQualityFiltering); - public static bool IsEqual(DepthOfFieldQualitySettingsBlob left, DepthOfFieldQualitySettingsBlob right) - { - return QualitySettingsBlob.IsEqual(left, right) - && left.nearSampleCount == right.nearSampleCount - && left.nearMaxBlur == right.nearMaxBlur - && left.farSampleCount == right.farSampleCount - && left.farMaxBlur == right.farMaxBlur - && left.resolution == right.resolution - && left.hqFiltering == right.hqFiltering; - } + return settings; } public override void LoadSettingsFromObject(QualitySettingsBlob settings) { - DepthOfFieldQualitySettingsBlob qualitySettings = settings as DepthOfFieldQualitySettingsBlob; - - m_NearSampleCount.value.intValue = qualitySettings.nearSampleCount; - m_NearMaxBlur.value.floatValue = qualitySettings.nearMaxBlur; - m_FarSampleCount.value.intValue = qualitySettings.farSampleCount; - m_FarMaxBlur.value.floatValue = qualitySettings.farMaxBlur; - m_Resolution.value.intValue = (int) qualitySettings.resolution; - m_HighQualityFiltering.value.boolValue = qualitySettings.hqFiltering; - - m_NearSampleCount.overrideState.boolValue = qualitySettings.overrideState[0]; - m_NearMaxBlur.overrideState.boolValue = qualitySettings.overrideState[1]; - m_FarSampleCount.overrideState.boolValue = qualitySettings.overrideState[2]; - m_FarMaxBlur.overrideState.boolValue = qualitySettings.overrideState[3]; - m_Resolution.overrideState.boolValue = qualitySettings.overrideState[4]; - m_HighQualityFiltering.overrideState.boolValue = qualitySettings.overrideState[5]; + settings.TryLoad(ref m_NearSampleCount); + settings.TryLoad(ref m_NearMaxBlur); + settings.TryLoad(ref m_FarSampleCount); + settings.TryLoad(ref m_FarMaxBlur); + settings.TryLoad(ref m_Resolution); + settings.TryLoad(ref m_HighQualityFiltering); } public override void LoadSettingsFromQualityPreset(RenderPipelineSettings settings, int level) @@ -202,7 +178,7 @@ public override void LoadSettingsFromQualityPreset(RenderPipelineSettings settin m_FarSampleCount.value.intValue = settings.postProcessQualitySettings.FarBlurSampleCount[level]; m_FarMaxBlur.value.floatValue = settings.postProcessQualitySettings.FarBlurMaxRadius[level]; - m_Resolution.value.intValue = (int) settings.postProcessQualitySettings.DoFResolution[level]; + m_Resolution.value.intValue = (int)settings.postProcessQualitySettings.DoFResolution[level]; m_HighQualityFiltering.value.boolValue = settings.postProcessQualitySettings.DoFHighQualityFiltering[level]; // set all quality override states to true, to indicate that these values are actually used @@ -212,28 +188,6 @@ public override void LoadSettingsFromQualityPreset(RenderPipelineSettings settin m_FarMaxBlur.overrideState.boolValue = true; m_Resolution.overrideState.boolValue = true; m_HighQualityFiltering.overrideState.boolValue = true; - - } - - public override QualitySettingsBlob SaveCustomQualitySettingsAsObject(QualitySettingsBlob history = null) - { - DepthOfFieldQualitySettingsBlob qualitySettings = (history != null) ? history as DepthOfFieldQualitySettingsBlob : new DepthOfFieldQualitySettingsBlob(); - - qualitySettings.nearSampleCount = m_NearSampleCount.value.intValue; - qualitySettings.nearMaxBlur = m_NearMaxBlur.value.floatValue; - qualitySettings.farSampleCount = m_FarSampleCount.value.intValue; - qualitySettings.farMaxBlur = m_FarMaxBlur.value.floatValue; - qualitySettings.resolution = (DepthOfFieldResolution) m_Resolution.value.intValue; - qualitySettings.hqFiltering = m_HighQualityFiltering.value.boolValue; - - qualitySettings.overrideState[0] = m_NearSampleCount.overrideState.boolValue; - qualitySettings.overrideState[1] = m_NearMaxBlur.overrideState.boolValue; - qualitySettings.overrideState[2] = m_FarSampleCount.overrideState.boolValue; - qualitySettings.overrideState[3] = m_FarMaxBlur.overrideState.boolValue; - qualitySettings.overrideState[4] = m_Resolution.overrideState.boolValue; - qualitySettings.overrideState[5] = m_HighQualityFiltering.overrideState.boolValue; - - return qualitySettings; } } } From ce1202af439dce58d23f433a063d1cb47929a3ed Mon Sep 17 00:00:00 2001 From: John Parsaie Date: Mon, 13 Jul 2020 17:49:19 -0400 Subject: [PATCH 21/39] Fix the quality setting comparison. --- .../VolumeComponentWithQualityEditor.cs | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs index a870368f053..fa436bb5364 100644 --- a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; using System.Collections.Generic; using System.Runtime.CompilerServices; using UnityEngine.Rendering; @@ -39,14 +40,11 @@ public static bool IsEqual (QualitySettingsBlob left, QualitySettingsBlob right) return false; } - foreach (var pair in left.settings) + foreach (var key in left.settings.Keys) { - if (right.settings.TryGetValue(pair.Key, out var setting)) + if (!left.settings[key].Equals(right.settings[key])) { - if (pair.Value.value != setting.value) - { - return false; - } + return false; } } @@ -130,6 +128,11 @@ void Dispose(bool disposing) } } + public void LoadValue() + { + + } + // Note: Editors are refreshed on gui changes by the volume system, so any state that we want to store here needs to be a static (or in a serialized variable) // We use ConditionalWeakTable instead of a Dictionary of InstanceIDs to get automatic clean-up of dead entries in the table static ConditionalWeakTable s_CustomSettingsHistory = new ConditionalWeakTable(); From 90f6b3daf3afd853470a85e4e9e130eae82dc921 Mon Sep 17 00:00:00 2001 From: John Parsaie Date: Mon, 13 Jul 2020 17:51:16 -0400 Subject: [PATCH 22/39] Introduce quality setting change for ambient occlusion --- .../Editor/Lighting/AmbientOcclusionEditor.cs | 110 +++++++++++++----- 1 file changed, 84 insertions(+), 26 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/Lighting/AmbientOcclusionEditor.cs b/com.unity.render-pipelines.high-definition/Editor/Lighting/AmbientOcclusionEditor.cs index 457381aad60..d485cde8923 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Lighting/AmbientOcclusionEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Lighting/AmbientOcclusionEditor.cs @@ -82,7 +82,8 @@ public override void OnInspectorGUI() { PropertyField(m_LayerMask, EditorGUIUtility.TrTextContent("Layer Mask", "Layer mask used to include the objects for ambient occlusion.")); base.OnInspectorGUI(); // Quality Setting - GUI.enabled = useCustomValue; + + using (new QualityScope(this)) { EditorGUI.indentLevel++; PropertyField(m_RayLength, EditorGUIUtility.TrTextContent("Ray Length", "Controls the length of ambient occlusion rays.")); @@ -95,7 +96,6 @@ public override void OnInspectorGUI() } EditorGUI.indentLevel--; } - GUI.enabled = true; } else { @@ -103,37 +103,95 @@ public override void OnInspectorGUI() PropertyField(m_Radius, EditorGUIUtility.TrTextContent("Radius", "Sampling radius. Bigger the radius, wider AO will be achieved, risking to lose fine details and increasing cost of the effect due to increasing cache misses.")); base.OnInspectorGUI(); // Quality Setting - GUI.enabled = useCustomValue; - PropertyField(m_MaximumRadiusInPixels, EditorGUIUtility.TrTextContent("Maximum Radius In Pixels", "This poses a maximum radius in pixels that we consider. It is very important to keep this as tight as possible to preserve good performance. Note that this is the value used for 1080p when *not* running the effect at full resolution, it will be scaled accordingly for other resolutions.")); - PropertyField(m_FullResolution, EditorGUIUtility.TrTextContent("Full Resolution", "The effect runs at full resolution. This increases quality, but also decreases performance significantly.")); - PropertyField(m_StepCount, EditorGUIUtility.TrTextContent("Step Count", "Number of steps to take along one signed direction during horizon search (this is the number of steps in positive and negative direction).")); - GUI.enabled = true; - - PropertyField(m_TemporalAccumulation, EditorGUIUtility.TrTextContent("Temporal Accumulation", "Whether the results are accumulated over time or not. This can get better results cheaper, but it can lead to temporal artifacts.")); - EditorGUI.indentLevel++; - if(!m_TemporalAccumulation.value.boolValue) + + using (new QualityScope(this)) { - GUI.enabled = useCustomValue; - PropertyField(m_DirectionCount, EditorGUIUtility.TrTextContent("Direction Count", "Number of directions searched for occlusion at each each pixel.")); - GUI.enabled = true; - if (m_DirectionCount.value.intValue > 3) + PropertyField(m_MaximumRadiusInPixels, EditorGUIUtility.TrTextContent("Maximum Radius In Pixels", "This poses a maximum radius in pixels that we consider. It is very important to keep this as tight as possible to preserve good performance. Note that this is the value used for 1080p when *not* running the effect at full resolution, it will be scaled accordingly for other resolutions.")); + PropertyField(m_FullResolution, EditorGUIUtility.TrTextContent("Full Resolution", "The effect runs at full resolution. This increases quality, but also decreases performance significantly.")); + PropertyField(m_StepCount, EditorGUIUtility.TrTextContent("Step Count", "Number of steps to take along one signed direction during horizon search (this is the number of steps in positive and negative direction).")); + + PropertyField(m_TemporalAccumulation, EditorGUIUtility.TrTextContent("Temporal Accumulation", "Whether the results are accumulated over time or not. This can get better results cheaper, but it can lead to temporal artifacts.")); + EditorGUI.indentLevel++; + if (!m_TemporalAccumulation.value.boolValue) { - EditorGUILayout.HelpBox("Performance will be seriously impacted by high direction count.", MessageType.Warning, wide: true); + PropertyField(m_DirectionCount, EditorGUIUtility.TrTextContent("Direction Count", "Number of directions searched for occlusion at each each pixel.")); + if (m_DirectionCount.value.intValue > 3) + { + EditorGUILayout.HelpBox("Performance will be seriously impacted by high direction count.", MessageType.Warning, wide: true); + } + PropertyField(m_BlurSharpness, EditorGUIUtility.TrTextContent("Blur sharpness", "Modify the non-temporal blur to change how sharp features are preserved. Lower values blurrier/softer, higher values sharper but with risk of noise.")); } - PropertyField(m_BlurSharpness, EditorGUIUtility.TrTextContent("Blur sharpness", "Modify the non-temporal blur to change how sharp features are preserved. Lower values blurrier/softer, higher values sharper but with risk of noise.")); - } - else - { - PropertyField(m_GhostingAdjustement, EditorGUIUtility.TrTextContent("Ghosting reduction", "Moving this factor closer to 0 will increase the amount of accepted samples during temporal accumulation, increasing the ghosting, but reducing the temporal noise.")); - if (isInAdvancedMode && !m_FullResolution.value.boolValue) + else { - GUI.enabled = useCustomValue; - PropertyField(m_BilateralUpsample, EditorGUIUtility.TrTextContent("Bilateral Upsample", "This upsample method preserves sharp edges better, however can result in visible aliasing and it is slightly more expensive.")); - GUI.enabled = true; + PropertyField(m_GhostingAdjustement, EditorGUIUtility.TrTextContent("Ghosting reduction", "Moving this factor closer to 0 will increase the amount of accepted samples during temporal accumulation, increasing the ghosting, but reducing the temporal noise.")); + if (isInAdvancedMode && !m_FullResolution.value.boolValue) + { + PropertyField(m_BilateralUpsample, EditorGUIUtility.TrTextContent("Bilateral Upsample", "This upsample method preserves sharp edges better, however can result in visible aliasing and it is slightly more expensive.")); + } } + EditorGUI.indentLevel--; } - EditorGUI.indentLevel--; } } + + public override QualitySettingsBlob SaveCustomQualitySettingsAsObject(QualitySettingsBlob settings = null) + { + if (settings == null) + settings = new QualitySettingsBlob(); + + // Ray tracing + settings.Save(m_RayLength); + settings.Save(m_SampleCount); + settings.Save(m_Denoise); + settings.Save(m_DenoiserRadius); + + // Raster + settings.Save(m_MaximumRadiusInPixels); + settings.Save(m_FullResolution); + settings.Save(m_StepCount); + settings.Save(m_DirectionCount); + settings.Save(m_BilateralUpsample); + + return settings; + } + + public override void LoadSettingsFromObject(QualitySettingsBlob settings) + { + // Ray tracing + settings.TryLoad(ref m_RayLength); + settings.TryLoad(ref m_SampleCount); + settings.TryLoad(ref m_Denoise); + settings.TryLoad(ref m_DenoiserRadius); + + // Raster + settings.TryLoad(ref m_MaximumRadiusInPixels); + settings.TryLoad(ref m_FullResolution); + settings.TryLoad(ref m_StepCount); + settings.TryLoad(ref m_DirectionCount); + settings.TryLoad(ref m_BilateralUpsample); + } + + public override void LoadSettingsFromQualityPreset(RenderPipelineSettings settings, int level) + { + m_RayLength.value.floatValue = settings.lightingQualitySettings.RTAORayLength[level]; + m_SampleCount.value.intValue = settings.lightingQualitySettings.RTAOSampleCount[level]; + m_Denoise.value.boolValue = settings.lightingQualitySettings.RTAODenoise[level]; + m_DenoiserRadius.value.floatValue = settings.lightingQualitySettings.RTAODenoiserRadius[level]; + m_MaximumRadiusInPixels.value.intValue = settings.lightingQualitySettings.AOMaximumRadiusPixels[level]; + m_FullResolution.value.boolValue = settings.lightingQualitySettings.AOFullRes[level]; + m_StepCount.value.intValue = settings.lightingQualitySettings.AOStepCount[level]; + m_DirectionCount.value.intValue = settings.lightingQualitySettings.AODirectionCount[level]; + m_BilateralUpsample.value.boolValue = settings.lightingQualitySettings.AOBilateralUpsample[level]; + + m_RayLength.overrideState.boolValue = true; + m_SampleCount.overrideState.boolValue = true; + m_Denoise.overrideState.boolValue = true; + m_DenoiserRadius.overrideState.boolValue = true; + m_MaximumRadiusInPixels.overrideState.boolValue = true; + m_FullResolution.overrideState.boolValue = true; + m_StepCount.overrideState.boolValue = true; + m_DirectionCount.overrideState.boolValue = true; + m_BilateralUpsample.overrideState.boolValue = true; + } } } From b91e5c25d64919e41bf9a48207cf4d925de2518f Mon Sep 17 00:00:00 2001 From: John Parsaie Date: Mon, 13 Jul 2020 18:13:29 -0400 Subject: [PATCH 23/39] Introduce quality setting change for motion blur --- .../Editor/PostProcessing/MotionBlurEditor.cs | 28 +++++++++++++++++-- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/MotionBlurEditor.cs b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/MotionBlurEditor.cs index 774e6901b1e..36b41d669a0 100644 --- a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/MotionBlurEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/MotionBlurEditor.cs @@ -44,9 +44,10 @@ public override void OnInspectorGUI() base.OnInspectorGUI(); - GUI.enabled = useCustomValue; - PropertyField(m_SampleCount); - GUI.enabled = true; + using (new QualityScope(this)) + { + PropertyField(m_SampleCount); + } PropertyField(m_MaxVelocityInPixels); PropertyField(m_MinVelInPixels); @@ -58,5 +59,26 @@ public override void OnInspectorGUI() PropertyField(m_CameraMotionBlur); } } + + public override QualitySettingsBlob SaveCustomQualitySettingsAsObject(QualitySettingsBlob settings = null) + { + if (settings == null) + settings = new QualitySettingsBlob(); + + settings.Save(m_SampleCount); + + return settings; + } + + public override void LoadSettingsFromObject(QualitySettingsBlob settings) + { + settings.TryLoad(ref m_SampleCount); + } + + public override void LoadSettingsFromQualityPreset(RenderPipelineSettings settings, int level) + { + m_SampleCount.value.intValue = settings.postProcessQualitySettings.MotionBlurSampleCount[level]; + m_SampleCount.overrideState.boolValue = true; + } } } From 11e03f46d6a68d4a0ba6718961a2a8182493c9a9 Mon Sep 17 00:00:00 2001 From: John Parsaie Date: Tue, 14 Jul 2020 13:28:59 -0400 Subject: [PATCH 24/39] Introduce quality setting change for RTGI and SSGI --- .../Raytracing/GlobalIlluminationEditor.cs | 129 +++++++++++++++--- 1 file changed, 108 insertions(+), 21 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/Raytracing/GlobalIlluminationEditor.cs b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/Raytracing/GlobalIlluminationEditor.cs index d935072a3cc..cc805ef203e 100644 --- a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/Raytracing/GlobalIlluminationEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/Raytracing/GlobalIlluminationEditor.cs @@ -135,13 +135,14 @@ public override void OnInspectorGUI() { base.OnInspectorGUI(); // Quality Setting EditorGUI.indentLevel++; - GUI.enabled = useCustomValue; - PropertyField(m_RayLength); - PropertyField(m_ClampValue); - PropertyField(m_FullResolution); - PropertyField(m_UpscaleRadius); - DenoiserGUI(); - GUI.enabled = true; + using (new QualityScope(this)) + { + PropertyField(m_RayLength); + PropertyField(m_ClampValue); + PropertyField(m_FullResolution); + PropertyField(m_UpscaleRadius); + DenoiserGUI(); + } EditorGUI.indentLevel--; } @@ -169,14 +170,16 @@ public override void OnInspectorGUI() else { base.OnInspectorGUI(); // Quality Setting + EditorGUI.indentLevel++; - GUI.enabled = useCustomValue; - PropertyField(m_RayLength); - PropertyField(m_ClampValue); - PropertyField(m_FullResolution); - PropertyField(m_UpscaleRadius); - DenoiserGUI(); - GUI.enabled = true; + using (new QualityScope(this)) + { + PropertyField(m_RayLength); + PropertyField(m_ClampValue); + PropertyField(m_FullResolution); + PropertyField(m_UpscaleRadius); + DenoiserGUI(); + } EditorGUI.indentLevel--; } @@ -188,18 +191,102 @@ public override void OnInspectorGUI() { base.OnInspectorGUI(); // Quality Setting EditorGUI.indentLevel++; - GUI.enabled = useCustomValue; - PropertyField(m_FullResolutionSS, EditorGUIUtility.TrTextContent("Full Resolution", "Enables full resolution mode.")); - PropertyField(m_RaySteps); - PropertyField(m_MaximalRadius); - PropertyField(m_ClampValueSS, EditorGUIUtility.TrTextContent("Clamp Value", "Clamps the exposed intensity.")); - PropertyField(m_FilterRadius); - GUI.enabled = true; + using (new QualityScope(this)) + { + PropertyField(m_FullResolutionSS, EditorGUIUtility.TrTextContent("Full Resolution", "Enables full resolution mode.")); + PropertyField(m_RaySteps); + PropertyField(m_MaximalRadius); + PropertyField(m_ClampValueSS, EditorGUIUtility.TrTextContent("Clamp Value", "Clamps the exposed intensity.")); + PropertyField(m_FilterRadius); + } EditorGUI.indentLevel--; PropertyField(m_DepthBufferThickness); } EditorGUI.indentLevel--; } + + public override QualitySettingsBlob SaveCustomQualitySettingsAsObject(QualitySettingsBlob settings = null) + { + if (settings == null) + settings = new QualitySettingsBlob(); + + // RTGI + settings.Save(m_RayLength); + settings.Save(m_ClampValue); + settings.Save(m_FullResolution); + settings.Save(m_UpscaleRadius); + settings.Save(m_Denoise); + settings.Save(m_HalfResolutionDenoiser); + settings.Save(m_DenoiserRadius); + settings.Save(m_SecondDenoiserPass); + settings.Save(m_SecondDenoiserRadius); + + // SSGI + settings.Save(m_FullResolutionSS); + settings.Save(m_RaySteps); + settings.Save(m_MaximalRadius); + settings.Save(m_ClampValueSS); + settings.Save(m_FilterRadius); + + return settings; + } + + public override void LoadSettingsFromObject(QualitySettingsBlob settings) + { + // RTGI + settings.TryLoad(ref m_RayLength); + settings.TryLoad(ref m_ClampValue); + settings.TryLoad(ref m_FullResolution); + settings.TryLoad(ref m_UpscaleRadius); + settings.TryLoad(ref m_Denoise); + settings.TryLoad(ref m_HalfResolutionDenoiser); + settings.TryLoad(ref m_DenoiserRadius); + settings.TryLoad(ref m_SecondDenoiserPass); + settings.TryLoad(ref m_SecondDenoiserRadius); + + // SSGI + settings.TryLoad(ref m_FullResolutionSS); + settings.TryLoad(ref m_RaySteps); + settings.TryLoad(ref m_MaximalRadius); + settings.TryLoad(ref m_ClampValueSS); + settings.TryLoad(ref m_FilterRadius); + } + + public override void LoadSettingsFromQualityPreset(RenderPipelineSettings settings, int level) + { + // RTGI + m_RayLength.value.floatValue = settings.lightingQualitySettings.RTGIRayLength[level]; + m_ClampValue.value.floatValue = settings.lightingQualitySettings.RTGIClampValue[level]; + m_FullResolution.value.boolValue = settings.lightingQualitySettings.RTGIFullResolution[level]; + m_UpscaleRadius.value.intValue = settings.lightingQualitySettings.RTGIUpScaleRadius[level]; + m_Denoise.value.boolValue = settings.lightingQualitySettings.RTGIDenoise[level]; + m_HalfResolutionDenoiser.value.boolValue = settings.lightingQualitySettings.RTGIHalfResDenoise[level]; + m_DenoiserRadius.value.floatValue = settings.lightingQualitySettings.RTGIDenoiserRadius[level]; + m_SecondDenoiserPass.value.boolValue = settings.lightingQualitySettings.RTGISecondDenoise[level]; + m_SecondDenoiserRadius.value.floatValue = settings.lightingQualitySettings.RTGISecondDenoiserRadius[level]; + + // SSGI + m_FullResolutionSS.value.boolValue = settings.lightingQualitySettings.SSGIFullResolution[level]; + m_RaySteps.value.intValue = settings.lightingQualitySettings.SSGIRaySteps[level]; + m_MaximalRadius.value.floatValue = settings.lightingQualitySettings.SSGIRadius[level]; + m_ClampValueSS.value.floatValue = settings.lightingQualitySettings.SSGIClampValue[level]; + m_FilterRadius.value.intValue = settings.lightingQualitySettings.SSGIFilterRadius[level]; + + m_RayLength.overrideState.boolValue = true; + m_ClampValue.overrideState.boolValue = true; + m_FullResolution.overrideState.boolValue = true; + m_UpscaleRadius.overrideState.boolValue = true; + m_Denoise.overrideState.boolValue = true; + m_HalfResolutionDenoiser.overrideState.boolValue = true; + m_DenoiserRadius.overrideState.boolValue = true; + m_SecondDenoiserPass.overrideState.boolValue = true; + m_SecondDenoiserRadius.overrideState.boolValue = true; + m_FullResolutionSS.overrideState.boolValue = true; + m_RaySteps.overrideState.boolValue = true; + m_MaximalRadius.overrideState.boolValue = true; + m_ClampValueSS.overrideState.boolValue = true; + m_FilterRadius.overrideState.boolValue = true; + } } } From e332fa0aea147d3b542706e2deca4d894ebf00bd Mon Sep 17 00:00:00 2001 From: John Parsaie Date: Tue, 14 Jul 2020 14:33:30 -0400 Subject: [PATCH 25/39] Generalize the quality preset loading --- .../Editor/Lighting/AmbientOcclusionEditor.cs | 39 +++++++---------- .../Lighting/Shadow/ContactShadowsEditor.cs | 3 +- .../Editor/PostProcessing/BloomEditor.cs | 7 +-- .../ChromaticAberrationEditor.cs | 3 +- .../PostProcessing/DepthOfFieldEditor.cs | 22 +++------- .../Editor/PostProcessing/MotionBlurEditor.cs | 3 +- .../Raytracing/GlobalIlluminationEditor.cs | 43 ++++++------------- .../VolumeComponentWithQualityEditor.cs | 13 +++--- 8 files changed, 49 insertions(+), 84 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/Lighting/AmbientOcclusionEditor.cs b/com.unity.render-pipelines.high-definition/Editor/Lighting/AmbientOcclusionEditor.cs index d485cde8923..3f6c1f6c707 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Lighting/AmbientOcclusionEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Lighting/AmbientOcclusionEditor.cs @@ -139,13 +139,13 @@ public override QualitySettingsBlob SaveCustomQualitySettingsAsObject(QualitySet if (settings == null) settings = new QualitySettingsBlob(); - // Ray tracing + // RTAO settings.Save(m_RayLength); settings.Save(m_SampleCount); settings.Save(m_Denoise); settings.Save(m_DenoiserRadius); - // Raster + // SSAO settings.Save(m_MaximumRadiusInPixels); settings.Save(m_FullResolution); settings.Save(m_StepCount); @@ -157,13 +157,13 @@ public override QualitySettingsBlob SaveCustomQualitySettingsAsObject(QualitySet public override void LoadSettingsFromObject(QualitySettingsBlob settings) { - // Ray tracing + // RTAO settings.TryLoad(ref m_RayLength); settings.TryLoad(ref m_SampleCount); settings.TryLoad(ref m_Denoise); settings.TryLoad(ref m_DenoiserRadius); - // Raster + // SSAO settings.TryLoad(ref m_MaximumRadiusInPixels); settings.TryLoad(ref m_FullResolution); settings.TryLoad(ref m_StepCount); @@ -173,25 +173,18 @@ public override void LoadSettingsFromObject(QualitySettingsBlob settings) public override void LoadSettingsFromQualityPreset(RenderPipelineSettings settings, int level) { - m_RayLength.value.floatValue = settings.lightingQualitySettings.RTAORayLength[level]; - m_SampleCount.value.intValue = settings.lightingQualitySettings.RTAOSampleCount[level]; - m_Denoise.value.boolValue = settings.lightingQualitySettings.RTAODenoise[level]; - m_DenoiserRadius.value.floatValue = settings.lightingQualitySettings.RTAODenoiserRadius[level]; - m_MaximumRadiusInPixels.value.intValue = settings.lightingQualitySettings.AOMaximumRadiusPixels[level]; - m_FullResolution.value.boolValue = settings.lightingQualitySettings.AOFullRes[level]; - m_StepCount.value.intValue = settings.lightingQualitySettings.AOStepCount[level]; - m_DirectionCount.value.intValue = settings.lightingQualitySettings.AODirectionCount[level]; - m_BilateralUpsample.value.boolValue = settings.lightingQualitySettings.AOBilateralUpsample[level]; - - m_RayLength.overrideState.boolValue = true; - m_SampleCount.overrideState.boolValue = true; - m_Denoise.overrideState.boolValue = true; - m_DenoiserRadius.overrideState.boolValue = true; - m_MaximumRadiusInPixels.overrideState.boolValue = true; - m_FullResolution.overrideState.boolValue = true; - m_StepCount.overrideState.boolValue = true; - m_DirectionCount.overrideState.boolValue = true; - m_BilateralUpsample.overrideState.boolValue = true; + // RTAO + CopySetting(ref m_RayLength, settings.lightingQualitySettings.RTAORayLength[level]); + CopySetting(ref m_SampleCount, settings.lightingQualitySettings.RTAOSampleCount[level]); + CopySetting(ref m_Denoise, settings.lightingQualitySettings.RTAODenoise[level]); + CopySetting(ref m_DenoiserRadius, settings.lightingQualitySettings.RTAODenoiserRadius[level]); + + // SSAO + CopySetting(ref m_MaximumRadiusInPixels, settings.lightingQualitySettings.AOMaximumRadiusPixels[level]); + CopySetting(ref m_FullResolution, settings.lightingQualitySettings.AOFullRes[level]); + CopySetting(ref m_StepCount, settings.lightingQualitySettings.AOStepCount[level]); + CopySetting(ref m_DirectionCount, settings.lightingQualitySettings.AODirectionCount[level]); + CopySetting(ref m_BilateralUpsample, settings.lightingQualitySettings.AOBilateralUpsample[level]); } } } diff --git a/com.unity.render-pipelines.high-definition/Editor/Lighting/Shadow/ContactShadowsEditor.cs b/com.unity.render-pipelines.high-definition/Editor/Lighting/Shadow/ContactShadowsEditor.cs index 9bca4546c3c..98b1ad45945 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Lighting/Shadow/ContactShadowsEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Lighting/Shadow/ContactShadowsEditor.cs @@ -87,8 +87,7 @@ public override void LoadSettingsFromObject(QualitySettingsBlob settings) public override void LoadSettingsFromQualityPreset(RenderPipelineSettings settings, int level) { - m_SampleCount.value.intValue = settings.lightingQualitySettings.ContactShadowSampleCount[level]; - m_SampleCount.overrideState.boolValue = true; + CopySetting(ref m_SampleCount, settings.lightingQualitySettings.ContactShadowSampleCount[level]); } } } diff --git a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/BloomEditor.cs b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/BloomEditor.cs index 26e1aafe073..7f422bb4e29 100644 --- a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/BloomEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/BloomEditor.cs @@ -94,11 +94,8 @@ public override void LoadSettingsFromObject(QualitySettingsBlob settings) public override void LoadSettingsFromQualityPreset(RenderPipelineSettings settings, int level) { - m_Resolution.value.intValue = (int)settings.postProcessQualitySettings.BloomRes[level]; - m_HighQualityFiltering.value.boolValue = settings.postProcessQualitySettings.BloomHighQualityFiltering[level]; - - m_Resolution.overrideState.boolValue = true; - m_HighQualityFiltering.overrideState.boolValue = true; + CopySetting(ref m_Resolution, (int)settings.postProcessQualitySettings.BloomRes[level]); + CopySetting(ref m_HighQualityFiltering, settings.postProcessQualitySettings.BloomHighQualityFiltering[level]); } } } diff --git a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/ChromaticAberrationEditor.cs b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/ChromaticAberrationEditor.cs index 9eaf9856915..80ce280467e 100644 --- a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/ChromaticAberrationEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/ChromaticAberrationEditor.cs @@ -61,8 +61,7 @@ public override void LoadSettingsFromObject(QualitySettingsBlob settings) public override void LoadSettingsFromQualityPreset(RenderPipelineSettings settings, int level) { - m_MaxSamples.value.intValue = settings.postProcessQualitySettings.ChromaticAberrationMaxSamples[level]; - m_MaxSamples.overrideState.boolValue = true; + CopySetting(ref m_MaxSamples, settings.postProcessQualitySettings.ChromaticAberrationMaxSamples[level]); } } } diff --git a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs index 70a628c9591..f22935cd981 100644 --- a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs @@ -172,22 +172,12 @@ public override void LoadSettingsFromObject(QualitySettingsBlob settings) public override void LoadSettingsFromQualityPreset(RenderPipelineSettings settings, int level) { - m_NearSampleCount.value.intValue = settings.postProcessQualitySettings.NearBlurSampleCount[level]; - m_NearMaxBlur.value.floatValue = settings.postProcessQualitySettings.NearBlurMaxRadius[level]; - - m_FarSampleCount.value.intValue = settings.postProcessQualitySettings.FarBlurSampleCount[level]; - m_FarMaxBlur.value.floatValue = settings.postProcessQualitySettings.FarBlurMaxRadius[level]; - - m_Resolution.value.intValue = (int)settings.postProcessQualitySettings.DoFResolution[level]; - m_HighQualityFiltering.value.boolValue = settings.postProcessQualitySettings.DoFHighQualityFiltering[level]; - - // set all quality override states to true, to indicate that these values are actually used - m_NearSampleCount.overrideState.boolValue = true; - m_NearMaxBlur.overrideState.boolValue = true; - m_FarSampleCount.overrideState.boolValue = true; - m_FarMaxBlur.overrideState.boolValue = true; - m_Resolution.overrideState.boolValue = true; - m_HighQualityFiltering.overrideState.boolValue = true; + CopySetting(ref m_NearSampleCount, settings.postProcessQualitySettings.NearBlurSampleCount[level]); + CopySetting(ref m_NearMaxBlur, settings.postProcessQualitySettings.NearBlurMaxRadius[level]); + CopySetting(ref m_FarSampleCount, settings.postProcessQualitySettings.FarBlurSampleCount[level]); + CopySetting(ref m_FarMaxBlur, settings.postProcessQualitySettings.FarBlurMaxRadius[level]); + CopySetting(ref m_Resolution, (int)settings.postProcessQualitySettings.DoFResolution[level]); + CopySetting(ref m_HighQualityFiltering, settings.postProcessQualitySettings.DoFHighQualityFiltering[level]); } } } diff --git a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/MotionBlurEditor.cs b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/MotionBlurEditor.cs index 36b41d669a0..bf699fcc82f 100644 --- a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/MotionBlurEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/MotionBlurEditor.cs @@ -77,8 +77,7 @@ public override void LoadSettingsFromObject(QualitySettingsBlob settings) public override void LoadSettingsFromQualityPreset(RenderPipelineSettings settings, int level) { - m_SampleCount.value.intValue = settings.postProcessQualitySettings.MotionBlurSampleCount[level]; - m_SampleCount.overrideState.boolValue = true; + CopySetting(ref m_SampleCount, settings.postProcessQualitySettings.MotionBlurSampleCount[level]); } } } diff --git a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/Raytracing/GlobalIlluminationEditor.cs b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/Raytracing/GlobalIlluminationEditor.cs index cc805ef203e..bb0b7d9c294 100644 --- a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/Raytracing/GlobalIlluminationEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/Raytracing/GlobalIlluminationEditor.cs @@ -256,37 +256,22 @@ public override void LoadSettingsFromObject(QualitySettingsBlob settings) public override void LoadSettingsFromQualityPreset(RenderPipelineSettings settings, int level) { // RTGI - m_RayLength.value.floatValue = settings.lightingQualitySettings.RTGIRayLength[level]; - m_ClampValue.value.floatValue = settings.lightingQualitySettings.RTGIClampValue[level]; - m_FullResolution.value.boolValue = settings.lightingQualitySettings.RTGIFullResolution[level]; - m_UpscaleRadius.value.intValue = settings.lightingQualitySettings.RTGIUpScaleRadius[level]; - m_Denoise.value.boolValue = settings.lightingQualitySettings.RTGIDenoise[level]; - m_HalfResolutionDenoiser.value.boolValue = settings.lightingQualitySettings.RTGIHalfResDenoise[level]; - m_DenoiserRadius.value.floatValue = settings.lightingQualitySettings.RTGIDenoiserRadius[level]; - m_SecondDenoiserPass.value.boolValue = settings.lightingQualitySettings.RTGISecondDenoise[level]; - m_SecondDenoiserRadius.value.floatValue = settings.lightingQualitySettings.RTGISecondDenoiserRadius[level]; + CopySetting(ref m_RayLength, settings.lightingQualitySettings.RTGIRayLength[level]); + CopySetting(ref m_ClampValue, settings.lightingQualitySettings.RTGIClampValue[level]); + CopySetting(ref m_FullResolution, settings.lightingQualitySettings.RTGIFullResolution[level]); + CopySetting(ref m_UpscaleRadius, settings.lightingQualitySettings.RTGIUpScaleRadius[level]); + CopySetting(ref m_Denoise, settings.lightingQualitySettings.RTGIDenoise[level]); + CopySetting(ref m_HalfResolutionDenoiser, settings.lightingQualitySettings.RTGIHalfResDenoise[level]); + CopySetting(ref m_DenoiserRadius, settings.lightingQualitySettings.RTGIDenoiserRadius[level]); + CopySetting(ref m_SecondDenoiserPass, settings.lightingQualitySettings.RTGISecondDenoise[level]); + CopySetting(ref m_SecondDenoiserRadius, settings.lightingQualitySettings.RTGISecondDenoiserRadius[level]); // SSGI - m_FullResolutionSS.value.boolValue = settings.lightingQualitySettings.SSGIFullResolution[level]; - m_RaySteps.value.intValue = settings.lightingQualitySettings.SSGIRaySteps[level]; - m_MaximalRadius.value.floatValue = settings.lightingQualitySettings.SSGIRadius[level]; - m_ClampValueSS.value.floatValue = settings.lightingQualitySettings.SSGIClampValue[level]; - m_FilterRadius.value.intValue = settings.lightingQualitySettings.SSGIFilterRadius[level]; - - m_RayLength.overrideState.boolValue = true; - m_ClampValue.overrideState.boolValue = true; - m_FullResolution.overrideState.boolValue = true; - m_UpscaleRadius.overrideState.boolValue = true; - m_Denoise.overrideState.boolValue = true; - m_HalfResolutionDenoiser.overrideState.boolValue = true; - m_DenoiserRadius.overrideState.boolValue = true; - m_SecondDenoiserPass.overrideState.boolValue = true; - m_SecondDenoiserRadius.overrideState.boolValue = true; - m_FullResolutionSS.overrideState.boolValue = true; - m_RaySteps.overrideState.boolValue = true; - m_MaximalRadius.overrideState.boolValue = true; - m_ClampValueSS.overrideState.boolValue = true; - m_FilterRadius.overrideState.boolValue = true; + CopySetting(ref m_FullResolutionSS, settings.lightingQualitySettings.SSGIFullResolution[level]); + CopySetting(ref m_RaySteps, settings.lightingQualitySettings.SSGIRaySteps[level]); + CopySetting(ref m_MaximalRadius, settings.lightingQualitySettings.SSGIRadius[level]); + CopySetting(ref m_ClampValueSS, settings.lightingQualitySettings.SSGIClampValue[level]); + CopySetting(ref m_FilterRadius, settings.lightingQualitySettings.SSGIFilterRadius[level]); } } } diff --git a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs index fa436bb5364..d515e7aa02f 100644 --- a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs @@ -128,11 +128,6 @@ void Dispose(bool disposing) } } - public void LoadValue() - { - - } - // Note: Editors are refreshed on gui changes by the volume system, so any state that we want to store here needs to be a static (or in a serialized variable) // We use ConditionalWeakTable instead of a Dictionary of InstanceIDs to get automatic clean-up of dead entries in the table static ConditionalWeakTable s_CustomSettingsHistory = new ConditionalWeakTable(); @@ -207,6 +202,14 @@ public override void OnInspectorGUI() protected bool useCustomValue => m_QualitySetting.value.intValue == k_CustomQuality; protected bool overrideState => m_QualitySetting.overrideState.boolValue; + protected static void CopySetting(ref SerializedDataParameter setting, T value) where T : struct + { + setting.value.SetInline(value); + + // Set quality override states to true, to indicate that these values are actually used. + setting.overrideState.boolValue = true; + } + /// /// This should be called after the user manually edits a quality setting that appears in a preset. After calling this function, the quality preset will change to Custom. /// From a3e91a47f4a58a8f0140872c153aab50db691212 Mon Sep 17 00:00:00 2001 From: John Parsaie Date: Tue, 14 Jul 2020 15:02:57 -0400 Subject: [PATCH 26/39] Introduce quality setting change for SSR and RTR --- .../HDScreenSpaceReflectionEditor.cs | 69 +++++++++++++++++-- 1 file changed, 62 insertions(+), 7 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/Lighting/Reflection/HDScreenSpaceReflectionEditor.cs b/com.unity.render-pipelines.high-definition/Editor/Lighting/Reflection/HDScreenSpaceReflectionEditor.cs index 1a1d9457be6..eee3d5728c4 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Lighting/Reflection/HDScreenSpaceReflectionEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Lighting/Reflection/HDScreenSpaceReflectionEditor.cs @@ -111,12 +111,13 @@ void RayTracingQualityModeGUI() void RayTracingPerformanceModeGUI() { base.OnInspectorGUI(); - GUI.enabled = useCustomValue; + + using (new QualityScope(this)) { EditorGUI.indentLevel++; PropertyField(m_MinSmoothness, k_MinimumSmoothnessText); PropertyField(m_SmoothnessFadeStart, k_SmoothnessFadeStartText); - m_SmoothnessFadeStart.value.floatValue = Mathf.Max(m_MinSmoothness.value.floatValue, m_SmoothnessFadeStart.value.floatValue); + m_SmoothnessFadeStart.value.floatValue = Mathf.Max(m_MinSmoothness.value.floatValue, m_SmoothnessFadeStart.value.floatValue); PropertyField(m_RayLength, k_RayLengthText); PropertyField(m_ClampValue, k_ClampValueText); PropertyField(m_UpscaleRadius, k_UpscaleRadiusText); @@ -129,7 +130,6 @@ void RayTracingPerformanceModeGUI() } EditorGUI.indentLevel--; } - GUI.enabled = true; } void RayTracedReflectionGUI() @@ -203,11 +203,66 @@ public override void OnInspectorGUI() m_DepthBufferThickness.value.floatValue = Mathf.Clamp(m_DepthBufferThickness.value.floatValue, 0.001f, 1.0f); base.OnInspectorGUI(); - GUI.enabled = useCustomValue; - PropertyField(m_RayMaxIterations, k_RayMaxIterationsText); - m_RayMaxIterations.value.intValue = Mathf.Max(0, m_RayMaxIterations.value.intValue); - GUI.enabled = true; + + using (new QualityScope(this)) + { + PropertyField(m_RayMaxIterations, k_RayMaxIterationsText); + m_RayMaxIterations.value.intValue = Mathf.Max(0, m_RayMaxIterations.value.intValue); + } } } + + public override QualitySettingsBlob SaveCustomQualitySettingsAsObject(QualitySettingsBlob settings = null) + { + if (settings == null) + settings = new QualitySettingsBlob(); + + // RTR + settings.Save(m_MinSmoothness); + settings.Save(m_SmoothnessFadeStart); + settings.Save(m_RayLength); + settings.Save(m_ClampValue); + settings.Save(m_UpscaleRadius); + settings.Save(m_FullResolution); + settings.Save(m_Denoise); + settings.Save(m_DenoiserRadius); + + // SSR + settings.Save(m_RayMaxIterations); + + return settings; + } + + public override void LoadSettingsFromObject(QualitySettingsBlob settings) + { + // RTR + settings.TryLoad(ref m_MinSmoothness); + settings.TryLoad(ref m_SmoothnessFadeStart); + settings.TryLoad(ref m_RayLength); + settings.TryLoad(ref m_ClampValue); + settings.TryLoad(ref m_UpscaleRadius); + settings.TryLoad(ref m_FullResolution); + settings.TryLoad(ref m_Denoise); + settings.TryLoad(ref m_DenoiserRadius); + + // SSR + settings.TryLoad(ref m_RayMaxIterations); + } + + public override void LoadSettingsFromQualityPreset(RenderPipelineSettings settings, int level) + { + // RTR + CopySetting(ref m_MinSmoothness, settings.lightingQualitySettings.RTRMinSmoothness[level]); + CopySetting(ref m_SmoothnessFadeStart, settings.lightingQualitySettings.RTRSmoothnessFadeStart[level]); + CopySetting(ref m_RayLength, settings.lightingQualitySettings.RTRRayLength[level]); + CopySetting(ref m_ClampValue, settings.lightingQualitySettings.RTRClampValue[level]); + CopySetting(ref m_UpscaleRadius, settings.lightingQualitySettings.RTRUpScaleRadius[level]); + CopySetting(ref m_FullResolution, settings.lightingQualitySettings.RTRFullResolution[level]); + CopySetting(ref m_Denoise, settings.lightingQualitySettings.RTRDenoise[level]); + CopySetting(ref m_DenoiserRadius, settings.lightingQualitySettings.RTRDenoiserRadius[level]); + + // SSR + CopySetting(ref m_RayMaxIterations, settings.lightingQualitySettings.SSRMaxRaySteps[level]); + } } } From 6e6640938fd265d654b18c6187c85981d244b662 Mon Sep 17 00:00:00 2001 From: John Parsaie Date: Tue, 14 Jul 2020 15:39:41 -0400 Subject: [PATCH 27/39] Merge physical based dof editor change --- .../Editor/PostProcessing/DepthOfFieldEditor.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs index 83e069371af..95c5beb8115 100644 --- a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs @@ -80,8 +80,6 @@ public override void OnInspectorGUI() int mode = m_FocusMode.value.intValue; if (mode == (int)DepthOfFieldMode.Off) return; - - base.OnInspectorGUI(); using (new HDEditorUtils.IndentScope()) { From 92c50501b67f42a7d67ba61329b321028a5ca322 Mon Sep 17 00:00:00 2001 From: John Parsaie Date: Wed, 15 Jul 2020 11:02:51 -0400 Subject: [PATCH 28/39] Add comments --- .../HDScreenSpaceReflectionEditor.cs | 16 +++++++------- .../VolumeComponentWithQualityEditor.cs | 22 ++++++++++++++----- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/Lighting/Reflection/HDScreenSpaceReflectionEditor.cs b/com.unity.render-pipelines.high-definition/Editor/Lighting/Reflection/HDScreenSpaceReflectionEditor.cs index eee3d5728c4..6609e439f41 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Lighting/Reflection/HDScreenSpaceReflectionEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Lighting/Reflection/HDScreenSpaceReflectionEditor.cs @@ -252,14 +252,14 @@ public override void LoadSettingsFromObject(QualitySettingsBlob settings) public override void LoadSettingsFromQualityPreset(RenderPipelineSettings settings, int level) { // RTR - CopySetting(ref m_MinSmoothness, settings.lightingQualitySettings.RTRMinSmoothness[level]); - CopySetting(ref m_SmoothnessFadeStart, settings.lightingQualitySettings.RTRSmoothnessFadeStart[level]); - CopySetting(ref m_RayLength, settings.lightingQualitySettings.RTRRayLength[level]); - CopySetting(ref m_ClampValue, settings.lightingQualitySettings.RTRClampValue[level]); - CopySetting(ref m_UpscaleRadius, settings.lightingQualitySettings.RTRUpScaleRadius[level]); - CopySetting(ref m_FullResolution, settings.lightingQualitySettings.RTRFullResolution[level]); - CopySetting(ref m_Denoise, settings.lightingQualitySettings.RTRDenoise[level]); - CopySetting(ref m_DenoiserRadius, settings.lightingQualitySettings.RTRDenoiserRadius[level]); + CopySetting(ref m_MinSmoothness, settings.lightingQualitySettings.RTRMinSmoothness[level]); + CopySetting(ref m_SmoothnessFadeStart, settings.lightingQualitySettings.RTRSmoothnessFadeStart[level]); + CopySetting(ref m_RayLength, settings.lightingQualitySettings.RTRRayLength[level]); + CopySetting(ref m_ClampValue, settings.lightingQualitySettings.RTRClampValue[level]); + CopySetting(ref m_UpscaleRadius, settings.lightingQualitySettings.RTRUpScaleRadius[level]); + CopySetting(ref m_FullResolution, settings.lightingQualitySettings.RTRFullResolution[level]); + CopySetting(ref m_Denoise, settings.lightingQualitySettings.RTRDenoise[level]); + CopySetting(ref m_DenoiserRadius, settings.lightingQualitySettings.RTRDenoiserRadius[level]); // SSR CopySetting(ref m_RayMaxIterations, settings.lightingQualitySettings.SSRMaxRaySteps[level]); diff --git a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs index d515e7aa02f..8904dbaa575 100644 --- a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs @@ -12,7 +12,9 @@ internal abstract class VolumeComponentWithQualityEditor : VolumeComponentEditor // Quality settings SerializedDataParameter m_QualitySetting; - // An opaque blob storing preset settings (used to remember what were the last custom settings that were used). + /// + /// An opaque blob storing preset settings (used to remember what were the last custom settings that were used). + /// internal class QualitySettingsBlob { private struct QualitySetting @@ -51,7 +53,7 @@ public static bool IsEqual (QualitySettingsBlob left, QualitySettingsBlob right) return true; } - // TODO: Override GetHashCode? + // TODO: Should be an override of GetHashCode (in core)? int Hash(SerializedDataParameter setting) { int hash = setting.GetHashCode(); @@ -82,22 +84,27 @@ public void Save(SerializedDataParameter setting) where T : struct } } + // Attempts to fill a quality setting with its custom value and override state. public void TryLoad(ref SerializedDataParameter setting) where T : struct { if (settings.TryGetValue(Hash(setting), out QualitySetting s)) { - setting.value.SetInline((T)s.value); + setting.value.SetInline((T)s.value); setting.overrideState.boolValue = s.state; } } } + /// + /// Scoped quality setting change checker. + /// public struct QualityScope : IDisposable { bool m_Disposed; VolumeComponentWithQualityEditor m_QualityComponent; QualitySettingsBlob m_Settings; + // Cache the quality setting public QualityScope(VolumeComponentWithQualityEditor component) { m_Disposed = false; @@ -201,12 +208,15 @@ public override void OnInspectorGUI() protected bool useCustomValue => m_QualitySetting.value.intValue == k_CustomQuality; protected bool overrideState => m_QualitySetting.overrideState.boolValue; - + + /// + /// This utility can be used to copy a value into a volume component setting visible in the inspector. + /// protected static void CopySetting(ref SerializedDataParameter setting, T value) where T : struct { - setting.value.SetInline(value); + setting.value.SetInline(value); - // Set quality override states to true, to indicate that these values are actually used. + // Force enable the override state, to indicate that these values are actually used. setting.overrideState.boolValue = true; } From 40190b301abdc18d5ced168fb46765267c242718 Mon Sep 17 00:00:00 2001 From: John Parsaie Date: Wed, 15 Jul 2020 11:06:38 -0400 Subject: [PATCH 29/39] Add comments --- .../RenderPipeline/VolumeComponentWithQualityEditor.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs index 8904dbaa575..20814c4f90c 100644 --- a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs @@ -24,7 +24,7 @@ private struct QualitySetting } Dictionary settings = new Dictionary(); - + public static bool IsEqual (QualitySettingsBlob left, QualitySettingsBlob right) { if (right == null && left == null) @@ -67,6 +67,7 @@ int Hash(SerializedDataParameter setting) return hash; } + // Save a setting to the quality blob. public void Save(SerializedDataParameter setting) where T : struct { QualitySetting s; @@ -74,12 +75,15 @@ public void Save(SerializedDataParameter setting) where T : struct s.value = setting.value.GetInline(); int key = Hash(setting); + if (settings.ContainsKey(key)) { + // If the setting exists, overwrite the value settings[key] = s; } else { + // Otherwise, cache a new setting settings.Add(key, s); } } From 35707d3b62a2ba87df130c22aaacf3977ad0d265 Mon Sep 17 00:00:00 2001 From: John Parsaie Date: Wed, 15 Jul 2020 12:02:25 -0400 Subject: [PATCH 30/39] Update changelog --- 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 f65a221d12d..4e8827e5771 100644 --- a/com.unity.render-pipelines.high-definition/CHANGELOG.md +++ b/com.unity.render-pipelines.high-definition/CHANGELOG.md @@ -892,6 +892,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - Fixed an issue with quality setting foldouts not opening when clicking on them (1253088). - Shutter speed can now be changed by dragging the mouse over the UI label (case 1245007). - Remove the 'Point Cube Size' for cookie, use the Cubemap size directly. +- Improved volume component UX with quality setting. Will now indicate quality preset values, and automatic switching into custom mode when changed. ## [7.1.1] - 2019-09-05 From 505833e748156511fdef112daf1347c5d3dc8a3c Mon Sep 17 00:00:00 2001 From: John Parsaie Date: Wed, 15 Jul 2020 13:27:48 -0400 Subject: [PATCH 31/39] Remove unused namespace --- .../Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs index 20814c4f90c..34b1f65055b 100644 --- a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs @@ -1,5 +1,4 @@ using System; -using System.Linq; using System.Collections.Generic; using System.Runtime.CompilerServices; using UnityEngine.Rendering; From 371fc260607864f09864731877496662516d7054 Mon Sep 17 00:00:00 2001 From: John Parsaie Date: Thu, 16 Jul 2020 10:26:33 -0400 Subject: [PATCH 32/39] Remove usage of indent scope/UI modification (except for in DoF) until it is discussed in PR --- .../Lighting/Shadow/ContactShadowsEditor.cs | 16 +++---------- .../Editor/PostProcessing/BloomEditor.cs | 24 +++++++------------ .../ChromaticAberrationEditor.cs | 14 ++--------- 3 files changed, 13 insertions(+), 41 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/Lighting/Shadow/ContactShadowsEditor.cs b/com.unity.render-pipelines.high-definition/Editor/Lighting/Shadow/ContactShadowsEditor.cs index 245910c22c6..ab29d11dcba 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Lighting/Shadow/ContactShadowsEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Lighting/Shadow/ContactShadowsEditor.cs @@ -57,21 +57,11 @@ public override void OnInspectorGUI() PropertyField(m_Thickness, EditorGUIUtility.TrTextContent("Thickness", "Controls the thickness of the objects found along the ray, essentially thickening the contact shadows.")); base.OnInspectorGUI(); - using (new HDEditorUtils.IndentScope()) + + using (new QualityScope(this)) { - GUI.enabled = GUI.enabled && base.overrideState; - DrawQualitySettings(); + PropertyField(m_SampleCount, EditorGUIUtility.TrTextContent("Sample Count", "Controls the number of samples HDRP uses for ray casting.")); } - - GUI.enabled = true; - } - } - - void DrawQualitySettings() - { - using (new QualityScope(this)) - { - PropertyField(m_SampleCount, EditorGUIUtility.TrTextContent("Sample Count", "Controls the number of samples HDRP uses for ray casting.")); } } diff --git a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/BloomEditor.cs b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/BloomEditor.cs index 7f422bb4e29..818e7d9f2a9 100644 --- a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/BloomEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/BloomEditor.cs @@ -41,6 +41,8 @@ public override void OnEnable() public override void OnInspectorGUI() { + base.OnInspectorGUI(); + EditorGUILayout.LabelField("Bloom", EditorStyles.miniLabel); PropertyField(m_Threshold); PropertyField(m_Intensity); @@ -50,30 +52,20 @@ public override void OnInspectorGUI() EditorGUILayout.LabelField("Lens Dirt", EditorStyles.miniLabel); PropertyField(m_DirtTexture, EditorGUIUtility.TrTextContent("Texture")); PropertyField(m_DirtIntensity, EditorGUIUtility.TrTextContent("Intensity")); - - base.OnInspectorGUI(); - using (new HDEditorUtils.IndentScope()) - { - GUI.enabled = GUI.enabled && base.overrideState; - DrawQualitySettings(); - } if (isInAdvancedMode) { EditorGUILayout.LabelField("Advanced Tweaks", EditorStyles.miniLabel); + using (new QualityScope(this)) + { + PropertyField(m_Resolution); + PropertyField(m_HighQualityFiltering); + } + PropertyField(m_Anamorphic); } } - - void DrawQualitySettings() - { - using (new QualityScope(this)) - { - PropertyField(m_Resolution); - PropertyField(m_HighQualityFiltering); - } - } public override QualitySettingsBlob SaveCustomQualitySettingsAsObject(QualitySettingsBlob settings = null) { diff --git a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/ChromaticAberrationEditor.cs b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/ChromaticAberrationEditor.cs index 80ce280467e..cbe7e4e7fbb 100644 --- a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/ChromaticAberrationEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/ChromaticAberrationEditor.cs @@ -23,21 +23,11 @@ public override void OnEnable() public override void OnInspectorGUI() { + base.OnInspectorGUI(); + PropertyField(m_SpectralLUT); PropertyField(m_Intensity); - - base.OnInspectorGUI(); - using (new HDEditorUtils.IndentScope()) - { - GUI.enabled = GUI.enabled && base.overrideState; - DrawQualitySettings(); - } - GUI.enabled = true; - } - - void DrawQualitySettings() - { using (new QualityScope(this)) { PropertyField(m_MaxSamples); From 2f8b134b5ce9644abdf275ebdce7fb84861df546 Mon Sep 17 00:00:00 2001 From: John Parsaie Date: Thu, 16 Jul 2020 12:00:41 -0400 Subject: [PATCH 33/39] DoF tooltips were accidentally reverted in the merge, re-add the fix --- .../Editor/PostProcessing/DepthOfFieldEditor.cs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs index 95c5beb8115..3be866614e7 100644 --- a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs @@ -110,12 +110,12 @@ void DrawFocusSettings(int mode) else if (mode == (int)DepthOfFieldMode.Manual) { EditorGUILayout.LabelField("Near Range", EditorStyles.miniLabel); - PropertyField(m_NearFocusStart, EditorGUIUtility.TrTextContent("Start")); - PropertyField(m_NearFocusEnd, EditorGUIUtility.TrTextContent("End")); + PropertyField(m_NearFocusStart, Styles.k_NearFocusStart); + PropertyField(m_NearFocusEnd, Styles.k_NearFocusEnd); EditorGUILayout.LabelField("Far Range", EditorStyles.miniLabel); - PropertyField(m_FarFocusStart, EditorGUIUtility.TrTextContent("Start")); - PropertyField(m_FarFocusEnd, EditorGUIUtility.TrTextContent("End")); + PropertyField(m_FarFocusStart, Styles.k_FarFocusStart); + PropertyField(m_FarFocusEnd, Styles.k_FarFocusEnd); } } @@ -124,12 +124,12 @@ void DrawQualitySettings() using (new QualityScope(this)) { EditorGUILayout.LabelField("Near Blur", EditorStyles.miniLabel); - PropertyField(m_NearSampleCount, EditorGUIUtility.TrTextContent("Sample Count")); - PropertyField(m_NearMaxBlur, EditorGUIUtility.TrTextContent("Max Radius")); + PropertyField(m_NearSampleCount, Styles.k_NearSampleCount); + PropertyField(m_NearMaxBlur, Styles.k_NearMaxBlur); EditorGUILayout.LabelField("Far Blur", EditorStyles.miniLabel); - PropertyField(m_FarSampleCount, EditorGUIUtility.TrTextContent("Sample Count")); - PropertyField(m_FarMaxBlur, EditorGUIUtility.TrTextContent("Max Radius")); + PropertyField(m_FarSampleCount, Styles.k_FarSampleCount); + PropertyField(m_FarMaxBlur, Styles.k_FarMaxBlur); if (isInAdvancedMode) { From 332923f0be2a161203a92bc1c1961731778a1a08 Mon Sep 17 00:00:00 2001 From: John Parsaie Date: Thu, 16 Jul 2020 15:42:14 -0400 Subject: [PATCH 34/39] Simply the QualityScope disposal --- .../VolumeComponentWithQualityEditor.cs | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs index 34b1f65055b..95c2ce31af9 100644 --- a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs @@ -103,14 +103,12 @@ public void TryLoad(ref SerializedDataParameter setting) where T : struct /// public struct QualityScope : IDisposable { - bool m_Disposed; VolumeComponentWithQualityEditor m_QualityComponent; QualitySettingsBlob m_Settings; // Cache the quality setting public QualityScope(VolumeComponentWithQualityEditor component) { - m_Disposed = false; m_QualityComponent = component; m_Settings = m_QualityComponent.SaveCustomQualitySettingsAsObject(); EditorGUI.BeginChangeCheck(); @@ -118,23 +116,13 @@ public QualityScope(VolumeComponentWithQualityEditor component) public void Dispose() { - Dispose(true); - } - - void Dispose(bool disposing) - { - if (m_Disposed) - return; - - if (disposing && EditorGUI.EndChangeCheck()) + if (EditorGUI.EndChangeCheck()) { QualitySettingsBlob newSettings = m_QualityComponent?.SaveCustomQualitySettingsAsObject(); if (!QualitySettingsBlob.IsEqual(m_Settings, newSettings)) m_QualityComponent?.QualitySettingsWereChanged(); } - - m_Disposed = true; } } From 2b26956f2d800d1de411f6e910fe50a3f8ff26b0 Mon Sep 17 00:00:00 2001 From: John Parsaie Date: Wed, 21 Oct 2020 19:08:27 -0400 Subject: [PATCH 35/39] Organize quality volume components to place the quality settings at the bottom (match how DoF is done). --- .../Editor/Lighting/AmbientOcclusionEditor.cs | 85 +++++++----- .../HDScreenSpaceReflectionEditor.cs | 126 ++++++++++-------- .../Lighting/Shadow/ContactShadowsEditor.cs | 11 +- .../Editor/PostProcessing/BloomEditor.cs | 22 +-- .../ChromaticAberrationEditor.cs | 9 +- .../PostProcessing/DepthOfFieldEditor.cs | 45 +++---- .../Editor/PostProcessing/MotionBlurEditor.cs | 15 ++- .../Raytracing/GlobalIlluminationEditor.cs | 69 +++++----- .../VolumeComponentWithQualityEditor.cs | 43 ++++-- 9 files changed, 237 insertions(+), 188 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/Lighting/AmbientOcclusionEditor.cs b/com.unity.render-pipelines.high-definition/Editor/Lighting/AmbientOcclusionEditor.cs index f233a9477af..c48995a9122 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Lighting/AmbientOcclusionEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Lighting/AmbientOcclusionEditor.cs @@ -83,56 +83,67 @@ public override void OnInspectorGUI() if (HDRenderPipeline.pipelineSupportsRayTracing && m_RayTracing.overrideState.boolValue && m_RayTracing.value.boolValue) { PropertyField(m_LayerMask, EditorGUIUtility.TrTextContent("Layer Mask", "Layer mask used to include the objects for ambient occlusion.")); + base.OnInspectorGUI(); // Quality Setting - using (new QualityScope(this)) - { - EditorGUI.indentLevel++; - PropertyField(m_RayLength, EditorGUIUtility.TrTextContent("Max Ray Length", "Controls the maximal length of ambient occlusion rays. The higher this value is, the more expensive ray traced ambient occlusion is.")); - PropertyField(m_SampleCount, EditorGUIUtility.TrTextContent("Sample Count", "Number of samples for ray traced ambient occlusion.")); - PropertyField(m_Denoise, EditorGUIUtility.TrTextContent("Denoise", "Enable denoising on the ray traced ambient occlusion.")); - { - EditorGUI.indentLevel++; - PropertyField(m_DenoiserRadius, EditorGUIUtility.TrTextContent("Denoiser Radius", "Radius parameter for the denoising.")); - EditorGUI.indentLevel--; - } - EditorGUI.indentLevel--; - } } else { - PropertyField(m_Radius, EditorGUIUtility.TrTextContent("Radius", "Sampling radius. Bigger the radius, wider AO will be achieved, risking to lose fine details and increasing cost of the effect due to increasing cache misses.")); - base.OnInspectorGUI(); // Quality Setting + PropertyField(m_TemporalAccumulation, EditorGUIUtility.TrTextContent("Temporal Accumulation", "Whether the results are accumulated over time or not. This can get better results cheaper, but it can lead to temporal artifacts. Requires Motion Vectors to be enabled.")); - using (new QualityScope(this)) + EditorGUI.indentLevel++; + if(!m_TemporalAccumulation.value.boolValue) { - PropertyField(m_MaximumRadiusInPixels, EditorGUIUtility.TrTextContent("Maximum Radius In Pixels", "This poses a maximum radius in pixels that we consider. It is very important to keep this as tight as possible to preserve good performance. Note that this is the value used for 1080p when *not* running the effect at full resolution, it will be scaled accordingly for other resolutions.")); - PropertyField(m_FullResolution, EditorGUIUtility.TrTextContent("Full Resolution", "The effect runs at full resolution. This increases quality, but also decreases performance significantly.")); - PropertyField(m_StepCount, EditorGUIUtility.TrTextContent("Step Count", "Number of steps to take along one signed direction during horizon search (this is the number of steps in positive and negative direction).")); + if (m_DirectionCount.value.intValue > 3) + { + EditorGUILayout.HelpBox("Performance will be seriously impacted by high direction count.", MessageType.Warning, wide: true); + } + + PropertyField(m_BlurSharpness, EditorGUIUtility.TrTextContent("Blur sharpness", "Modify the non-temporal blur to change how sharp features are preserved. Lower values blurrier/softer, higher values sharper but with risk of noise.")); + } + else + { + PropertyField(m_SpatialBilateralAggressiveness, EditorGUIUtility.TrTextContent("Bilateral Aggressiveness", "Higher this value, the less lenient with depth differences the spatial filter is. Increase if for example noticing white halos where AO should be.")); + PropertyField(m_GhostingAdjustement, EditorGUIUtility.TrTextContent("Ghosting reduction", "Moving this factor closer to 0 will increase the amount of accepted samples during temporal accumulation, increasing the ghosting, but reducing the temporal noise.")); + } + EditorGUI.indentLevel--; + + base.OnInspectorGUI(); // Quality Setting + } + } + + public override void OnQualityGUI() + { + if (HDRenderPipeline.pipelineSupportsRayTracing && m_RayTracing.overrideState.boolValue && + m_RayTracing.value.boolValue) + { + PropertyField(m_RayLength, EditorGUIUtility.TrTextContent("Max Ray Length", "Controls the maximal length of ambient occlusion rays. The higher this value is, the more expensive ray traced ambient occlusion is.")); + PropertyField(m_SampleCount, EditorGUIUtility.TrTextContent("Sample Count", "Number of samples for ray traced ambient occlusion.")); - PropertyField(m_TemporalAccumulation, EditorGUIUtility.TrTextContent("Temporal Accumulation", "Whether the results are accumulated over time or not. This can get better results cheaper, but it can lead to temporal artifacts. Requires Motion Vectors to be enabled.")); + PropertyField(m_Denoise, EditorGUIUtility.TrTextContent("Denoise", "Enable denoising on the ray traced ambient occlusion.")); + { EditorGUI.indentLevel++; - if(!m_TemporalAccumulation.value.boolValue) - { - PropertyField(m_DirectionCount, EditorGUIUtility.TrTextContent("Direction Count", "Number of directions searched for occlusion at each each pixel.")); + PropertyField(m_DenoiserRadius, EditorGUIUtility.TrTextContent("Denoiser Radius", "Radius parameter for the denoising.")); + EditorGUI.indentLevel--; + } + } + else + { + PropertyField(m_MaximumRadiusInPixels, EditorGUIUtility.TrTextContent("Maximum Radius In Pixels", "This poses a maximum radius in pixels that we consider. It is very important to keep this as tight as possible to preserve good performance. Note that this is the value used for 1080p when *not* running the effect at full resolution, it will be scaled accordingly for other resolutions.")); + PropertyField(m_FullResolution, EditorGUIUtility.TrTextContent("Full Resolution", "The effect runs at full resolution. This increases quality, but also decreases performance significantly.")); + PropertyField(m_StepCount, EditorGUIUtility.TrTextContent("Step Count", "Number of steps to take along one signed direction during horizon search (this is the number of steps in positive and negative direction).")); - if (m_DirectionCount.value.intValue > 3) - { - EditorGUILayout.HelpBox("Performance will be seriously impacted by high direction count.", MessageType.Warning, wide: true); - } - PropertyField(m_BlurSharpness, EditorGUIUtility.TrTextContent("Blur sharpness", "Modify the non-temporal blur to change how sharp features are preserved. Lower values blurrier/softer, higher values sharper but with risk of noise.")); - } - else + if(!m_TemporalAccumulation.value.boolValue) + { + PropertyField(m_DirectionCount, EditorGUIUtility.TrTextContent("Direction Count", "Number of directions searched for occlusion at each each pixel.")); + } + else + { + if (isInAdvancedMode && !m_FullResolution.value.boolValue) { - PropertyField(m_SpatialBilateralAggressiveness, EditorGUIUtility.TrTextContent("Bilateral Aggressiveness", "Higher this value, the less lenient with depth differences the spatial filter is. Increase if for example noticing white halos where AO should be.")); - PropertyField(m_GhostingAdjustement, EditorGUIUtility.TrTextContent("Ghosting reduction", "Moving this factor closer to 0 will increase the amount of accepted samples during temporal accumulation, increasing the ghosting, but reducing the temporal noise.")); - if (isInAdvancedMode && !m_FullResolution.value.boolValue) - { - PropertyField(m_BilateralUpsample, EditorGUIUtility.TrTextContent("Bilateral Upsample", "This upsample method preserves sharp edges better, however can result in visible aliasing and it is slightly more expensive.")); - } + PropertyField(m_BilateralUpsample, EditorGUIUtility.TrTextContent("Bilateral Upsample", "This upsample method preserves sharp edges better, however can result in visible aliasing and it is slightly more expensive.")); } - EditorGUI.indentLevel--; } } } diff --git a/com.unity.render-pipelines.high-definition/Editor/Lighting/Reflection/HDScreenSpaceReflectionEditor.cs b/com.unity.render-pipelines.high-definition/Editor/Lighting/Reflection/HDScreenSpaceReflectionEditor.cs index 25bc4caf088..bf0e7edc0fd 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Lighting/Reflection/HDScreenSpaceReflectionEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Lighting/Reflection/HDScreenSpaceReflectionEditor.cs @@ -107,28 +107,14 @@ void RayTracingQualityModeGUI() } } - void RayTracingPerformanceModeGUI() { - base.OnInspectorGUI(); - - using (new QualityScope(this)) + // Revert all of the indentation at this point since it will be formatted differently in the quality GUI. + using (new EditorGUI.IndentLevelScope(-EditorGUI.indentLevel)) { - EditorGUI.indentLevel++; - PropertyField(m_MinSmoothness, k_MinimumSmoothnessText); - PropertyField(m_SmoothnessFadeStart, k_SmoothnessFadeStartText); - m_SmoothnessFadeStart.value.floatValue = Mathf.Max(m_MinSmoothness.value.floatValue, m_SmoothnessFadeStart.value.floatValue); - PropertyField(m_RayLength, k_RayLengthText); - PropertyField(m_ClampValue, k_ClampValueText); - PropertyField(m_UpscaleRadius, k_UpscaleRadiusText); - PropertyField(m_FullResolution, k_FullResolutionText); - PropertyField(m_Denoise, k_DenoiseText); - { - EditorGUI.indentLevel++; - PropertyField(m_DenoiserRadius, k_DenoiseRadiusText); - EditorGUI.indentLevel--; - } - EditorGUI.indentLevel--; + // Performance GUI is entirely composed of quality settings. Defer drawing this to the base and handle + // drawing it in OnQualityGUI. + base.OnInspectorGUI(); } } @@ -203,33 +189,58 @@ public override void OnInspectorGUI() m_DepthBufferThickness.value.floatValue = Mathf.Clamp(m_DepthBufferThickness.value.floatValue, 0.001f, 1.0f); base.OnInspectorGUI(); + } + } - using (new QualityScope(this)) + public override void OnQualityGUI() + { + // RTR + if (HDRenderPipeline.pipelineSupportsRayTracing && m_RayTracing.overrideState.boolValue && + m_RayTracing.value.boolValue) + { + PropertyField(m_MinSmoothness, k_MinimumSmoothnessText); + PropertyField(m_SmoothnessFadeStart, k_SmoothnessFadeStartText); + m_SmoothnessFadeStart.value.floatValue = Mathf.Max(m_MinSmoothness.value.floatValue, m_SmoothnessFadeStart.value.floatValue); + PropertyField(m_RayLength, k_RayLengthText); + PropertyField(m_ClampValue, k_ClampValueText); + PropertyField(m_UpscaleRadius, k_UpscaleRadiusText); + PropertyField(m_FullResolution, k_FullResolutionText); + PropertyField(m_Denoise, k_DenoiseText); { EditorGUI.indentLevel++; - PropertyField(m_RayMaxIterations, k_RayMaxIterationsText); - m_RayMaxIterations.value.intValue = Mathf.Max(0, m_RayMaxIterations.value.intValue); + PropertyField(m_DenoiserRadius, k_DenoiseRadiusText); EditorGUI.indentLevel--; } } + // SSR + else + { + PropertyField(m_RayMaxIterations, k_RayMaxIterationsText); + m_RayMaxIterations.value.intValue = Mathf.Max(0, m_RayMaxIterations.value.intValue); + } } + public override QualitySettingsBlob SaveCustomQualitySettingsAsObject(QualitySettingsBlob settings = null) { if (settings == null) settings = new QualitySettingsBlob(); // RTR - settings.Save(m_MinSmoothness); - settings.Save(m_SmoothnessFadeStart); - settings.Save(m_RayLength); - settings.Save(m_ClampValue); - settings.Save(m_UpscaleRadius); - settings.Save(m_FullResolution); - settings.Save(m_Denoise); - settings.Save(m_DenoiserRadius); - + if (HDRenderPipeline.pipelineSupportsRayTracing && m_RayTracing.overrideState.boolValue && + m_RayTracing.value.boolValue) + { + settings.Save(m_MinSmoothness); + settings.Save(m_SmoothnessFadeStart); + settings.Save(m_RayLength); + settings.Save(m_ClampValue); + settings.Save(m_UpscaleRadius); + settings.Save(m_FullResolution); + settings.Save(m_Denoise); + settings.Save(m_DenoiserRadius); + } // SSR - settings.Save(m_RayMaxIterations); + else + settings.Save(m_RayMaxIterations); return settings; } @@ -237,33 +248,44 @@ public override QualitySettingsBlob SaveCustomQualitySettingsAsObject(QualitySet public override void LoadSettingsFromObject(QualitySettingsBlob settings) { // RTR - settings.TryLoad(ref m_MinSmoothness); - settings.TryLoad(ref m_SmoothnessFadeStart); - settings.TryLoad(ref m_RayLength); - settings.TryLoad(ref m_ClampValue); - settings.TryLoad(ref m_UpscaleRadius); - settings.TryLoad(ref m_FullResolution); - settings.TryLoad(ref m_Denoise); - settings.TryLoad(ref m_DenoiserRadius); - + if (HDRenderPipeline.pipelineSupportsRayTracing && m_RayTracing.overrideState.boolValue && + m_RayTracing.value.boolValue) + { + settings.TryLoad(ref m_MinSmoothness); + settings.TryLoad(ref m_SmoothnessFadeStart); + settings.TryLoad(ref m_RayLength); + settings.TryLoad(ref m_ClampValue); + settings.TryLoad(ref m_UpscaleRadius); + settings.TryLoad(ref m_FullResolution); + settings.TryLoad(ref m_Denoise); + settings.TryLoad(ref m_DenoiserRadius); + } // SSR - settings.TryLoad(ref m_RayMaxIterations); + else + settings.TryLoad(ref m_RayMaxIterations); } public override void LoadSettingsFromQualityPreset(RenderPipelineSettings settings, int level) { // RTR - CopySetting(ref m_MinSmoothness, settings.lightingQualitySettings.RTRMinSmoothness[level]); - CopySetting(ref m_SmoothnessFadeStart, settings.lightingQualitySettings.RTRSmoothnessFadeStart[level]); - CopySetting(ref m_RayLength, settings.lightingQualitySettings.RTRRayLength[level]); - CopySetting(ref m_ClampValue, settings.lightingQualitySettings.RTRClampValue[level]); - CopySetting(ref m_UpscaleRadius, settings.lightingQualitySettings.RTRUpScaleRadius[level]); - CopySetting(ref m_FullResolution, settings.lightingQualitySettings.RTRFullResolution[level]); - CopySetting(ref m_Denoise, settings.lightingQualitySettings.RTRDenoise[level]); - CopySetting(ref m_DenoiserRadius, settings.lightingQualitySettings.RTRDenoiserRadius[level]); - + // Note: We need to handle the raytracing case like this (instead of not caring), because some SSR settings + // (ie Min Smoothness), are note quality settings, but they are for RTR. Because of that, by switching between + // custom blob / presets, normal settings in SSR mode will be modified, which we don't want. + if (HDRenderPipeline.pipelineSupportsRayTracing && m_RayTracing.overrideState.boolValue && + m_RayTracing.value.boolValue) + { + CopySetting(ref m_MinSmoothness, settings.lightingQualitySettings.RTRMinSmoothness[level]); + CopySetting(ref m_SmoothnessFadeStart, settings.lightingQualitySettings.RTRSmoothnessFadeStart[level]); + CopySetting(ref m_RayLength, settings.lightingQualitySettings.RTRRayLength[level]); + CopySetting(ref m_ClampValue, settings.lightingQualitySettings.RTRClampValue[level]); + CopySetting(ref m_UpscaleRadius, settings.lightingQualitySettings.RTRUpScaleRadius[level]); + CopySetting(ref m_FullResolution, settings.lightingQualitySettings.RTRFullResolution[level]); + CopySetting(ref m_Denoise, settings.lightingQualitySettings.RTRDenoise[level]); + CopySetting(ref m_DenoiserRadius, settings.lightingQualitySettings.RTRDenoiserRadius[level]); + } // SSR - CopySetting(ref m_RayMaxIterations, settings.lightingQualitySettings.SSRMaxRaySteps[level]); + else + CopySetting(ref m_RayMaxIterations, settings.lightingQualitySettings.SSRMaxRaySteps[level]); } } } diff --git a/com.unity.render-pipelines.high-definition/Editor/Lighting/Shadow/ContactShadowsEditor.cs b/com.unity.render-pipelines.high-definition/Editor/Lighting/Shadow/ContactShadowsEditor.cs index 91153aab212..0defc055eab 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Lighting/Shadow/ContactShadowsEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Lighting/Shadow/ContactShadowsEditor.cs @@ -57,13 +57,14 @@ public override void OnInspectorGUI() PropertyField(m_Thickness, EditorGUIUtility.TrTextContent("Thickness", "Controls the thickness of the objects found along the ray, essentially thickening the contact shadows.")); base.OnInspectorGUI(); - - using (new QualityScope(this)) - { - PropertyField(m_SampleCount, EditorGUIUtility.TrTextContent("Sample Count", "Controls the number of samples HDRP uses for ray casting.")); - } } } + + public override void OnQualityGUI() + { + PropertyField(m_SampleCount, EditorGUIUtility.TrTextContent("Sample Count", "Controls the number of samples HDRP uses for ray casting.")); + } + public override QualitySettingsBlob SaveCustomQualitySettingsAsObject(QualitySettingsBlob settings = null) { if (settings == null) diff --git a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/BloomEditor.cs b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/BloomEditor.cs index aff65e27590..fe9e70420e4 100644 --- a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/BloomEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/BloomEditor.cs @@ -43,8 +43,6 @@ public override void OnEnable() public override void OnInspectorGUI() { - base.OnInspectorGUI(); - EditorGUILayout.LabelField("Bloom", EditorStyles.miniLabel); PropertyField(m_Threshold); PropertyField(m_Intensity); @@ -59,16 +57,22 @@ public override void OnInspectorGUI() { EditorGUILayout.LabelField("Advanced Tweaks", EditorStyles.miniLabel); - using (new QualityScope(this)) - { - PropertyField(m_Resolution); - PropertyField(m_HighQualityPrefiltering); - PropertyField(m_HighQualityFiltering); - } - PropertyField(m_Anamorphic); } + + base.OnInspectorGUI(); + } + + public override void OnQualityGUI() + { + if (isInAdvancedMode) + { + PropertyField(m_Resolution); + PropertyField(m_HighQualityPrefiltering); + PropertyField(m_HighQualityFiltering); + } } + public override QualitySettingsBlob SaveCustomQualitySettingsAsObject(QualitySettingsBlob settings = null) { if (settings == null) diff --git a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/ChromaticAberrationEditor.cs b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/ChromaticAberrationEditor.cs index 8fda7e4c509..516198764c9 100644 --- a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/ChromaticAberrationEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/ChromaticAberrationEditor.cs @@ -27,12 +27,13 @@ public override void OnInspectorGUI() PropertyField(m_Intensity); base.OnInspectorGUI(); + } - using (new QualityScope(this)) - { - PropertyField(m_MaxSamples); - } + public override void OnQualityGUI() + { + PropertyField(m_MaxSamples); } + public override QualitySettingsBlob SaveCustomQualitySettingsAsObject(QualitySettingsBlob settings = null) { if (settings == null) diff --git a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs index dfb554801fa..6748f0775dc 100644 --- a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs @@ -87,17 +87,7 @@ public override void OnInspectorGUI() DrawFocusSettings(mode); } - EditorGUILayout.Space(); - base.OnInspectorGUI(); - - using (new HDEditorUtils.IndentScope()) - { - // Draw the quality controls - GUI.enabled = GUI.enabled && base.overrideState; - DrawQualitySettings(); - GUI.enabled = true; - } } void DrawFocusSettings(int mode) @@ -118,27 +108,24 @@ void DrawFocusSettings(int mode) } } - void DrawQualitySettings() + public override void OnQualityGUI() { - using (new QualityScope(this)) + EditorGUILayout.LabelField("Near Blur", EditorStyles.miniLabel); + PropertyField(m_NearSampleCount, Styles.k_NearSampleCount); + PropertyField(m_NearMaxBlur, Styles.k_NearMaxBlur); + + EditorGUILayout.LabelField("Far Blur", EditorStyles.miniLabel); + PropertyField(m_FarSampleCount, Styles.k_FarSampleCount); + PropertyField(m_FarMaxBlur, Styles.k_FarMaxBlur); + + if (isInAdvancedMode) { - EditorGUILayout.LabelField("Near Blur", EditorStyles.miniLabel); - PropertyField(m_NearSampleCount, Styles.k_NearSampleCount); - PropertyField(m_NearMaxBlur, Styles.k_NearMaxBlur); - - EditorGUILayout.LabelField("Far Blur", EditorStyles.miniLabel); - PropertyField(m_FarSampleCount, Styles.k_FarSampleCount); - PropertyField(m_FarMaxBlur, Styles.k_FarMaxBlur); - - if (isInAdvancedMode) - { - EditorGUILayout.LabelField("Advanced Tweaks", EditorStyles.miniLabel); - PropertyField(m_Resolution); - PropertyField(m_HighQualityFiltering); - PropertyField(m_PhysicallyBased); - if (m_PhysicallyBased.value.boolValue == true) - EditorGUILayout.HelpBox(Styles.InfoBox, MessageType.Info); - } + EditorGUILayout.LabelField("Advanced Tweaks", EditorStyles.miniLabel); + PropertyField(m_Resolution); + PropertyField(m_HighQualityFiltering); + PropertyField(m_PhysicallyBased); + if (m_PhysicallyBased.value.boolValue == true) + EditorGUILayout.HelpBox(Styles.InfoBox, MessageType.Info); } } diff --git a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/MotionBlurEditor.cs b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/MotionBlurEditor.cs index 3a8b106cfc4..94c82dc99cd 100644 --- a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/MotionBlurEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/MotionBlurEditor.cs @@ -42,13 +42,6 @@ public override void OnInspectorGUI() PropertyField(m_Intensity); - base.OnInspectorGUI(); - - using (new QualityScope(this)) - { - PropertyField(m_SampleCount); - } - PropertyField(m_MaxVelocityInPixels); PropertyField(m_MinVelInPixels); @@ -58,7 +51,15 @@ public override void OnInspectorGUI() PropertyField(m_CameraRotClamp); PropertyField(m_CameraMotionBlur); } + + base.OnInspectorGUI(); } + + public override void OnQualityGUI() + { + PropertyField(m_SampleCount); + } + public override QualitySettingsBlob SaveCustomQualitySettingsAsObject(QualitySettingsBlob settings = null) { if (settings == null) diff --git a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/Raytracing/GlobalIlluminationEditor.cs b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/Raytracing/GlobalIlluminationEditor.cs index 66b89b60a05..f2d73a85cd3 100644 --- a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/Raytracing/GlobalIlluminationEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/Raytracing/GlobalIlluminationEditor.cs @@ -90,9 +90,10 @@ public void DenoiserGUI() } } + private bool m_RayTracingSettingsDisplayed; + public override void OnInspectorGUI() { - HDRenderPipelineAsset currentAsset = HDRenderPipeline.currentAsset; if (!currentAsset?.currentPlatformRenderPipelineSettings.supportSSGI ?? false) { @@ -110,14 +111,14 @@ public override void OnInspectorGUI() } // Flag to track if the ray tracing parameters were displayed - bool rayTracingSettingsDisplayed = false; + m_RayTracingSettingsDisplayed = false; EditorGUI.indentLevel++; if (HDRenderPipeline.pipelineSupportsRayTracing) { if (m_RayTracing.overrideState.boolValue && m_RayTracing.value.boolValue) { - rayTracingSettingsDisplayed = true; + m_RayTracingSettingsDisplayed = true; PropertyField(m_LayerMask); if (currentAsset.currentPlatformRenderPipelineSettings.supportedRayTracingMode == RenderPipelineSettings.SupportedRayTracingMode.Both) { @@ -127,18 +128,10 @@ public override void OnInspectorGUI() { case RayTracingMode.Performance: { - base.OnInspectorGUI(); // Quality Setting - EditorGUI.indentLevel++; - using (new QualityScope(this)) + using (new EditorGUI.IndentLevelScope(-EditorGUI.indentLevel)) { - PropertyField(m_RayLength, k_RayLengthText); - PropertyField(m_RayLength); - PropertyField(m_ClampValue); - PropertyField(m_FullResolution); - PropertyField(m_UpscaleRadius); - DenoiserGUI(); + base.OnInspectorGUI(); // Quality Setting } - EditorGUI.indentLevel--; } break; @@ -164,40 +157,46 @@ public override void OnInspectorGUI() } else { - base.OnInspectorGUI(); // Quality Setting - EditorGUI.indentLevel++; - using (new QualityScope(this)) + using (new EditorGUI.IndentLevelScope(-EditorGUI.indentLevel)) { - PropertyField(m_RayLength, k_RayLengthText); - PropertyField(m_RayLength); - PropertyField(m_ClampValue); - PropertyField(m_FullResolution); - PropertyField(m_UpscaleRadius); - DenoiserGUI(); + base.OnInspectorGUI(); // Quality Setting } - EditorGUI.indentLevel--; } } } - // If we dit not display the ray tracing parameter, we display the ssgi ones - if (!rayTracingSettingsDisplayed) + EditorGUI.indentLevel--; + + // If we did not display the ray tracing parameter, we display the ssgi ones + if (!m_RayTracingSettingsDisplayed) { - base.OnInspectorGUI(); // Quality Setting - EditorGUI.indentLevel++; - using (new QualityScope(this)) - { - PropertyField(m_FullResolutionSS, EditorGUIUtility.TrTextContent("Full Resolution", "Enables full resolution mode.")); - PropertyField(m_RaySteps); - PropertyField(m_FilterRadius); - } - EditorGUI.indentLevel--; PropertyField(m_DepthBufferThickness, k_DepthBufferThicknessText); + + // Quality Setting + base.OnInspectorGUI(); } + } - EditorGUI.indentLevel--; + public override void OnQualityGUI() + { + if (m_RayTracingSettingsDisplayed) + { + PropertyField(m_RayLength, k_RayLengthText); + PropertyField(m_RayLength); + PropertyField(m_ClampValue); + PropertyField(m_FullResolution); + PropertyField(m_UpscaleRadius); + DenoiserGUI(); + } + else + { + PropertyField(m_FullResolutionSS, EditorGUIUtility.TrTextContent("Full Resolution", "Enables full resolution mode.")); + PropertyField(m_RaySteps); + PropertyField(m_FilterRadius); + } } + public override QualitySettingsBlob SaveCustomQualitySettingsAsObject(QualitySettingsBlob settings = null) { if (settings == null) diff --git a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs index 95c2ce31af9..007280213ab 100644 --- a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Runtime.CompilerServices; +using UnityEngine; using UnityEngine.Rendering; using UnityEngine.Rendering.HighDefinition; @@ -21,9 +22,9 @@ private struct QualitySetting public bool state; public object value; } - + Dictionary settings = new Dictionary(); - + public static bool IsEqual (QualitySettingsBlob left, QualitySettingsBlob right) { if (right == null && left == null) @@ -66,13 +67,13 @@ int Hash(SerializedDataParameter setting) return hash; } - // Save a setting to the quality blob. + // Save a setting to the quality blob. public void Save(SerializedDataParameter setting) where T : struct { QualitySetting s; s.state = setting.overrideState.boolValue; s.value = setting.value.GetInline(); - + int key = Hash(setting); if (settings.ContainsKey(key)) @@ -99,7 +100,7 @@ public void TryLoad(ref SerializedDataParameter setting) where T : struct } /// - /// Scoped quality setting change checker. + /// Scoped quality setting change checker. /// public struct QualityScope : IDisposable { @@ -143,9 +144,13 @@ public override void OnInspectorGUI() int prevQualityLevel = m_QualitySetting.value.intValue; EditorGUI.BeginChangeCheck(); + + // Provide some spacing between the quality properties and the preceding properties. + EditorGUILayout.Space(); + PropertyField(m_QualitySetting); - // When a quality preset changes, we want to detect and reflect the settings in the UI. PropertyFields mirror the contents of one memory loccation, so + // When a quality preset changes, we want to detect and reflect the settings in the UI. PropertyFields mirror the contents of one memory location, so // the idea is that we copy the presets to that location. This logic is optional, if volume components don't override the helper functions at the end, // they will continue to work, but the preset settings will not be reflected in the UI. if (EditorGUI.EndChangeCheck()) @@ -171,7 +176,7 @@ public override void OnInspectorGUI() var pipeline = (HDRenderPipeline)RenderPipelineManager.currentPipeline; if (pipeline != null) { - // If we switch from a custom quality level, then save these values so we can re-use them if teh user switches back + // If we switch from a custom quality level, then save these values so we can re-use them if the user switches back if (prevQualityLevel == k_CustomQuality) { QualitySettingsBlob history = null; @@ -185,7 +190,7 @@ public override void OnInspectorGUI() // Only keep track of custom settings for components that implement the new interface (and return not null) history = SaveCustomQualitySettingsAsObject(); if (history != null) - { + { s_CustomSettingsHistory.Add(serializedObject.targetObject, history); } @@ -195,18 +200,31 @@ public override void OnInspectorGUI() } } } + + // Draw the quality settings. Provide some indentation and check for any changes. + using (new HDEditorUtils.IndentScope()) + { + GUI.enabled = GUI.enabled && overrideState; + + using (new QualityScope(this)) + { + OnQualityGUI(); + } + + GUI.enabled = true; + } } protected bool useCustomValue => m_QualitySetting.value.intValue == k_CustomQuality; protected bool overrideState => m_QualitySetting.overrideState.boolValue; - + /// /// This utility can be used to copy a value into a volume component setting visible in the inspector. /// protected static void CopySetting(ref SerializedDataParameter setting, T value) where T : struct { setting.value.SetInline(value); - + // Force enable the override state, to indicate that these values are actually used. setting.overrideState.boolValue = true; } @@ -231,6 +249,11 @@ public virtual void LoadSettingsFromQualityPreset(RenderPipelineSettings setting /// public virtual void LoadSettingsFromObject(QualitySettingsBlob settings) { } + /// + /// This function should be overriden by a volume component to draw its quality settings. + /// + public virtual void OnQualityGUI() { } + } } From 39a575aa13743fa3369ed24eb7890f211a29c4ae Mon Sep 17 00:00:00 2001 From: John Parsaie Date: Thu, 22 Oct 2020 14:32:41 -0400 Subject: [PATCH 36/39] Fixed and issue with quality setting now displayed the preset value of current HDRP asset. Nudge indent scope default by 1 pixel. --- .../Editor/Lighting/AmbientOcclusionEditor.cs | 4 ++-- .../Reflection/HDScreenSpaceReflectionEditor.cs | 4 ++-- .../Editor/Lighting/Shadow/ContactShadowsEditor.cs | 4 ++-- .../Editor/PostProcessing/BloomEditor.cs | 4 ++-- .../PostProcessing/ChromaticAberrationEditor.cs | 5 +++-- .../Editor/PostProcessing/DepthOfFieldEditor.cs | 4 ++-- .../Editor/PostProcessing/MotionBlurEditor.cs | 4 ++-- .../Editor/RenderPipeline/HDEditorUtils.cs | 4 ++-- .../Raytracing/GlobalIlluminationEditor.cs | 4 ++-- .../VolumeComponentWithQualityEditor.cs | 13 +++++++++++++ 10 files changed, 32 insertions(+), 18 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/Lighting/AmbientOcclusionEditor.cs b/com.unity.render-pipelines.high-definition/Editor/Lighting/AmbientOcclusionEditor.cs index c48995a9122..47e3203b213 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Lighting/AmbientOcclusionEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Lighting/AmbientOcclusionEditor.cs @@ -37,8 +37,6 @@ class AmbientOcclusionEditor : VolumeComponentWithQualityEditor public override void OnEnable() { - base.OnEnable(); - var o = new PropertyFetcher(serializedObject); m_Intensity = Unpack(o.Find(x => x.intensity)); @@ -61,6 +59,8 @@ public override void OnEnable() m_Denoise = Unpack(o.Find(x => x.denoise)); m_SampleCount = Unpack(o.Find(x => x.sampleCount)); m_DenoiserRadius = Unpack(o.Find(x => x.denoiserRadius)); + + base.OnEnable(); } public override void OnInspectorGUI() diff --git a/com.unity.render-pipelines.high-definition/Editor/Lighting/Reflection/HDScreenSpaceReflectionEditor.cs b/com.unity.render-pipelines.high-definition/Editor/Lighting/Reflection/HDScreenSpaceReflectionEditor.cs index bf0e7edc0fd..28f56c9e6b4 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Lighting/Reflection/HDScreenSpaceReflectionEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Lighting/Reflection/HDScreenSpaceReflectionEditor.cs @@ -39,8 +39,6 @@ class HDScreenSpaceReflectionEditor : VolumeComponentWithQualityEditor public override void OnEnable() { - base.OnEnable(); - var o = new PropertyFetcher(serializedObject); m_Enable = Unpack(o.Find(x => x.enabled)); m_RayTracing = Unpack(o.Find(x => x.rayTracing)); @@ -70,6 +68,8 @@ public override void OnEnable() // Quality m_SampleCount = Unpack(o.Find(x => x.sampleCount)); m_BounceCount = Unpack(o.Find(x => x.bounceCount)); + + base.OnEnable(); } static public readonly GUIContent k_RayTracingText = EditorGUIUtility.TrTextContent("Ray Tracing (Preview)", "Enable ray traced reflections."); diff --git a/com.unity.render-pipelines.high-definition/Editor/Lighting/Shadow/ContactShadowsEditor.cs b/com.unity.render-pipelines.high-definition/Editor/Lighting/Shadow/ContactShadowsEditor.cs index 0defc055eab..ed71cd4835d 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Lighting/Shadow/ContactShadowsEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Lighting/Shadow/ContactShadowsEditor.cs @@ -21,8 +21,6 @@ class ContactShadowsEditor : VolumeComponentWithQualityEditor public override void OnEnable() { - base.OnEnable(); - var o = new PropertyFetcher(serializedObject); m_Enable = Unpack(o.Find(x => x.enable)); @@ -36,6 +34,8 @@ public override void OnEnable() m_Opacity = Unpack(o.Find(x => x.opacity)); m_Bias = Unpack(o.Find(x => x.rayBias)); m_Thickness = Unpack(o.Find(x => x.thicknessScale)); + + base.OnEnable(); } public override void OnInspectorGUI() diff --git a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/BloomEditor.cs b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/BloomEditor.cs index fe9e70420e4..540a683f296 100644 --- a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/BloomEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/BloomEditor.cs @@ -24,8 +24,6 @@ sealed class BloomEditor : VolumeComponentWithQualityEditor public override void OnEnable() { - base.OnEnable(); - var o = new PropertyFetcher(serializedObject); m_Threshold = Unpack(o.Find(x => x.threshold)); @@ -39,6 +37,8 @@ public override void OnEnable() m_HighQualityFiltering = Unpack(o.Find("m_HighQualityFiltering")); m_Resolution = Unpack(o.Find("m_Resolution")); m_Anamorphic = Unpack(o.Find(x => x.anamorphic)); + + base.OnEnable(); } public override void OnInspectorGUI() diff --git a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/ChromaticAberrationEditor.cs b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/ChromaticAberrationEditor.cs index 516198764c9..09697526e40 100644 --- a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/ChromaticAberrationEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/ChromaticAberrationEditor.cs @@ -13,12 +13,13 @@ sealed class ChromaticAberrationEditor : VolumeComponentWithQualityEditor public override void OnEnable() { - base.OnEnable(); - var o = new PropertyFetcher(serializedObject); + m_SpectralLUT = Unpack(o.Find(x => x.spectralLut)); m_Intensity = Unpack(o.Find(x => x.intensity)); m_MaxSamples = Unpack(o.Find("m_MaxSamples")); + + base.OnEnable(); } public override void OnInspectorGUI() diff --git a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs index 6748f0775dc..c7097cd94c3 100644 --- a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs @@ -50,8 +50,6 @@ static partial class Styles public override void OnEnable() { - base.OnEnable(); - var o = new PropertyFetcher(serializedObject); m_FocusMode = Unpack(o.Find(x => x.focusMode)); @@ -71,6 +69,8 @@ public override void OnEnable() m_HighQualityFiltering = Unpack(o.Find("m_HighQualityFiltering")); m_Resolution = Unpack(o.Find("m_Resolution")); m_PhysicallyBased = Unpack(o.Find("m_PhysicallyBased")); + + base.OnEnable(); } public override void OnInspectorGUI() diff --git a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/MotionBlurEditor.cs b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/MotionBlurEditor.cs index 94c82dc99cd..158eb8ac0d7 100644 --- a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/MotionBlurEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/MotionBlurEditor.cs @@ -23,8 +23,6 @@ sealed class MotionBlurEditor : VolumeComponentWithQualityEditor public override void OnEnable() { - base.OnEnable(); - var o = new PropertyFetcher(serializedObject); m_Intensity = Unpack(o.Find(x => x.intensity)); @@ -34,6 +32,8 @@ public override void OnEnable() m_CameraRotClamp = Unpack(o.Find(x => x.cameraRotationVelocityClamp)); m_DepthCmpScale = Unpack(o.Find(x => x.depthComparisonExtent)); m_CameraMotionBlur = Unpack(o.Find(x => x.cameraMotionBlur)); + + base.OnEnable(); } public override void OnInspectorGUI() diff --git a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/HDEditorUtils.cs b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/HDEditorUtils.cs index 954624aba96..48538af38d3 100644 --- a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/HDEditorUtils.cs +++ b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/HDEditorUtils.cs @@ -242,7 +242,7 @@ internal static void DrawDecalLayerMask_Internal(Rect rect, GUIContent label, Se EditorGUI.EndProperty(); } - + /// /// Should be placed between BeginProperty / EndProperty @@ -299,7 +299,7 @@ internal static void HandlePrefixLabelWithIndent(Rect totalPosition, Rect labelP /// internal class IndentScope : GUI.Scope { - public IndentScope(int offset = 15) + public IndentScope(int offset = 16) { // When using EditorGUI.indentLevel++, the clicking on the checkboxes does not work properly due to some issues on the C++ side. // This scope is a work-around for this issue. diff --git a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/Raytracing/GlobalIlluminationEditor.cs b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/Raytracing/GlobalIlluminationEditor.cs index f2d73a85cd3..8a5168f84aa 100644 --- a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/Raytracing/GlobalIlluminationEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/Raytracing/GlobalIlluminationEditor.cs @@ -41,8 +41,6 @@ class GlobalIlluminatorEditor : VolumeComponentWithQualityEditor public override void OnEnable() { - base.OnEnable(); - var o = new PropertyFetcher(serializedObject); m_Enable = Unpack(o.Find(x => x.enable)); @@ -73,6 +71,8 @@ public override void OnEnable() m_HalfResolutionDenoiser = Unpack(o.Find(x => x.halfResolutionDenoiser)); m_DenoiserRadius = Unpack(o.Find(x => x.denoiserRadius)); m_SecondDenoiserPass = Unpack(o.Find(x => x.secondDenoiserPass)); + + base.OnEnable(); } static public readonly GUIContent k_RayLengthText = EditorGUIUtility.TrTextContent("Max Ray Length", "Controls the maximal length of global illumination rays. The higher this value is, the more expensive ray traced global illumination is."); diff --git a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs index 007280213ab..dcf083f7936 100644 --- a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs @@ -137,6 +137,19 @@ public override void OnEnable() { var o = new PropertyFetcher(serializedObject); m_QualitySetting = Unpack(o.Find(x => x.quality)); + + // Ensure we reflect presets in the pipeline asset, not the hardcoded defaults. + // Warning: base.OnEnable must be called after VolumeComponentWithQuality has unpacked SerializedData. + var pipeline = (HDRenderPipeline)RenderPipelineManager.currentPipeline; + if (pipeline != null) + { + serializedObject.Update(); + + if (m_QualitySetting.value.intValue < k_CustomQuality) + LoadSettingsFromQualityPreset(pipeline.currentPlatformRenderPipelineSettings, m_QualitySetting.value.intValue); + + serializedObject.ApplyModifiedProperties(); + } } public override void OnInspectorGUI() From ee77e7c9b7f0e666300a0799f5e5ce5e4a9392cd Mon Sep 17 00:00:00 2001 From: John Parsaie Date: Fri, 23 Oct 2020 11:15:08 -0400 Subject: [PATCH 37/39] Revert "Organize quality volume components to place the quality settings at the bottom (match how DoF is done)." This reverts commit 2b26956f2d800d1de411f6e910fe50a3f8ff26b0. --- .../Editor/Lighting/AmbientOcclusionEditor.cs | 85 +++++------- .../HDScreenSpaceReflectionEditor.cs | 126 ++++++++---------- .../Lighting/Shadow/ContactShadowsEditor.cs | 11 +- .../Editor/PostProcessing/BloomEditor.cs | 22 ++- .../ChromaticAberrationEditor.cs | 9 +- .../PostProcessing/DepthOfFieldEditor.cs | 45 ++++--- .../Editor/PostProcessing/MotionBlurEditor.cs | 15 +-- .../Raytracing/GlobalIlluminationEditor.cs | 69 +++++----- .../VolumeComponentWithQualityEditor.cs | 43 ++---- 9 files changed, 188 insertions(+), 237 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/Lighting/AmbientOcclusionEditor.cs b/com.unity.render-pipelines.high-definition/Editor/Lighting/AmbientOcclusionEditor.cs index 47e3203b213..02fc0850bcc 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Lighting/AmbientOcclusionEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Lighting/AmbientOcclusionEditor.cs @@ -83,67 +83,56 @@ public override void OnInspectorGUI() if (HDRenderPipeline.pipelineSupportsRayTracing && m_RayTracing.overrideState.boolValue && m_RayTracing.value.boolValue) { PropertyField(m_LayerMask, EditorGUIUtility.TrTextContent("Layer Mask", "Layer mask used to include the objects for ambient occlusion.")); - base.OnInspectorGUI(); // Quality Setting - } - else - { - PropertyField(m_Radius, EditorGUIUtility.TrTextContent("Radius", "Sampling radius. Bigger the radius, wider AO will be achieved, risking to lose fine details and increasing cost of the effect due to increasing cache misses.")); - - PropertyField(m_TemporalAccumulation, EditorGUIUtility.TrTextContent("Temporal Accumulation", "Whether the results are accumulated over time or not. This can get better results cheaper, but it can lead to temporal artifacts. Requires Motion Vectors to be enabled.")); - - EditorGUI.indentLevel++; - if(!m_TemporalAccumulation.value.boolValue) + using (new QualityScope(this)) { - if (m_DirectionCount.value.intValue > 3) + EditorGUI.indentLevel++; + PropertyField(m_RayLength, EditorGUIUtility.TrTextContent("Max Ray Length", "Controls the maximal length of ambient occlusion rays. The higher this value is, the more expensive ray traced ambient occlusion is.")); + PropertyField(m_SampleCount, EditorGUIUtility.TrTextContent("Sample Count", "Number of samples for ray traced ambient occlusion.")); + PropertyField(m_Denoise, EditorGUIUtility.TrTextContent("Denoise", "Enable denoising on the ray traced ambient occlusion.")); { - EditorGUILayout.HelpBox("Performance will be seriously impacted by high direction count.", MessageType.Warning, wide: true); + EditorGUI.indentLevel++; + PropertyField(m_DenoiserRadius, EditorGUIUtility.TrTextContent("Denoiser Radius", "Radius parameter for the denoising.")); + EditorGUI.indentLevel--; } - - PropertyField(m_BlurSharpness, EditorGUIUtility.TrTextContent("Blur sharpness", "Modify the non-temporal blur to change how sharp features are preserved. Lower values blurrier/softer, higher values sharper but with risk of noise.")); - } - else - { - PropertyField(m_SpatialBilateralAggressiveness, EditorGUIUtility.TrTextContent("Bilateral Aggressiveness", "Higher this value, the less lenient with depth differences the spatial filter is. Increase if for example noticing white halos where AO should be.")); - PropertyField(m_GhostingAdjustement, EditorGUIUtility.TrTextContent("Ghosting reduction", "Moving this factor closer to 0 will increase the amount of accepted samples during temporal accumulation, increasing the ghosting, but reducing the temporal noise.")); - } - EditorGUI.indentLevel--; - - base.OnInspectorGUI(); // Quality Setting - } - } - - public override void OnQualityGUI() - { - if (HDRenderPipeline.pipelineSupportsRayTracing && m_RayTracing.overrideState.boolValue && - m_RayTracing.value.boolValue) - { - PropertyField(m_RayLength, EditorGUIUtility.TrTextContent("Max Ray Length", "Controls the maximal length of ambient occlusion rays. The higher this value is, the more expensive ray traced ambient occlusion is.")); - PropertyField(m_SampleCount, EditorGUIUtility.TrTextContent("Sample Count", "Number of samples for ray traced ambient occlusion.")); - - PropertyField(m_Denoise, EditorGUIUtility.TrTextContent("Denoise", "Enable denoising on the ray traced ambient occlusion.")); - { - EditorGUI.indentLevel++; - PropertyField(m_DenoiserRadius, EditorGUIUtility.TrTextContent("Denoiser Radius", "Radius parameter for the denoising.")); EditorGUI.indentLevel--; } } else { - PropertyField(m_MaximumRadiusInPixels, EditorGUIUtility.TrTextContent("Maximum Radius In Pixels", "This poses a maximum radius in pixels that we consider. It is very important to keep this as tight as possible to preserve good performance. Note that this is the value used for 1080p when *not* running the effect at full resolution, it will be scaled accordingly for other resolutions.")); - PropertyField(m_FullResolution, EditorGUIUtility.TrTextContent("Full Resolution", "The effect runs at full resolution. This increases quality, but also decreases performance significantly.")); - PropertyField(m_StepCount, EditorGUIUtility.TrTextContent("Step Count", "Number of steps to take along one signed direction during horizon search (this is the number of steps in positive and negative direction).")); - if(!m_TemporalAccumulation.value.boolValue) - { - PropertyField(m_DirectionCount, EditorGUIUtility.TrTextContent("Direction Count", "Number of directions searched for occlusion at each each pixel.")); - } - else + PropertyField(m_Radius, EditorGUIUtility.TrTextContent("Radius", "Sampling radius. Bigger the radius, wider AO will be achieved, risking to lose fine details and increasing cost of the effect due to increasing cache misses.")); + + base.OnInspectorGUI(); // Quality Setting + + using (new QualityScope(this)) { - if (isInAdvancedMode && !m_FullResolution.value.boolValue) + PropertyField(m_MaximumRadiusInPixels, EditorGUIUtility.TrTextContent("Maximum Radius In Pixels", "This poses a maximum radius in pixels that we consider. It is very important to keep this as tight as possible to preserve good performance. Note that this is the value used for 1080p when *not* running the effect at full resolution, it will be scaled accordingly for other resolutions.")); + PropertyField(m_FullResolution, EditorGUIUtility.TrTextContent("Full Resolution", "The effect runs at full resolution. This increases quality, but also decreases performance significantly.")); + PropertyField(m_StepCount, EditorGUIUtility.TrTextContent("Step Count", "Number of steps to take along one signed direction during horizon search (this is the number of steps in positive and negative direction).")); + + PropertyField(m_TemporalAccumulation, EditorGUIUtility.TrTextContent("Temporal Accumulation", "Whether the results are accumulated over time or not. This can get better results cheaper, but it can lead to temporal artifacts. Requires Motion Vectors to be enabled.")); + EditorGUI.indentLevel++; + if(!m_TemporalAccumulation.value.boolValue) { - PropertyField(m_BilateralUpsample, EditorGUIUtility.TrTextContent("Bilateral Upsample", "This upsample method preserves sharp edges better, however can result in visible aliasing and it is slightly more expensive.")); + PropertyField(m_DirectionCount, EditorGUIUtility.TrTextContent("Direction Count", "Number of directions searched for occlusion at each each pixel.")); + + if (m_DirectionCount.value.intValue > 3) + { + EditorGUILayout.HelpBox("Performance will be seriously impacted by high direction count.", MessageType.Warning, wide: true); + } + PropertyField(m_BlurSharpness, EditorGUIUtility.TrTextContent("Blur sharpness", "Modify the non-temporal blur to change how sharp features are preserved. Lower values blurrier/softer, higher values sharper but with risk of noise.")); + } + else + { + PropertyField(m_SpatialBilateralAggressiveness, EditorGUIUtility.TrTextContent("Bilateral Aggressiveness", "Higher this value, the less lenient with depth differences the spatial filter is. Increase if for example noticing white halos where AO should be.")); + PropertyField(m_GhostingAdjustement, EditorGUIUtility.TrTextContent("Ghosting reduction", "Moving this factor closer to 0 will increase the amount of accepted samples during temporal accumulation, increasing the ghosting, but reducing the temporal noise.")); + if (isInAdvancedMode && !m_FullResolution.value.boolValue) + { + PropertyField(m_BilateralUpsample, EditorGUIUtility.TrTextContent("Bilateral Upsample", "This upsample method preserves sharp edges better, however can result in visible aliasing and it is slightly more expensive.")); + } } + EditorGUI.indentLevel--; } } } diff --git a/com.unity.render-pipelines.high-definition/Editor/Lighting/Reflection/HDScreenSpaceReflectionEditor.cs b/com.unity.render-pipelines.high-definition/Editor/Lighting/Reflection/HDScreenSpaceReflectionEditor.cs index 28f56c9e6b4..37d7d8a8935 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Lighting/Reflection/HDScreenSpaceReflectionEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Lighting/Reflection/HDScreenSpaceReflectionEditor.cs @@ -107,14 +107,28 @@ void RayTracingQualityModeGUI() } } + void RayTracingPerformanceModeGUI() { - // Revert all of the indentation at this point since it will be formatted differently in the quality GUI. - using (new EditorGUI.IndentLevelScope(-EditorGUI.indentLevel)) + base.OnInspectorGUI(); + + using (new QualityScope(this)) { - // Performance GUI is entirely composed of quality settings. Defer drawing this to the base and handle - // drawing it in OnQualityGUI. - base.OnInspectorGUI(); + EditorGUI.indentLevel++; + PropertyField(m_MinSmoothness, k_MinimumSmoothnessText); + PropertyField(m_SmoothnessFadeStart, k_SmoothnessFadeStartText); + m_SmoothnessFadeStart.value.floatValue = Mathf.Max(m_MinSmoothness.value.floatValue, m_SmoothnessFadeStart.value.floatValue); + PropertyField(m_RayLength, k_RayLengthText); + PropertyField(m_ClampValue, k_ClampValueText); + PropertyField(m_UpscaleRadius, k_UpscaleRadiusText); + PropertyField(m_FullResolution, k_FullResolutionText); + PropertyField(m_Denoise, k_DenoiseText); + { + EditorGUI.indentLevel++; + PropertyField(m_DenoiserRadius, k_DenoiseRadiusText); + EditorGUI.indentLevel--; + } + EditorGUI.indentLevel--; } } @@ -189,58 +203,33 @@ public override void OnInspectorGUI() m_DepthBufferThickness.value.floatValue = Mathf.Clamp(m_DepthBufferThickness.value.floatValue, 0.001f, 1.0f); base.OnInspectorGUI(); - } - } - public override void OnQualityGUI() - { - // RTR - if (HDRenderPipeline.pipelineSupportsRayTracing && m_RayTracing.overrideState.boolValue && - m_RayTracing.value.boolValue) - { - PropertyField(m_MinSmoothness, k_MinimumSmoothnessText); - PropertyField(m_SmoothnessFadeStart, k_SmoothnessFadeStartText); - m_SmoothnessFadeStart.value.floatValue = Mathf.Max(m_MinSmoothness.value.floatValue, m_SmoothnessFadeStart.value.floatValue); - PropertyField(m_RayLength, k_RayLengthText); - PropertyField(m_ClampValue, k_ClampValueText); - PropertyField(m_UpscaleRadius, k_UpscaleRadiusText); - PropertyField(m_FullResolution, k_FullResolutionText); - PropertyField(m_Denoise, k_DenoiseText); + using (new QualityScope(this)) { EditorGUI.indentLevel++; - PropertyField(m_DenoiserRadius, k_DenoiseRadiusText); + PropertyField(m_RayMaxIterations, k_RayMaxIterationsText); + m_RayMaxIterations.value.intValue = Mathf.Max(0, m_RayMaxIterations.value.intValue); EditorGUI.indentLevel--; } } - // SSR - else - { - PropertyField(m_RayMaxIterations, k_RayMaxIterationsText); - m_RayMaxIterations.value.intValue = Mathf.Max(0, m_RayMaxIterations.value.intValue); - } } - public override QualitySettingsBlob SaveCustomQualitySettingsAsObject(QualitySettingsBlob settings = null) { if (settings == null) settings = new QualitySettingsBlob(); // RTR - if (HDRenderPipeline.pipelineSupportsRayTracing && m_RayTracing.overrideState.boolValue && - m_RayTracing.value.boolValue) - { - settings.Save(m_MinSmoothness); - settings.Save(m_SmoothnessFadeStart); - settings.Save(m_RayLength); - settings.Save(m_ClampValue); - settings.Save(m_UpscaleRadius); - settings.Save(m_FullResolution); - settings.Save(m_Denoise); - settings.Save(m_DenoiserRadius); - } + settings.Save(m_MinSmoothness); + settings.Save(m_SmoothnessFadeStart); + settings.Save(m_RayLength); + settings.Save(m_ClampValue); + settings.Save(m_UpscaleRadius); + settings.Save(m_FullResolution); + settings.Save(m_Denoise); + settings.Save(m_DenoiserRadius); + // SSR - else - settings.Save(m_RayMaxIterations); + settings.Save(m_RayMaxIterations); return settings; } @@ -248,44 +237,33 @@ public override QualitySettingsBlob SaveCustomQualitySettingsAsObject(QualitySet public override void LoadSettingsFromObject(QualitySettingsBlob settings) { // RTR - if (HDRenderPipeline.pipelineSupportsRayTracing && m_RayTracing.overrideState.boolValue && - m_RayTracing.value.boolValue) - { - settings.TryLoad(ref m_MinSmoothness); - settings.TryLoad(ref m_SmoothnessFadeStart); - settings.TryLoad(ref m_RayLength); - settings.TryLoad(ref m_ClampValue); - settings.TryLoad(ref m_UpscaleRadius); - settings.TryLoad(ref m_FullResolution); - settings.TryLoad(ref m_Denoise); - settings.TryLoad(ref m_DenoiserRadius); - } + settings.TryLoad(ref m_MinSmoothness); + settings.TryLoad(ref m_SmoothnessFadeStart); + settings.TryLoad(ref m_RayLength); + settings.TryLoad(ref m_ClampValue); + settings.TryLoad(ref m_UpscaleRadius); + settings.TryLoad(ref m_FullResolution); + settings.TryLoad(ref m_Denoise); + settings.TryLoad(ref m_DenoiserRadius); + // SSR - else - settings.TryLoad(ref m_RayMaxIterations); + settings.TryLoad(ref m_RayMaxIterations); } public override void LoadSettingsFromQualityPreset(RenderPipelineSettings settings, int level) { // RTR - // Note: We need to handle the raytracing case like this (instead of not caring), because some SSR settings - // (ie Min Smoothness), are note quality settings, but they are for RTR. Because of that, by switching between - // custom blob / presets, normal settings in SSR mode will be modified, which we don't want. - if (HDRenderPipeline.pipelineSupportsRayTracing && m_RayTracing.overrideState.boolValue && - m_RayTracing.value.boolValue) - { - CopySetting(ref m_MinSmoothness, settings.lightingQualitySettings.RTRMinSmoothness[level]); - CopySetting(ref m_SmoothnessFadeStart, settings.lightingQualitySettings.RTRSmoothnessFadeStart[level]); - CopySetting(ref m_RayLength, settings.lightingQualitySettings.RTRRayLength[level]); - CopySetting(ref m_ClampValue, settings.lightingQualitySettings.RTRClampValue[level]); - CopySetting(ref m_UpscaleRadius, settings.lightingQualitySettings.RTRUpScaleRadius[level]); - CopySetting(ref m_FullResolution, settings.lightingQualitySettings.RTRFullResolution[level]); - CopySetting(ref m_Denoise, settings.lightingQualitySettings.RTRDenoise[level]); - CopySetting(ref m_DenoiserRadius, settings.lightingQualitySettings.RTRDenoiserRadius[level]); - } + CopySetting(ref m_MinSmoothness, settings.lightingQualitySettings.RTRMinSmoothness[level]); + CopySetting(ref m_SmoothnessFadeStart, settings.lightingQualitySettings.RTRSmoothnessFadeStart[level]); + CopySetting(ref m_RayLength, settings.lightingQualitySettings.RTRRayLength[level]); + CopySetting(ref m_ClampValue, settings.lightingQualitySettings.RTRClampValue[level]); + CopySetting(ref m_UpscaleRadius, settings.lightingQualitySettings.RTRUpScaleRadius[level]); + CopySetting(ref m_FullResolution, settings.lightingQualitySettings.RTRFullResolution[level]); + CopySetting(ref m_Denoise, settings.lightingQualitySettings.RTRDenoise[level]); + CopySetting(ref m_DenoiserRadius, settings.lightingQualitySettings.RTRDenoiserRadius[level]); + // SSR - else - CopySetting(ref m_RayMaxIterations, settings.lightingQualitySettings.SSRMaxRaySteps[level]); + CopySetting(ref m_RayMaxIterations, settings.lightingQualitySettings.SSRMaxRaySteps[level]); } } } diff --git a/com.unity.render-pipelines.high-definition/Editor/Lighting/Shadow/ContactShadowsEditor.cs b/com.unity.render-pipelines.high-definition/Editor/Lighting/Shadow/ContactShadowsEditor.cs index ed71cd4835d..7c8b178cd5f 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Lighting/Shadow/ContactShadowsEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Lighting/Shadow/ContactShadowsEditor.cs @@ -57,14 +57,13 @@ public override void OnInspectorGUI() PropertyField(m_Thickness, EditorGUIUtility.TrTextContent("Thickness", "Controls the thickness of the objects found along the ray, essentially thickening the contact shadows.")); base.OnInspectorGUI(); - } - } - public override void OnQualityGUI() - { - PropertyField(m_SampleCount, EditorGUIUtility.TrTextContent("Sample Count", "Controls the number of samples HDRP uses for ray casting.")); + using (new QualityScope(this)) + { + PropertyField(m_SampleCount, EditorGUIUtility.TrTextContent("Sample Count", "Controls the number of samples HDRP uses for ray casting.")); + } + } } - public override QualitySettingsBlob SaveCustomQualitySettingsAsObject(QualitySettingsBlob settings = null) { if (settings == null) diff --git a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/BloomEditor.cs b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/BloomEditor.cs index 540a683f296..175dca79415 100644 --- a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/BloomEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/BloomEditor.cs @@ -43,6 +43,8 @@ public override void OnEnable() public override void OnInspectorGUI() { + base.OnInspectorGUI(); + EditorGUILayout.LabelField("Bloom", EditorStyles.miniLabel); PropertyField(m_Threshold); PropertyField(m_Intensity); @@ -57,22 +59,16 @@ public override void OnInspectorGUI() { EditorGUILayout.LabelField("Advanced Tweaks", EditorStyles.miniLabel); - PropertyField(m_Anamorphic); - } - - base.OnInspectorGUI(); - } + using (new QualityScope(this)) + { + PropertyField(m_Resolution); + PropertyField(m_HighQualityPrefiltering); + PropertyField(m_HighQualityFiltering); + } - public override void OnQualityGUI() - { - if (isInAdvancedMode) - { - PropertyField(m_Resolution); - PropertyField(m_HighQualityPrefiltering); - PropertyField(m_HighQualityFiltering); + PropertyField(m_Anamorphic); } } - public override QualitySettingsBlob SaveCustomQualitySettingsAsObject(QualitySettingsBlob settings = null) { if (settings == null) diff --git a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/ChromaticAberrationEditor.cs b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/ChromaticAberrationEditor.cs index 09697526e40..d40bec9cabf 100644 --- a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/ChromaticAberrationEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/ChromaticAberrationEditor.cs @@ -28,13 +28,12 @@ public override void OnInspectorGUI() PropertyField(m_Intensity); base.OnInspectorGUI(); - } - public override void OnQualityGUI() - { - PropertyField(m_MaxSamples); + using (new QualityScope(this)) + { + PropertyField(m_MaxSamples); + } } - public override QualitySettingsBlob SaveCustomQualitySettingsAsObject(QualitySettingsBlob settings = null) { if (settings == null) diff --git a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs index c7097cd94c3..37721c3ef0b 100644 --- a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/DepthOfFieldEditor.cs @@ -87,7 +87,17 @@ public override void OnInspectorGUI() DrawFocusSettings(mode); } + EditorGUILayout.Space(); + base.OnInspectorGUI(); + + using (new HDEditorUtils.IndentScope()) + { + // Draw the quality controls + GUI.enabled = GUI.enabled && base.overrideState; + DrawQualitySettings(); + GUI.enabled = true; + } } void DrawFocusSettings(int mode) @@ -108,24 +118,27 @@ void DrawFocusSettings(int mode) } } - public override void OnQualityGUI() + void DrawQualitySettings() { - EditorGUILayout.LabelField("Near Blur", EditorStyles.miniLabel); - PropertyField(m_NearSampleCount, Styles.k_NearSampleCount); - PropertyField(m_NearMaxBlur, Styles.k_NearMaxBlur); - - EditorGUILayout.LabelField("Far Blur", EditorStyles.miniLabel); - PropertyField(m_FarSampleCount, Styles.k_FarSampleCount); - PropertyField(m_FarMaxBlur, Styles.k_FarMaxBlur); - - if (isInAdvancedMode) + using (new QualityScope(this)) { - EditorGUILayout.LabelField("Advanced Tweaks", EditorStyles.miniLabel); - PropertyField(m_Resolution); - PropertyField(m_HighQualityFiltering); - PropertyField(m_PhysicallyBased); - if (m_PhysicallyBased.value.boolValue == true) - EditorGUILayout.HelpBox(Styles.InfoBox, MessageType.Info); + EditorGUILayout.LabelField("Near Blur", EditorStyles.miniLabel); + PropertyField(m_NearSampleCount, Styles.k_NearSampleCount); + PropertyField(m_NearMaxBlur, Styles.k_NearMaxBlur); + + EditorGUILayout.LabelField("Far Blur", EditorStyles.miniLabel); + PropertyField(m_FarSampleCount, Styles.k_FarSampleCount); + PropertyField(m_FarMaxBlur, Styles.k_FarMaxBlur); + + if (isInAdvancedMode) + { + EditorGUILayout.LabelField("Advanced Tweaks", EditorStyles.miniLabel); + PropertyField(m_Resolution); + PropertyField(m_HighQualityFiltering); + PropertyField(m_PhysicallyBased); + if (m_PhysicallyBased.value.boolValue == true) + EditorGUILayout.HelpBox(Styles.InfoBox, MessageType.Info); + } } } diff --git a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/MotionBlurEditor.cs b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/MotionBlurEditor.cs index 158eb8ac0d7..5add879a6d9 100644 --- a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/MotionBlurEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/MotionBlurEditor.cs @@ -42,6 +42,13 @@ public override void OnInspectorGUI() PropertyField(m_Intensity); + base.OnInspectorGUI(); + + using (new QualityScope(this)) + { + PropertyField(m_SampleCount); + } + PropertyField(m_MaxVelocityInPixels); PropertyField(m_MinVelInPixels); @@ -51,15 +58,7 @@ public override void OnInspectorGUI() PropertyField(m_CameraRotClamp); PropertyField(m_CameraMotionBlur); } - - base.OnInspectorGUI(); } - - public override void OnQualityGUI() - { - PropertyField(m_SampleCount); - } - public override QualitySettingsBlob SaveCustomQualitySettingsAsObject(QualitySettingsBlob settings = null) { if (settings == null) diff --git a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/Raytracing/GlobalIlluminationEditor.cs b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/Raytracing/GlobalIlluminationEditor.cs index 8a5168f84aa..657253e62bc 100644 --- a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/Raytracing/GlobalIlluminationEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/Raytracing/GlobalIlluminationEditor.cs @@ -90,10 +90,9 @@ public void DenoiserGUI() } } - private bool m_RayTracingSettingsDisplayed; - public override void OnInspectorGUI() { + HDRenderPipelineAsset currentAsset = HDRenderPipeline.currentAsset; if (!currentAsset?.currentPlatformRenderPipelineSettings.supportSSGI ?? false) { @@ -111,14 +110,14 @@ public override void OnInspectorGUI() } // Flag to track if the ray tracing parameters were displayed - m_RayTracingSettingsDisplayed = false; + bool rayTracingSettingsDisplayed = false; EditorGUI.indentLevel++; if (HDRenderPipeline.pipelineSupportsRayTracing) { if (m_RayTracing.overrideState.boolValue && m_RayTracing.value.boolValue) { - m_RayTracingSettingsDisplayed = true; + rayTracingSettingsDisplayed = true; PropertyField(m_LayerMask); if (currentAsset.currentPlatformRenderPipelineSettings.supportedRayTracingMode == RenderPipelineSettings.SupportedRayTracingMode.Both) { @@ -128,10 +127,18 @@ public override void OnInspectorGUI() { case RayTracingMode.Performance: { - using (new EditorGUI.IndentLevelScope(-EditorGUI.indentLevel)) + base.OnInspectorGUI(); // Quality Setting + EditorGUI.indentLevel++; + using (new QualityScope(this)) { - base.OnInspectorGUI(); // Quality Setting + PropertyField(m_RayLength, k_RayLengthText); + PropertyField(m_RayLength); + PropertyField(m_ClampValue); + PropertyField(m_FullResolution); + PropertyField(m_UpscaleRadius); + DenoiserGUI(); } + EditorGUI.indentLevel--; } break; @@ -157,46 +164,40 @@ public override void OnInspectorGUI() } else { - using (new EditorGUI.IndentLevelScope(-EditorGUI.indentLevel)) + base.OnInspectorGUI(); // Quality Setting + EditorGUI.indentLevel++; + using (new QualityScope(this)) { - base.OnInspectorGUI(); // Quality Setting + PropertyField(m_RayLength, k_RayLengthText); + PropertyField(m_RayLength); + PropertyField(m_ClampValue); + PropertyField(m_FullResolution); + PropertyField(m_UpscaleRadius); + DenoiserGUI(); } + EditorGUI.indentLevel--; } } } - EditorGUI.indentLevel--; - - // If we did not display the ray tracing parameter, we display the ssgi ones - if (!m_RayTracingSettingsDisplayed) + // If we dit not display the ray tracing parameter, we display the ssgi ones + if (!rayTracingSettingsDisplayed) { + base.OnInspectorGUI(); // Quality Setting + EditorGUI.indentLevel++; + using (new QualityScope(this)) + { + PropertyField(m_FullResolutionSS, EditorGUIUtility.TrTextContent("Full Resolution", "Enables full resolution mode.")); + PropertyField(m_RaySteps); + PropertyField(m_FilterRadius); + } + EditorGUI.indentLevel--; PropertyField(m_DepthBufferThickness, k_DepthBufferThicknessText); - - // Quality Setting - base.OnInspectorGUI(); } - } - public override void OnQualityGUI() - { - if (m_RayTracingSettingsDisplayed) - { - PropertyField(m_RayLength, k_RayLengthText); - PropertyField(m_RayLength); - PropertyField(m_ClampValue); - PropertyField(m_FullResolution); - PropertyField(m_UpscaleRadius); - DenoiserGUI(); - } - else - { - PropertyField(m_FullResolutionSS, EditorGUIUtility.TrTextContent("Full Resolution", "Enables full resolution mode.")); - PropertyField(m_RaySteps); - PropertyField(m_FilterRadius); - } + EditorGUI.indentLevel--; } - public override QualitySettingsBlob SaveCustomQualitySettingsAsObject(QualitySettingsBlob settings = null) { if (settings == null) diff --git a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs index dcf083f7936..020bd523cbe 100644 --- a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.Runtime.CompilerServices; -using UnityEngine; using UnityEngine.Rendering; using UnityEngine.Rendering.HighDefinition; @@ -22,9 +21,9 @@ private struct QualitySetting public bool state; public object value; } - + Dictionary settings = new Dictionary(); - + public static bool IsEqual (QualitySettingsBlob left, QualitySettingsBlob right) { if (right == null && left == null) @@ -67,13 +66,13 @@ int Hash(SerializedDataParameter setting) return hash; } - // Save a setting to the quality blob. + // Save a setting to the quality blob. public void Save(SerializedDataParameter setting) where T : struct { QualitySetting s; s.state = setting.overrideState.boolValue; s.value = setting.value.GetInline(); - + int key = Hash(setting); if (settings.ContainsKey(key)) @@ -100,7 +99,7 @@ public void TryLoad(ref SerializedDataParameter setting) where T : struct } /// - /// Scoped quality setting change checker. + /// Scoped quality setting change checker. /// public struct QualityScope : IDisposable { @@ -157,13 +156,9 @@ public override void OnInspectorGUI() int prevQualityLevel = m_QualitySetting.value.intValue; EditorGUI.BeginChangeCheck(); - - // Provide some spacing between the quality properties and the preceding properties. - EditorGUILayout.Space(); - PropertyField(m_QualitySetting); - // When a quality preset changes, we want to detect and reflect the settings in the UI. PropertyFields mirror the contents of one memory location, so + // When a quality preset changes, we want to detect and reflect the settings in the UI. PropertyFields mirror the contents of one memory loccation, so // the idea is that we copy the presets to that location. This logic is optional, if volume components don't override the helper functions at the end, // they will continue to work, but the preset settings will not be reflected in the UI. if (EditorGUI.EndChangeCheck()) @@ -189,7 +184,7 @@ public override void OnInspectorGUI() var pipeline = (HDRenderPipeline)RenderPipelineManager.currentPipeline; if (pipeline != null) { - // If we switch from a custom quality level, then save these values so we can re-use them if the user switches back + // If we switch from a custom quality level, then save these values so we can re-use them if teh user switches back if (prevQualityLevel == k_CustomQuality) { QualitySettingsBlob history = null; @@ -203,7 +198,7 @@ public override void OnInspectorGUI() // Only keep track of custom settings for components that implement the new interface (and return not null) history = SaveCustomQualitySettingsAsObject(); if (history != null) - { + { s_CustomSettingsHistory.Add(serializedObject.targetObject, history); } @@ -213,31 +208,18 @@ public override void OnInspectorGUI() } } } - - // Draw the quality settings. Provide some indentation and check for any changes. - using (new HDEditorUtils.IndentScope()) - { - GUI.enabled = GUI.enabled && overrideState; - - using (new QualityScope(this)) - { - OnQualityGUI(); - } - - GUI.enabled = true; - } } protected bool useCustomValue => m_QualitySetting.value.intValue == k_CustomQuality; protected bool overrideState => m_QualitySetting.overrideState.boolValue; - + /// /// This utility can be used to copy a value into a volume component setting visible in the inspector. /// protected static void CopySetting(ref SerializedDataParameter setting, T value) where T : struct { setting.value.SetInline(value); - + // Force enable the override state, to indicate that these values are actually used. setting.overrideState.boolValue = true; } @@ -262,11 +244,6 @@ public virtual void LoadSettingsFromQualityPreset(RenderPipelineSettings setting /// public virtual void LoadSettingsFromObject(QualitySettingsBlob settings) { } - /// - /// This function should be overriden by a volume component to draw its quality settings. - /// - public virtual void OnQualityGUI() { } - } } From 127526b67e37987056e8215139161ed26d8a6d5e Mon Sep 17 00:00:00 2001 From: John Parsaie Date: Fri, 23 Oct 2020 12:09:28 -0400 Subject: [PATCH 38/39] Implement UX request to indent the checkbox for quality volumes --- .../Editor/Lighting/AmbientOcclusionEditor.cs | 49 +++--- .../HDScreenSpaceReflectionEditor.cs | 36 +++-- .../ChromaticAberrationEditor.cs | 2 +- .../Raytracing/GlobalIlluminationEditor.cs | 139 +++++++++--------- .../VolumeComponentWithQualityEditor.cs | 17 +-- 5 files changed, 123 insertions(+), 120 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/Lighting/AmbientOcclusionEditor.cs b/com.unity.render-pipelines.high-definition/Editor/Lighting/AmbientOcclusionEditor.cs index 02fc0850bcc..092031e5475 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Lighting/AmbientOcclusionEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Lighting/AmbientOcclusionEditor.cs @@ -86,21 +86,20 @@ public override void OnInspectorGUI() base.OnInspectorGUI(); // Quality Setting using (new QualityScope(this)) { - EditorGUI.indentLevel++; - PropertyField(m_RayLength, EditorGUIUtility.TrTextContent("Max Ray Length", "Controls the maximal length of ambient occlusion rays. The higher this value is, the more expensive ray traced ambient occlusion is.")); - PropertyField(m_SampleCount, EditorGUIUtility.TrTextContent("Sample Count", "Number of samples for ray traced ambient occlusion.")); - PropertyField(m_Denoise, EditorGUIUtility.TrTextContent("Denoise", "Enable denoising on the ray traced ambient occlusion.")); + using (new HDEditorUtils.IndentScope()) { - EditorGUI.indentLevel++; - PropertyField(m_DenoiserRadius, EditorGUIUtility.TrTextContent("Denoiser Radius", "Radius parameter for the denoising.")); - EditorGUI.indentLevel--; + PropertyField(m_RayLength, EditorGUIUtility.TrTextContent("Max Ray Length", "Controls the maximal length of ambient occlusion rays. The higher this value is, the more expensive ray traced ambient occlusion is.")); + PropertyField(m_SampleCount, EditorGUIUtility.TrTextContent("Sample Count", "Number of samples for ray traced ambient occlusion.")); + PropertyField(m_Denoise, EditorGUIUtility.TrTextContent("Denoise", "Enable denoising on the ray traced ambient occlusion.")); + { + using (new HDEditorUtils.IndentScope()) + PropertyField(m_DenoiserRadius, EditorGUIUtility.TrTextContent("Denoiser Radius", "Radius parameter for the denoising.")); + } } - EditorGUI.indentLevel--; } } else { - PropertyField(m_Radius, EditorGUIUtility.TrTextContent("Radius", "Sampling radius. Bigger the radius, wider AO will be achieved, risking to lose fine details and increasing cost of the effect due to increasing cache misses.")); base.OnInspectorGUI(); // Quality Setting @@ -112,27 +111,29 @@ public override void OnInspectorGUI() PropertyField(m_StepCount, EditorGUIUtility.TrTextContent("Step Count", "Number of steps to take along one signed direction during horizon search (this is the number of steps in positive and negative direction).")); PropertyField(m_TemporalAccumulation, EditorGUIUtility.TrTextContent("Temporal Accumulation", "Whether the results are accumulated over time or not. This can get better results cheaper, but it can lead to temporal artifacts. Requires Motion Vectors to be enabled.")); - EditorGUI.indentLevel++; - if(!m_TemporalAccumulation.value.boolValue) - { - PropertyField(m_DirectionCount, EditorGUIUtility.TrTextContent("Direction Count", "Number of directions searched for occlusion at each each pixel.")); - if (m_DirectionCount.value.intValue > 3) + using (new HDEditorUtils.IndentScope()) + { + if(!m_TemporalAccumulation.value.boolValue) { - EditorGUILayout.HelpBox("Performance will be seriously impacted by high direction count.", MessageType.Warning, wide: true); + PropertyField(m_DirectionCount, EditorGUIUtility.TrTextContent("Direction Count", "Number of directions searched for occlusion at each each pixel.")); + + if (m_DirectionCount.value.intValue > 3) + { + EditorGUILayout.HelpBox("Performance will be seriously impacted by high direction count.", MessageType.Warning, wide: true); + } + PropertyField(m_BlurSharpness, EditorGUIUtility.TrTextContent("Blur sharpness", "Modify the non-temporal blur to change how sharp features are preserved. Lower values blurrier/softer, higher values sharper but with risk of noise.")); } - PropertyField(m_BlurSharpness, EditorGUIUtility.TrTextContent("Blur sharpness", "Modify the non-temporal blur to change how sharp features are preserved. Lower values blurrier/softer, higher values sharper but with risk of noise.")); - } - else - { - PropertyField(m_SpatialBilateralAggressiveness, EditorGUIUtility.TrTextContent("Bilateral Aggressiveness", "Higher this value, the less lenient with depth differences the spatial filter is. Increase if for example noticing white halos where AO should be.")); - PropertyField(m_GhostingAdjustement, EditorGUIUtility.TrTextContent("Ghosting reduction", "Moving this factor closer to 0 will increase the amount of accepted samples during temporal accumulation, increasing the ghosting, but reducing the temporal noise.")); - if (isInAdvancedMode && !m_FullResolution.value.boolValue) + else { - PropertyField(m_BilateralUpsample, EditorGUIUtility.TrTextContent("Bilateral Upsample", "This upsample method preserves sharp edges better, however can result in visible aliasing and it is slightly more expensive.")); + PropertyField(m_SpatialBilateralAggressiveness, EditorGUIUtility.TrTextContent("Bilateral Aggressiveness", "Higher this value, the less lenient with depth differences the spatial filter is. Increase if for example noticing white halos where AO should be.")); + PropertyField(m_GhostingAdjustement, EditorGUIUtility.TrTextContent("Ghosting reduction", "Moving this factor closer to 0 will increase the amount of accepted samples during temporal accumulation, increasing the ghosting, but reducing the temporal noise.")); + if (isInAdvancedMode && !m_FullResolution.value.boolValue) + { + PropertyField(m_BilateralUpsample, EditorGUIUtility.TrTextContent("Bilateral Upsample", "This upsample method preserves sharp edges better, however can result in visible aliasing and it is slightly more expensive.")); + } } } - EditorGUI.indentLevel--; } } } diff --git a/com.unity.render-pipelines.high-definition/Editor/Lighting/Reflection/HDScreenSpaceReflectionEditor.cs b/com.unity.render-pipelines.high-definition/Editor/Lighting/Reflection/HDScreenSpaceReflectionEditor.cs index 37d7d8a8935..d0426614eff 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Lighting/Reflection/HDScreenSpaceReflectionEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Lighting/Reflection/HDScreenSpaceReflectionEditor.cs @@ -100,10 +100,9 @@ void RayTracingQualityModeGUI() PropertyField(m_SampleCount, k_SampleCountText); PropertyField(m_BounceCount, k_BounceCountText); PropertyField(m_Denoise, k_DenoiseText); + using (new HDEditorUtils.IndentScope()) { - EditorGUI.indentLevel++; PropertyField(m_DenoiserRadius, k_DenoiseRadiusText); - EditorGUI.indentLevel--; } } @@ -112,9 +111,9 @@ void RayTracingPerformanceModeGUI() { base.OnInspectorGUI(); + using (new HDEditorUtils.IndentScope()) using (new QualityScope(this)) { - EditorGUI.indentLevel++; PropertyField(m_MinSmoothness, k_MinimumSmoothnessText); PropertyField(m_SmoothnessFadeStart, k_SmoothnessFadeStartText); m_SmoothnessFadeStart.value.floatValue = Mathf.Max(m_MinSmoothness.value.floatValue, m_SmoothnessFadeStart.value.floatValue); @@ -123,12 +122,10 @@ void RayTracingPerformanceModeGUI() PropertyField(m_UpscaleRadius, k_UpscaleRadiusText); PropertyField(m_FullResolution, k_FullResolutionText); PropertyField(m_Denoise, k_DenoiseText); + using (new HDEditorUtils.IndentScope()) { - EditorGUI.indentLevel++; PropertyField(m_DenoiserRadius, k_DenoiseRadiusText); - EditorGUI.indentLevel--; } - EditorGUI.indentLevel--; } } @@ -141,21 +138,23 @@ void RayTracedReflectionGUI() if (currentAsset.currentPlatformRenderPipelineSettings.supportedRayTracingMode == RenderPipelineSettings.SupportedRayTracingMode.Both) { PropertyField(m_Mode, k_ModeText); - EditorGUI.indentLevel++; - switch (m_Mode.value.GetEnumValue()) + + using (new HDEditorUtils.IndentScope()) { - case RayTracingMode.Performance: - { - RayTracingPerformanceModeGUI(); - } - break; - case RayTracingMode.Quality: + switch (m_Mode.value.GetEnumValue()) { - RayTracingQualityModeGUI(); + case RayTracingMode.Performance: + { + RayTracingPerformanceModeGUI(); + } + break; + case RayTracingMode.Quality: + { + RayTracingQualityModeGUI(); + } + break; } - break; } - EditorGUI.indentLevel--; } else if (currentAsset.currentPlatformRenderPipelineSettings.supportedRayTracingMode == RenderPipelineSettings.SupportedRayTracingMode.Quality) { @@ -204,12 +203,11 @@ public override void OnInspectorGUI() base.OnInspectorGUI(); + using (new HDEditorUtils.IndentScope()) using (new QualityScope(this)) { - EditorGUI.indentLevel++; PropertyField(m_RayMaxIterations, k_RayMaxIterationsText); m_RayMaxIterations.value.intValue = Mathf.Max(0, m_RayMaxIterations.value.intValue); - EditorGUI.indentLevel--; } } } diff --git a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/ChromaticAberrationEditor.cs b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/ChromaticAberrationEditor.cs index d40bec9cabf..82d10e6bfc1 100644 --- a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/ChromaticAberrationEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/ChromaticAberrationEditor.cs @@ -14,7 +14,7 @@ sealed class ChromaticAberrationEditor : VolumeComponentWithQualityEditor public override void OnEnable() { var o = new PropertyFetcher(serializedObject); - + m_SpectralLUT = Unpack(o.Find(x => x.spectralLut)); m_Intensity = Unpack(o.Find(x => x.intensity)); m_MaxSamples = Unpack(o.Find("m_MaxSamples")); diff --git a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/Raytracing/GlobalIlluminationEditor.cs b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/Raytracing/GlobalIlluminationEditor.cs index 657253e62bc..f49e3b8484e 100644 --- a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/Raytracing/GlobalIlluminationEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/Raytracing/GlobalIlluminationEditor.cs @@ -81,12 +81,12 @@ public override void OnEnable() public void DenoiserGUI() { PropertyField(m_Denoise); + + using (new HDEditorUtils.IndentScope()) { - EditorGUI.indentLevel++; PropertyField(m_HalfResolutionDenoiser); PropertyField(m_DenoiserRadius); PropertyField(m_SecondDenoiserPass); - EditorGUI.indentLevel--; } } @@ -112,91 +112,96 @@ public override void OnInspectorGUI() // Flag to track if the ray tracing parameters were displayed bool rayTracingSettingsDisplayed = false; - EditorGUI.indentLevel++; - if (HDRenderPipeline.pipelineSupportsRayTracing) + using (new HDEditorUtils.IndentScope()) { - if (m_RayTracing.overrideState.boolValue && m_RayTracing.value.boolValue) + if (HDRenderPipeline.pipelineSupportsRayTracing) { - rayTracingSettingsDisplayed = true; - PropertyField(m_LayerMask); - if (currentAsset.currentPlatformRenderPipelineSettings.supportedRayTracingMode == RenderPipelineSettings.SupportedRayTracingMode.Both) + if (m_RayTracing.overrideState.boolValue && m_RayTracing.value.boolValue) { - PropertyField(m_Mode); - EditorGUI.indentLevel++; - switch (m_Mode.value.GetEnumValue()) + rayTracingSettingsDisplayed = true; + PropertyField(m_LayerMask); + if (currentAsset.currentPlatformRenderPipelineSettings.supportedRayTracingMode == + RenderPipelineSettings.SupportedRayTracingMode.Both) { - case RayTracingMode.Performance: + PropertyField(m_Mode); + + using (new HDEditorUtils.IndentScope()) { - base.OnInspectorGUI(); // Quality Setting - EditorGUI.indentLevel++; - using (new QualityScope(this)) + switch (m_Mode.value.GetEnumValue()) { - PropertyField(m_RayLength, k_RayLengthText); - PropertyField(m_RayLength); - PropertyField(m_ClampValue); - PropertyField(m_FullResolution); - PropertyField(m_UpscaleRadius); - DenoiserGUI(); + case RayTracingMode.Performance: + { + base.OnInspectorGUI(); // Quality Setting + + using (new HDEditorUtils.IndentScope()) + using (new QualityScope(this)) + { + PropertyField(m_RayLength, k_RayLengthText); + PropertyField(m_RayLength); + PropertyField(m_ClampValue); + PropertyField(m_FullResolution); + PropertyField(m_UpscaleRadius); + DenoiserGUI(); + } + } + break; + case RayTracingMode.Quality: + { + PropertyField(m_RayLength, k_RayLengthText); + PropertyField(m_ClampValue); + PropertyField(m_SampleCount); + PropertyField(m_BounceCount); + DenoiserGUI(); + } + break; } - EditorGUI.indentLevel--; - } - break; - case RayTracingMode.Quality: - { - PropertyField(m_RayLength, k_RayLengthText); - PropertyField(m_ClampValue); - PropertyField(m_SampleCount); - PropertyField(m_BounceCount); - DenoiserGUI(); - } - break; } - EditorGUI.indentLevel--; - } - else if (currentAsset.currentPlatformRenderPipelineSettings.supportedRayTracingMode == RenderPipelineSettings.SupportedRayTracingMode.Quality) - { - PropertyField(m_RayLength, k_RayLengthText); - PropertyField(m_ClampValue); - PropertyField(m_SampleCount); - PropertyField(m_BounceCount); - DenoiserGUI(); - } - else - { - base.OnInspectorGUI(); // Quality Setting - EditorGUI.indentLevel++; - using (new QualityScope(this)) + else if (currentAsset.currentPlatformRenderPipelineSettings.supportedRayTracingMode == + RenderPipelineSettings.SupportedRayTracingMode.Quality) { PropertyField(m_RayLength, k_RayLengthText); - PropertyField(m_RayLength); PropertyField(m_ClampValue); - PropertyField(m_FullResolution); - PropertyField(m_UpscaleRadius); + PropertyField(m_SampleCount); + PropertyField(m_BounceCount); DenoiserGUI(); } - EditorGUI.indentLevel--; - } + else + { + base.OnInspectorGUI(); // Quality Setting + EditorGUI.indentLevel++; + using (new QualityScope(this)) + { + PropertyField(m_RayLength, k_RayLengthText); + PropertyField(m_RayLength); + PropertyField(m_ClampValue); + PropertyField(m_FullResolution); + PropertyField(m_UpscaleRadius); + DenoiserGUI(); + } + + EditorGUI.indentLevel--; + } + } } - } - // If we dit not display the ray tracing parameter, we display the ssgi ones - if (!rayTracingSettingsDisplayed) - { - base.OnInspectorGUI(); // Quality Setting - EditorGUI.indentLevel++; - using (new QualityScope(this)) + // If we dit not display the ray tracing parameter, we display the ssgi ones + if (!rayTracingSettingsDisplayed) { - PropertyField(m_FullResolutionSS, EditorGUIUtility.TrTextContent("Full Resolution", "Enables full resolution mode.")); - PropertyField(m_RaySteps); - PropertyField(m_FilterRadius); + base.OnInspectorGUI(); // Quality Setting + + using (new HDEditorUtils.IndentScope()) + using (new QualityScope(this)) + { + PropertyField(m_FullResolutionSS,EditorGUIUtility.TrTextContent("Full Resolution", "Enables full resolution mode.")); + PropertyField(m_RaySteps); + PropertyField(m_FilterRadius); + } + + PropertyField(m_DepthBufferThickness, k_DepthBufferThicknessText); } - EditorGUI.indentLevel--; - PropertyField(m_DepthBufferThickness, k_DepthBufferThicknessText); } - - EditorGUI.indentLevel--; } public override QualitySettingsBlob SaveCustomQualitySettingsAsObject(QualitySettingsBlob settings = null) { diff --git a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs index 020bd523cbe..0c6eafaa9ed 100644 --- a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/VolumeComponentWithQualityEditor.cs @@ -21,9 +21,9 @@ private struct QualitySetting public bool state; public object value; } - + Dictionary settings = new Dictionary(); - + public static bool IsEqual (QualitySettingsBlob left, QualitySettingsBlob right) { if (right == null && left == null) @@ -66,13 +66,13 @@ int Hash(SerializedDataParameter setting) return hash; } - // Save a setting to the quality blob. + // Save a setting to the quality blob. public void Save(SerializedDataParameter setting) where T : struct { QualitySetting s; s.state = setting.overrideState.boolValue; s.value = setting.value.GetInline(); - + int key = Hash(setting); if (settings.ContainsKey(key)) @@ -99,7 +99,7 @@ public void TryLoad(ref SerializedDataParameter setting) where T : struct } /// - /// Scoped quality setting change checker. + /// Scoped quality setting change checker. /// public struct QualityScope : IDisposable { @@ -198,7 +198,7 @@ public override void OnInspectorGUI() // Only keep track of custom settings for components that implement the new interface (and return not null) history = SaveCustomQualitySettingsAsObject(); if (history != null) - { + { s_CustomSettingsHistory.Add(serializedObject.targetObject, history); } @@ -212,14 +212,14 @@ public override void OnInspectorGUI() protected bool useCustomValue => m_QualitySetting.value.intValue == k_CustomQuality; protected bool overrideState => m_QualitySetting.overrideState.boolValue; - + /// /// This utility can be used to copy a value into a volume component setting visible in the inspector. /// protected static void CopySetting(ref SerializedDataParameter setting, T value) where T : struct { setting.value.SetInline(value); - + // Force enable the override state, to indicate that these values are actually used. setting.overrideState.boolValue = true; } @@ -243,7 +243,6 @@ public virtual void LoadSettingsFromQualityPreset(RenderPipelineSettings setting /// This function should be overriden by a volume component to load a custom preset setting from an opaque binary blob (as returned from SaveCustomQualitySettingsAsObject) /// public virtual void LoadSettingsFromObject(QualitySettingsBlob settings) { } - } } From ffa1b4f4509c2d339821c8e92bdc7cb5b5fa2e1d Mon Sep 17 00:00:00 2001 From: John Parsaie Date: Fri, 23 Oct 2020 12:15:43 -0400 Subject: [PATCH 39/39] Decouple quality setting loading between RTR and SSR (some setting are shared, ie min smoothness) --- .../HDScreenSpaceReflectionEditor.cs | 72 +++++++++++-------- 1 file changed, 42 insertions(+), 30 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/Lighting/Reflection/HDScreenSpaceReflectionEditor.cs b/com.unity.render-pipelines.high-definition/Editor/Lighting/Reflection/HDScreenSpaceReflectionEditor.cs index d0426614eff..78cfaa72336 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Lighting/Reflection/HDScreenSpaceReflectionEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Lighting/Reflection/HDScreenSpaceReflectionEditor.cs @@ -217,17 +217,21 @@ public override QualitySettingsBlob SaveCustomQualitySettingsAsObject(QualitySet settings = new QualitySettingsBlob(); // RTR - settings.Save(m_MinSmoothness); - settings.Save(m_SmoothnessFadeStart); - settings.Save(m_RayLength); - settings.Save(m_ClampValue); - settings.Save(m_UpscaleRadius); - settings.Save(m_FullResolution); - settings.Save(m_Denoise); - settings.Save(m_DenoiserRadius); - + if (HDRenderPipeline.pipelineSupportsRayTracing && m_RayTracing.overrideState.boolValue && + m_RayTracing.value.boolValue) + { + settings.Save(m_MinSmoothness); + settings.Save(m_SmoothnessFadeStart); + settings.Save(m_RayLength); + settings.Save(m_ClampValue); + settings.Save(m_UpscaleRadius); + settings.Save(m_FullResolution); + settings.Save(m_Denoise); + settings.Save(m_DenoiserRadius); + } // SSR - settings.Save(m_RayMaxIterations); + else + settings.Save(m_RayMaxIterations); return settings; } @@ -235,33 +239,41 @@ public override QualitySettingsBlob SaveCustomQualitySettingsAsObject(QualitySet public override void LoadSettingsFromObject(QualitySettingsBlob settings) { // RTR - settings.TryLoad(ref m_MinSmoothness); - settings.TryLoad(ref m_SmoothnessFadeStart); - settings.TryLoad(ref m_RayLength); - settings.TryLoad(ref m_ClampValue); - settings.TryLoad(ref m_UpscaleRadius); - settings.TryLoad(ref m_FullResolution); - settings.TryLoad(ref m_Denoise); - settings.TryLoad(ref m_DenoiserRadius); - + if (HDRenderPipeline.pipelineSupportsRayTracing && m_RayTracing.overrideState.boolValue && + m_RayTracing.value.boolValue) + { + settings.TryLoad(ref m_MinSmoothness); + settings.TryLoad(ref m_SmoothnessFadeStart); + settings.TryLoad(ref m_RayLength); + settings.TryLoad(ref m_ClampValue); + settings.TryLoad(ref m_UpscaleRadius); + settings.TryLoad(ref m_FullResolution); + settings.TryLoad(ref m_Denoise); + settings.TryLoad(ref m_DenoiserRadius); + } // SSR - settings.TryLoad(ref m_RayMaxIterations); + else + settings.TryLoad(ref m_RayMaxIterations); } public override void LoadSettingsFromQualityPreset(RenderPipelineSettings settings, int level) { // RTR - CopySetting(ref m_MinSmoothness, settings.lightingQualitySettings.RTRMinSmoothness[level]); - CopySetting(ref m_SmoothnessFadeStart, settings.lightingQualitySettings.RTRSmoothnessFadeStart[level]); - CopySetting(ref m_RayLength, settings.lightingQualitySettings.RTRRayLength[level]); - CopySetting(ref m_ClampValue, settings.lightingQualitySettings.RTRClampValue[level]); - CopySetting(ref m_UpscaleRadius, settings.lightingQualitySettings.RTRUpScaleRadius[level]); - CopySetting(ref m_FullResolution, settings.lightingQualitySettings.RTRFullResolution[level]); - CopySetting(ref m_Denoise, settings.lightingQualitySettings.RTRDenoise[level]); - CopySetting(ref m_DenoiserRadius, settings.lightingQualitySettings.RTRDenoiserRadius[level]); - + if (HDRenderPipeline.pipelineSupportsRayTracing && m_RayTracing.overrideState.boolValue && + m_RayTracing.value.boolValue) + { + CopySetting(ref m_MinSmoothness, settings.lightingQualitySettings.RTRMinSmoothness[level]); + CopySetting(ref m_SmoothnessFadeStart, settings.lightingQualitySettings.RTRSmoothnessFadeStart[level]); + CopySetting(ref m_RayLength, settings.lightingQualitySettings.RTRRayLength[level]); + CopySetting(ref m_ClampValue, settings.lightingQualitySettings.RTRClampValue[level]); + CopySetting(ref m_UpscaleRadius, settings.lightingQualitySettings.RTRUpScaleRadius[level]); + CopySetting(ref m_FullResolution, settings.lightingQualitySettings.RTRFullResolution[level]); + CopySetting(ref m_Denoise, settings.lightingQualitySettings.RTRDenoise[level]); + CopySetting(ref m_DenoiserRadius, settings.lightingQualitySettings.RTRDenoiserRadius[level]); + } // SSR - CopySetting(ref m_RayMaxIterations, settings.lightingQualitySettings.SSRMaxRaySteps[level]); + else + CopySetting(ref m_RayMaxIterations, settings.lightingQualitySettings.SSRMaxRaySteps[level]); } } }