using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;
namespace NiloToon.NiloToonURP
{
[System.Serializable, VolumeComponentMenu("NiloToon/Bloom (NiloToon)")]
//[SupportedOnRenderPipeline(typeof(UniversalRenderPipelineAsset))]
[HelpURL("https://docs.google.com/document/d/1iEh1E5xLXnXuICM0ElV3F3x_J2LND9Du2SSKzcIuPXw/edit?pli=1&tab=t.0#heading=h.bevtkrac5r9p")]
public class NiloToonBloomVolume : VolumeComponent, IPostProcessComponent
{
[Header("======== Same as URP's Bloom ======================================================================")]
[Header("Bloom")]
[Tooltip("Filters out pixels under this level of brightness. Value is in gamma-space.")]
public MinFloatParameter threshold = new MinFloatParameter(0.9f, 0f);
[Tooltip("Strength of the bloom filter.")]
public MinFloatParameter intensity = new MinFloatParameter(0f, 0f);
[Tooltip("Changes the extent of veiling effects.")]
public ClampedFloatParameter scatter = new ClampedFloatParameter(0.7f, 0f, 1f);
[Tooltip("Global tint of the bloom filter.")]
public ColorParameter tint = new ColorParameter(Color.white, false, false, true);
[Tooltip("Clamps pixels to control the bloom amount.")]
public MinFloatParameter clamp = new MinFloatParameter(65472f, 0f);
[Tooltip("Use bicubic sampling instead of bilinear sampling for the upsampling passes. This is slightly more expensive but helps getting smoother visuals.")]
public BoolParameter highQualityFiltering = new BoolParameter(false);
#if UNITY_2022_2_OR_NEWER
///
/// Controls the starting resolution that this effect begins processing.
///
[Tooltip("The starting resolution that this effect begins processing."), AdditionalProperty]
public DownscaleParameter downscale = new DownscaleParameter(BloomDownscaleMode.Half);
#endif
#if !UNITY_2022_2_OR_NEWER
[Tooltip("The number of final iterations to skip in the effect processing sequence.")]
public ClampedIntParameter skipIterations = new ClampedIntParameter(1, 0, 16);
#endif
#if UNITY_2022_2_OR_NEWER
///
/// Controls the maximum number of iterations in the effect processing sequence.
///
[Tooltip("The maximum number of iterations in the effect processing sequence."), AdditionalProperty]
public ClampedIntParameter maxIterations = new ClampedIntParameter(8, 2, 8); // default 8 instead of 6 to keep the same result as Unity2021.3(URP12's original design)
#endif
[Header("Lens Dirt")]
[Tooltip("Dirtiness texture to add smudges or dust to the bloom effect.")]
public TextureParameter dirtTexture = new TextureParameter(null);
[Tooltip("Amount of dirtiness.")]
public MinFloatParameter dirtIntensity = new MinFloatParameter(0f, 0f);
[Header("======== NiloToon added ==========================================================================")]
[Header("Char Brightness")]
[OverrideDisplayName("Mat BaseMap")]
public MinFloatParameter characterBaseColorBrightness = new MinFloatParameter(1, 0);
[OverrideDisplayName("Mat Result")]
public MinFloatParameter characterBrightness = new MinFloatParameter(1, 0);
[OverrideDisplayName("Post-Bloom Result")]
public MinFloatParameter characterPreTonemapBrightness = new MinFloatParameter(1, 0);
[Header("Char Area Bloom Emit")]
[Tooltip(
"The pre-blur bloom intensity(character area intensity/color that goes into the input of bloom blur-chain), the purpose is very similar to 'Threshold' but this is much more intuitive to use.\n" +
"\n" +
"- Set to a value < 1 = Make NiloToon character emit less bloom.\n" +
"- Set to a value > 1 = Make NiloToon character emit more bloom.\n" +
"\n" +
"* Bloom from the environment will still bleed into character area.")]
[OverrideDisplayName("Intensity")]
public MinFloatParameter characterAreaBloomEmitMultiplier = new MinFloatParameter(1, 0);
[Header("Char Area Bloom Style Override")]
[Tooltip(
"Same as the 'Threshold' in the above URP section, but this is affecting character area only.\n" +
"(When enabled, character area filters out pixels under this overridden level of brightness. Value is in gamma-space.)\n" +
"\n" +
"- Override to a value higher than the 'Threshold' in the above URP section = makes NiloToon character harder to emit bloom.\n" +
"- Override to a value lower than the 'Threshold' in the above URP section = makes NiloToon character easier to emit bloom.")]
[OverrideDisplayName("Threshold")]
public MinFloatParameter characterAreaOverridedThreshold = new MinFloatParameter(0.9f, 0f); // same default value as threshold
[Tooltip(
"Same as the 'Intensity' in the above URP section, but it is affecting character area only.\n" +
"\n" +
"This is the final bloom display intensity on character area.\n" +
"Reduce this when you need to reduce/remove the additive bloom effect on character pixels in the final image.\n" +
"* When set to 0, Character area will not display any bloom, even bloom emitted from the environment that bleeded into character area will not be displayed also.")]
[OverrideDisplayName("Intensity")]
public MinFloatParameter characterAreaOverridedIntensity = new MinFloatParameter(0,0); // same default value as intensity
[Header("Bloom HSV")]
[OverrideDisplayName("(H) Hue Offset")]
public ClampedFloatParameter HueOffset = new ClampedFloatParameter(0, -1, 1);
[OverrideDisplayName("(S) Saturation Boost")]
public ClampedFloatParameter SaturationBoost = new ClampedFloatParameter(0, 0, 1);
[OverrideDisplayName("(V) Value Multiply")]
public ClampedFloatParameter ValueMultiply = new ClampedFloatParameter(1, 0, 1);
[OverrideDisplayName("Apply to Char only?")]
public ClampedFloatParameter ApplyHSVToCharAreaOnly = new ClampedFloatParameter(0, 0, 1);
[Header("Resolution-Independent Bloom")]
[Tooltip(
"Enable to use a constant bloom resolution instead of URP's dynamic size bloom resolution\n\n" +
"A constant bloom resolution will make the bloom result(e.g. bloom blur size) not affected by Game resolution/RenderScale.\n\n" +
"We add this setting because URP's Bloom is always affected by Game resolution/RenderScale, which is nearly unusable when you need a very consistent and stable bloom blur size(a.k.a scatter size) to produce a specific art style bloom(e.g. a fixed screen space blur size(scatter) anime soft diffusion bloom).")]
[OverrideDisplayName("Lock resolution")]
public ClampedIntParameter renderTextureOverridedToFixedHeight = new ClampedIntParameter(1080, 135, 2160);
public bool IsActive() => intensity.value > 0f || (characterAreaOverridedIntensity.overrideState && characterAreaOverridedIntensity.value > 0f);
public bool IsTileCompatible() => false;
}
}