From 1ba5abb9598f355d0d50092015b9a67edae9e31e Mon Sep 17 00:00:00 2001 From: Pavlos Mavridis Date: Wed, 10 Jun 2020 00:57:56 +0200 Subject: [PATCH 01/12] 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/12] 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/12] 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/12] 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/12] 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/12] 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/12] 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/12] 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/12] 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/12] 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/12] 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/12] 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();