Shader "Hidden/ShadowProjected2D"
{
    Properties
    {
        [HideInInspector] _ShadowColorMask("__ShadowColorMask", Float) = 0
    }

    SubShader
    {
        Tags { "RenderType"="Transparent" }

        Cull    Off
        BlendOp Add
        Blend   One One, One One
        ZWrite  Off
        ZTest   Always

        // This pass draws the projected shadows
        Pass
        {
            Name "Projected Shadow (R)"

            // Draw the shadow
            ColorMask R

            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
            #include "Packages/com.unity.render-pipelines.universal/Shaders/2D/Include/ShadowProjectVertex.hlsl"

            TEXTURE2D(_FalloffLookup);
            SAMPLER(sampler_FalloffLookup);
            half _ShadowSoftnessFalloffIntensity;

            Varyings vert (Attributes v)
            {
                return ProjectShadow(v);
            }

            half4 frag(Varyings i) : SV_Target
            {
                half2 mappedUV;

                float clamppedY = clamp(i.shadow.y, MIN_SHADOW_Y, 1);
                float value = 1.0f - saturate(abs(i.shadow.x) / clamppedY);
                mappedUV.x = value;
                mappedUV.y = _ShadowSoftnessFalloffIntensity;
                value = SAMPLE_TEXTURE2D(_FalloffLookup, sampler_FalloffLookup, mappedUV).r;

                half4 color = half4(value, value, value, value);
                return color;
            }
            ENDHLSL
        }
        // This pass draws the projected unshadowing
        Pass
        {
            Stencil
            {
                Ref       1
                Comp      Equal
                Pass      Keep
            }


            Name "Projected Unshadow (R) - Stencil: Ref 1, Comp Eq, Pass Keep"

            // Draw the shadow
            ColorMask G

            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
            #include "Packages/com.unity.render-pipelines.universal/Shaders/2D/Include/ShadowProjectVertex.hlsl"

            TEXTURE2D(_FalloffLookup);
            SAMPLER(sampler_FalloffLookup);
            half _ShadowSoftnessFalloffIntensity;


            Varyings vert (Attributes v)
            {
                return ProjectShadow(v);
            }

            half4 frag(Varyings i) : SV_Target
            {
                half2 mappedUV;

                float clamppedY = clamp(i.shadow.y, MIN_SHADOW_Y, 1);
                float value = 1.0f - saturate(abs(i.shadow.x) / clamppedY);
                mappedUV.x = value;
                mappedUV.y = _ShadowSoftnessFalloffIntensity;
                value = SAMPLE_TEXTURE2D(_FalloffLookup, sampler_FalloffLookup, mappedUV).r;

                half4 color = half4(value, value, value, value);
                return color;
            }
            ENDHLSL
        }
    }
}