// Écran de texte : 12 colonnes x 2 lignes. Chaque case lit un indice (_C0 .. _C23)
// piloté par l'Animator (paramètres KB_Char0..23 envoyés en OSC par l'app).
// L'indice correspond à la case de l'atlas (8x8) : 0 = vide, 1 = A, 2 = B ...
Shader "VRCMessages/Display"
{
    Properties
    {
        _Atlas ("Atlas de police (alpha)", 2D) = "white" {}
        _BgColor ("Fond", Color) = (0.05,0.05,0.09,1)
        _GlyphColor ("Texte", Color) = (0.55,0.85,1,1)
        _Brightness ("Luminosité", Range(0.5, 3)) = 1.3

        _C0 ("c0", Float) = 0
        _C1 ("c1", Float) = 0
        _C2 ("c2", Float) = 0
        _C3 ("c3", Float) = 0
        _C4 ("c4", Float) = 0
        _C5 ("c5", Float) = 0
        _C6 ("c6", Float) = 0
        _C7 ("c7", Float) = 0
        _C8 ("c8", Float) = 0
        _C9 ("c9", Float) = 0
        _C10 ("c10", Float) = 0
        _C11 ("c11", Float) = 0
        _C12 ("c12", Float) = 0
        _C13 ("c13", Float) = 0
        _C14 ("c14", Float) = 0
        _C15 ("c15", Float) = 0
        _C16 ("c16", Float) = 0
        _C17 ("c17", Float) = 0
        _C18 ("c18", Float) = 0
        _C19 ("c19", Float) = 0
        _C20 ("c20", Float) = 0
        _C21 ("c21", Float) = 0
        _C22 ("c22", Float) = 0
        _C23 ("c23", Float) = 0
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" "Queue"="Geometry" }
        Cull Off
        Lighting Off

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

            sampler2D _Atlas;
            fixed4 _BgColor;
            fixed4 _GlyphColor;
            float _Brightness;
            float _C0, _C1, _C2, _C3, _C4, _C5, _C6, _C7, _C8, _C9, _C10, _C11;
            float _C12, _C13, _C14, _C15, _C16, _C17, _C18, _C19, _C20, _C21, _C22, _C23;

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

            struct v2f
            {
                float4 pos : SV_POSITION;
                float2 uv : TEXCOORD0;
                UNITY_VERTEX_OUTPUT_STEREO
            };

            v2f vert (appdata v)
            {
                v2f o;
                UNITY_SETUP_INSTANCE_ID(v);
                UNITY_INITIALIZE_OUTPUT(v2f, o);
                UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
                o.pos = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                const float COLS = 12.0;
                const float ROWS = 2.0;

                float2 uv = saturate(i.uv);
                int col = (int)min(floor(uv.x * COLS), COLS - 1.0);
                int row = (int)min(floor((1.0 - uv.y) * ROWS), ROWS - 1.0);
                int slot = row * 12 + col;

                float chars[24] = {
                    _C0, _C1, _C2, _C3, _C4, _C5, _C6, _C7, _C8, _C9, _C10, _C11,
                    _C12, _C13, _C14, _C15, _C16, _C17, _C18, _C19, _C20, _C21, _C22, _C23
                };
                float idx = floor(chars[slot] + 0.5);

                float cx = fmod(idx, 8.0);
                float cy = floor(idx / 8.0);          // ligne de l'atlas, depuis le haut

                float lx = frac(uv.x * COLS);          // position dans la case (0..1)
                float ly = frac(uv.y * ROWS);          // 0 = bas de la case

                float2 auv;
                auv.x = (cx + lx) / 8.0;
                auv.y = 1.0 - (cy + 1.0 - ly) / 8.0;

                float a = tex2D(_Atlas, auv).a;
                fixed3 col3 = lerp(_BgColor.rgb, _GlyphColor.rgb, a) * _Brightness;
                return fixed4(col3, 1);
            }
            ENDCG
        }
    }
}
