// Simplified version of the SDF Surface shader :
// - No support for Bevel, Bump or envmap
// - Diffuse only lighting
// - Fully supports only 1 directional light. Other lights can affect it, but it will be per-vertex/SH.

Shader "TextMeshPro/Mobile/Distance Field (Surface)"
{

    Properties
    {
        _FaceTex ("Fill Texture", 2D) = "white" {}
        [HDR]_FaceColor ("Fill Color", Color) = (1,1,1,1)
        _FaceDilate ("Face Dilate", Range(-1,1)) = 0

        [HDR]_OutlineColor ("Outline Color", Color) = (0,0,0,1)
        _OutlineTex ("Outline Texture", 2D) = "white" {}
        _OutlineWidth ("Outline Thickness", Range(0, 1)) = 0
        _OutlineSoftness ("Outline Softness", Range(0,1)) = 0

        [HDR]_GlowColor ("Color", Color) = (0, 1, 0, 0.5)
        _GlowOffset ("Offset", Range(-1,1)) = 0
        _GlowInner ("Inner", Range(0,1)) = 0.05
        _GlowOuter ("Outer", Range(0,1)) = 0.05
        _GlowPower ("Falloff", Range(1, 0)) = 0.75

        _WeightNormal ("Weight Normal", float) = 0
        _WeightBold ("Weight Bold", float) = 0.5

        // Should not be directly exposed to the user
        _ShaderFlags ("Flags", float) = 0
        _ScaleRatioA ("Scale RatioA", float) = 1
        _ScaleRatioB ("Scale RatioB", float) = 1
        _ScaleRatioC ("Scale RatioC", float) = 1

        _MainTex ("Font Atlas", 2D) = "white" {}
        _TextureWidth ("Texture Width", float) = 512
        _TextureHeight ("Texture Height", float) = 512
        _GradientScale ("Gradient Scale", float) = 5.0
        _ScaleX ("Scale X", float) = 1.0
        _ScaleY ("Scale Y", float) = 1.0
        _PerspectiveFilter ("Perspective Correction", Range(0, 1)) = 0.875
        _Sharpness ("Sharpness", Range(-1,1)) = 0

        _VertexOffsetX ("Vertex OffsetX", float) = 0
        _VertexOffsetY ("Vertex OffsetY", float) = 0

        _CullMode ("Cull Mode", Float) = 0
        //_MaskCoord		("Mask Coords", vector) = (0,0,0,0)
        //_MaskSoftness		("Mask Softness", float) = 0
    }

    SubShader
    {

        Tags
        {
            "Queue"="Transparent"
            "IgnoreProjector"="True"
            "RenderType"="Transparent"
        }

        LOD 300
        Cull [_CullMode]

        CGPROGRAM
        #pragma surface PixShader Lambert alpha:blend vertex:VertShader noforwardadd nolightmap nodirlightmap
        #pragma target 3.0
        #pragma shader_feature __ GLOW_ON

        #include "TMPro_Properties.cginc"
        #include "TMPro.cginc"

        half _FaceShininess;
        half _OutlineShininess;

        struct Input
        {
            fixed4 color : COLOR;
            float2 uv_MainTex;
            float2 uv2_FaceTex;
            float2 uv2_OutlineTex;
            float2 param; // Weight, Scale
            float3 viewDirEnv;
        };

        #include "TMPro_Surface.cginc"
        ENDCG

        // Pass to render object as a shadow caster
        Pass
        {
            Name "Caster"
            Tags
            {
                "LightMode" = "ShadowCaster"
            }
            Offset 1, 1

            Fog
            {
                Mode Off
            }
            ZWrite On ZTest LEqual Cull Off

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_shadowcaster
            #include "UnityCG.cginc"

            struct v2f
            {
                V2F_SHADOW_CASTER;
                float2 uv : TEXCOORD1;
                float2 uv2 : TEXCOORD3;
                float alphaClip : TEXCOORD2;
            };

            uniform float4 _MainTex_ST;
            uniform float4 _OutlineTex_ST;
            float _OutlineWidth;
            float _FaceDilate;
            float _ScaleRatioA;

            v2f vert(appdata_base v)
            {
                v2f o;
                TRANSFER_SHADOW_CASTER(o)
                o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
                o.uv2 = TRANSFORM_TEX(v.texcoord, _OutlineTex);
                o.alphaClip = o.alphaClip = (1.0 - _OutlineWidth * _ScaleRatioA - _FaceDilate * _ScaleRatioA) / 2;
                return o;
            }

            uniform sampler2D _MainTex;

            float4 frag(v2f i) : COLOR
            {
                fixed4 texcol = tex2D(_MainTex, i.uv).a;
                clip(texcol.a - i.alphaClip);
                SHADOW_CASTER_FRAGMENT(i)
            }
            ENDCG
        }
    }

    CustomEditor "TMPro.EditorUtilities.TMP_SDFShaderGUI"
}