Shader "Unlit/MCNameTag"
{
    Properties
    {
        [Header(Text)]
        _MainTex ("Character Atlas", 2D) = "white" {}
        
        _Color ("Text Color", Color) = (1.0, 1.0, 1.0, 1.0)
        _BackColor ("Background Color", Color) = (1.0, 1.0, 1.0, 0.1)
    }
    SubShader
    {
        Tags { 
            "RenderType"="Transparent" 
            "Queue"="Transparent"
        }
        LOD 100

        Pass
        {
            Blend SrcAlpha OneMinusSrcAlpha 
            
            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            
            #pragma target 2.0
            #pragma multi_compile_fog

            #pragma multi_compile _ DEBUG_CHAR

            #include "UnityCG.cginc"

            SamplerState sampler_PointClamp;
            
            Texture2D _MainTex;
            float4 _MainTex_ST;

            float4 _Color;
            float4 _BackColor;
            
            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float4 vertex : SV_POSITION;
                float2 uv : TEXCOORD0;
                float backFactor : TEXCOORD2;

                UNITY_FOG_COORDS(1)
            };

            v2f vert (appdata v)
            {
                v2f o;

                // https://forum.unity.com/threads/can-i-get-the-scale-in-the-transform-of-the-object-i-attach-a-shader-to-if-so-how.418345/
                float2 worldScale = float2(
                    length(float3(unity_ObjectToWorld[0].x, unity_ObjectToWorld[1].x, unity_ObjectToWorld[2].x)), // scale x axis
                    length(float3(unity_ObjectToWorld[0].y, unity_ObjectToWorld[1].y, unity_ObjectToWorld[2].y)) // scale y axis
                );
                
                // From: https://en.wikibooks.org/wiki/Cg_Programming/Unity/Billboards
                o.vertex = mul(UNITY_MATRIX_P, 
                  mul(UNITY_MATRIX_MV, float4(0.0, 0.0, 0.0, 1.0))
                  + float4(v.vertex.xyz, 0.0)
                  * float4(worldScale.xy, 0.0, 1.0));
                
                //o.vertex = UnityObjectToClipPos(float4(vertex, 0, 1));
                o.uv = v.uv;
                //o.backFactor = v.uv.x < 0.0;
                
                UNITY_TRANSFER_FOG(o,o.vertex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                fixed4 col = _MainTex.Sample(sampler_PointClamp, i.uv);
                col = lerp(_BackColor, _Color, col.a);
                //col = lerp(col, _BackColor, i.backFactor)
                
                // apply fog
                UNITY_APPLY_FOG(i.fogCoord, col);
                
                return col;
            }
            ENDHLSL
        }
    }
}
