using System;
namespace UnityEngine.Rendering.HighDefinition
{
///
/// Scalable Quality Level Parameter.
///
[Serializable]
public sealed class ScalableSettingLevelParameter : IntParameter
{
/// Number of quality levels.
public const int LevelCount = 3;
/// Quality levels.
public enum Level
{
/// Low Quality.
Low,
/// Medium Quality.
Medium,
/// High Quality.
High
}
///
/// Scalable Quality Level Parameter constructor.
///
/// Initial quality level.
/// Use local override.
/// Override state.
public ScalableSettingLevelParameter(int level, bool useOverride, bool overrideState = false)
: base(useOverride ? LevelCount : (int)level, overrideState)
{
}
internal static int GetScalableSettingLevelParameterValue(int level, bool useOverride)
{
return useOverride ? LevelCount : (int)level;
}
///
/// Level and Override.
///
public (int level, bool useOverride) levelAndOverride
{
get => value == LevelCount ? ((int)Level.Low, true) : (value, false);
set
{
var(level, useOverride) = value;
this.value = GetScalableSettingLevelParameterValue(level, useOverride);
}
}
}
///
/// Post Processing Quality Settings.
///
[Serializable]
public sealed class GlobalPostProcessingQualitySettings
{
static int s_QualitySettingCount = ScalableSettingLevelParameter.LevelCount;
internal GlobalPostProcessingQualitySettings()
{
/* Depth of Field */
NearBlurSampleCount[(int)ScalableSettingLevelParameter.Level.Low] = 3;
NearBlurSampleCount[(int)ScalableSettingLevelParameter.Level.Medium] = 5;
NearBlurSampleCount[(int)ScalableSettingLevelParameter.Level.High] = 8;
NearBlurMaxRadius[(int)ScalableSettingLevelParameter.Level.Low] = 2.0f;
NearBlurMaxRadius[(int)ScalableSettingLevelParameter.Level.Medium] = 4.0f;
NearBlurMaxRadius[(int)ScalableSettingLevelParameter.Level.High] = 7.0f;
FarBlurSampleCount[(int)ScalableSettingLevelParameter.Level.Low] = 4;
FarBlurSampleCount[(int)ScalableSettingLevelParameter.Level.Medium] = 7;
FarBlurSampleCount[(int)ScalableSettingLevelParameter.Level.High] = 14;
FarBlurMaxRadius[(int)ScalableSettingLevelParameter.Level.Low] = 5.0f;
FarBlurMaxRadius[(int)ScalableSettingLevelParameter.Level.Medium] = 8.0f;
FarBlurMaxRadius[(int)ScalableSettingLevelParameter.Level.High] = 13.0f;
DoFResolution[(int)ScalableSettingLevelParameter.Level.Low] = DepthOfFieldResolution.Quarter;
DoFResolution[(int)ScalableSettingLevelParameter.Level.Medium] = DepthOfFieldResolution.Half;
DoFResolution[(int)ScalableSettingLevelParameter.Level.High] = DepthOfFieldResolution.Full;
DoFHighQualityFiltering[(int)ScalableSettingLevelParameter.Level.Low] = false;
DoFHighQualityFiltering[(int)ScalableSettingLevelParameter.Level.Medium] = true;
DoFHighQualityFiltering[(int)ScalableSettingLevelParameter.Level.High] = true;
/* Motion Blur */
MotionBlurSampleCount[(int)ScalableSettingLevelParameter.Level.Low] = 4;
MotionBlurSampleCount[(int)ScalableSettingLevelParameter.Level.Medium] = 8;
MotionBlurSampleCount[(int)ScalableSettingLevelParameter.Level.High] = 12;
/* Bloom */
BloomRes[(int)ScalableSettingLevelParameter.Level.Low] = BloomResolution.Quarter;
BloomRes[(int)ScalableSettingLevelParameter.Level.Medium] = BloomResolution.Half;
BloomRes[(int)ScalableSettingLevelParameter.Level.High] = BloomResolution.Half;
BloomHighQualityFiltering[(int)ScalableSettingLevelParameter.Level.Low] = false;
BloomHighQualityFiltering[(int)ScalableSettingLevelParameter.Level.Medium] = true;
BloomHighQualityFiltering[(int)ScalableSettingLevelParameter.Level.High] = true;
BloomHighQualityPrefiltering[(int)ScalableSettingLevelParameter.Level.Low] = false;
BloomHighQualityPrefiltering[(int)ScalableSettingLevelParameter.Level.Medium] = false;
BloomHighQualityPrefiltering[(int)ScalableSettingLevelParameter.Level.High] = true;
/* Chromatic Aberration */
ChromaticAberrationMaxSamples[(int)ScalableSettingLevelParameter.Level.Low] = 3;
ChromaticAberrationMaxSamples[(int)ScalableSettingLevelParameter.Level.Medium] = 6;
ChromaticAberrationMaxSamples[(int)ScalableSettingLevelParameter.Level.High] = 12;
}
internal static GlobalPostProcessingQualitySettings NewDefault() => new GlobalPostProcessingQualitySettings();
/* Depth of field */
/// Depth of field near blur sample count for each quality level.
public int[] NearBlurSampleCount = new int[s_QualitySettingCount];
/// Depth of field near blur maximum radius for each quality level.
public float[] NearBlurMaxRadius = new float[s_QualitySettingCount];
/// Depth of field far blur sample count for each quality level.
public int[] FarBlurSampleCount = new int[s_QualitySettingCount];
/// Depth of field far blur maximum radius for each quality level.
public float[] FarBlurMaxRadius = new float[s_QualitySettingCount];
/// Depth of field resolution for each quality level.
public DepthOfFieldResolution[] DoFResolution = new DepthOfFieldResolution[s_QualitySettingCount];
/// Use Depth of field high quality filtering for each quality level.
public bool[] DoFHighQualityFiltering = new bool[s_QualitySettingCount];
/// Use Depth of field high physically based setting for each quality level.
public bool[] DoFPhysicallyBased = new bool[s_QualitySettingCount];
/* Motion Blur */
/// Motion Blur sample count for each quality level.
public int[] MotionBlurSampleCount = new int[s_QualitySettingCount];
/* Bloom */
/// Bloom resolution for each quality level.
public BloomResolution[] BloomRes = new BloomResolution[s_QualitySettingCount];
/// Bloom high quality filtering for each quality level.
public bool[] BloomHighQualityFiltering = new bool[s_QualitySettingCount];
/// Bloom high quality prefiltering for each quality level.
public bool[] BloomHighQualityPrefiltering = new bool[s_QualitySettingCount];
/* Chromatic Aberration */
/// Chromatic aberration maximum sample count for each quality level.
public int[] ChromaticAberrationMaxSamples = new int[s_QualitySettingCount];
}
}