Shader "Hidden/HeadlessHazard/CRT"
{
    Properties
    {
        _Intensity ("Intensity", Range(0,1)) = 0.65
        _ScanlineDensity ("Scanline Density", Range(0,2)) = 1.2
        _ScanlineStrength ("Scanline Strength", Range(0,1)) = 0.18
        _Curvature ("Curvature", Range(0,0.2)) = 0.04
        _VignetteStrength ("Vignette Strength", Range(0,1)) = 0.28
        _ChromaticAberration ("Chromatic Aberration", Range(0,0.05)) = 0.004
        _NoiseStrength ("Noise Strength", Range(0,0.2)) = 0.03
        _FlickerStrength ("Flicker Strength", Range(0,0.1)) = 0.015
    }

    SubShader
    {
        Tags { "RenderPipeline" = "UniversalPipeline" }

        Pass
        {
            Name "CRT"
            ZWrite Off
            ZTest Always
            Cull Off
            Blend One Zero

            HLSLPROGRAM
            #pragma vertex Vert
            #pragma fragment Frag
            #pragma target 3.5

            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
            #include "Packages/com.unity.render-pipelines.core/Runtime/Utilities/Blit.hlsl"

            float _Intensity;
            float _ScanlineDensity;
            float _ScanlineStrength;
            float _Curvature;
            float _VignetteStrength;
            float _ChromaticAberration;
            float _NoiseStrength;
            float _FlickerStrength;

            float Random01(float2 seed)
            {
                return frac(sin(dot(seed, float2(12.9898, 78.233))) * 43758.5453);
            }

            float2 DistortUV(float2 uv, float curvature)
            {
                float2 center = uv * 2.0 - 1.0;
                float radius2 = dot(center, center);
                center *= 1.0 + (radius2 * curvature);
                return center * 0.5 + 0.5;
            }

            half4 Frag(Varyings input) : SV_Target
            {
                float2 uv = input.texcoord;
                float2 curvedUV = DistortUV(uv, _Curvature);

                if (curvedUV.x < 0.0 || curvedUV.x > 1.0 || curvedUV.y < 0.0 || curvedUV.y > 1.0)
                {
                    return half4(0.0, 0.0, 0.0, 1.0);
                }

                float2 fromCenter = curvedUV - 0.5;
                float2 aberrationOffset = fromCenter * _ChromaticAberration;

                half red = SAMPLE_TEXTURE2D_X(_BlitTexture, sampler_LinearClamp, curvedUV + aberrationOffset).r;
                half green = SAMPLE_TEXTURE2D_X(_BlitTexture, sampler_LinearClamp, curvedUV).g;
                half blue = SAMPLE_TEXTURE2D_X(_BlitTexture, sampler_LinearClamp, curvedUV - aberrationOffset).b;
                half3 color = half3(red, green, blue);

                float scanlineWave = sin((curvedUV.y * _ScreenParams.y * 0.5 * _ScanlineDensity) + (_Time.y * 18.0));
                float scanlineMask = lerp(1.0, saturate(0.7 + 0.3 * scanlineWave), _ScanlineStrength);
                color *= scanlineMask;

                float noise = Random01(curvedUV * _ScreenParams.xy + _Time.yy * 37.0) - 0.5;
                color += noise * _NoiseStrength;

                float flicker = 1.0 - (_FlickerStrength * (0.5 + 0.5 * sin(_Time.y * 32.0)));
                color *= flicker;

                float2 vignetteUV = curvedUV * (1.0 - curvedUV.yx);
                float vignette = saturate(pow(vignetteUV.x * vignetteUV.y * 18.0, 0.2));
                color *= lerp(1.0 - _VignetteStrength, 1.0, vignette);

                half3 baseColor = SAMPLE_TEXTURE2D_X(_BlitTexture, sampler_LinearClamp, uv).rgb;
                half3 finalColor = lerp(baseColor, color, _Intensity);

                return half4(finalColor, 1.0);
            }
            ENDHLSL
        }
    }
}
