// created by florian berger (flockaroo) - 2022
// License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.

// Genuary 2022 - day 19 txt/typography

#define Res (iResolution.xy)

#define A_ 65
#define B_ 66
#define C_ 67
#define D_ 68
#define E_ 69
#define F_ 70
#define G_ 71
#define H_ 72
#define I_ 73
#define J_ 74
#define K_ 75
#define L_ 76
#define M_ 77
#define N_ 78
#define O_ 79
#define P_ 80
#define Q_ 81
#define R_ 82
#define S_ 83
#define T_ 84
#define U_ 85
#define V_ 86
#define W_ 87
#define X_ 88
#define Y_ 89
#define Z_ 90
#define a_ (65+32)
#define b_ (66+32)
#define c_ (67+32)
#define d_ (68+32)
#define e_ (69+32)
#define f_ (70+32)
#define g_ (71+32)
#define h_ (72+32)
#define i_ (73+32)
#define j_ (74+32)
#define k_ (75+32)
#define l_ (76+32)
#define m_ (77+32)
#define n_ (78+32)
#define o_ (79+32)
#define p_ (80+32)
#define q_ (81+32)
#define r_ (82+32)
#define s_ (83+32)
#define t_ (84+32)
#define u_ (85+32)
#define v_ (86+32)
#define w_ (87+32)
#define x_ (88+32)
#define y_ (89+32)
#define z_ (90+32)

#define SDFFontTex iChannel0

float getCharDist(int c, vec2 p)  // p=[(-.5,-.5)..(.5,.5)]
{
    //p*=.85;
    vec2 r=vec2(textureSize(SDFFontTex,0));
    float d=textureLod(SDFFontTex,vec2(c%16,15-c/16)/16.+vec2(0,1)+clamp((p+.5)/16.,1./r,1.-1./r),0.).w-.5;
    vec2  d2=abs(p)-(.5-1./r);
    if (d2.x>0. || d2.y>0.) return d+max(d2.x,d2.y);
    return d-.02;
}

vec2 getCharGrad(int c, vec2 p)
{
    float eps=.05;
    vec2 d=vec2(eps*.5,0);
    return vec2(
        getCharDist(c,p+d.xy)-getCharDist(c,p-d.xy),
        getCharDist(c,p+d.yx)-getCharDist(c,p-d.yx)
        )/eps*vec2(1,-1);
}

void mainImage( out vec4 fragColor, vec2 fragCoord )
{
    int lnum=7;
    int l[7]=int[7](G_,e_,n_,u_,a_,r_,y_);
    //int l[7]=int[7](G_,E_,N_,U_,A_,R_,Y_);

    float d=1000.;
    mat2 m0=mat2(cos(sin(iTime*3.)+vec4(0,1.57,-1.57,0)));
    mat2 m=mat2(1,0,0,1);
    float sc=100.*exp(iTime);
    float dsc=1./8.;
    // unfortunately not an endless zoom, but 117 chars should do it fo now ;-)
    for(int i=0;i<117;i++){
        vec2 p=fract(fragCoord/sc)-.5;
        d=min(d,getCharDist(l[i%lnum],m*p)*sc);
        vec2 g=getCharGrad(l[i%lnum],m*((floor(p/dsc)+.5)*dsc));
        g=normalize(g);
        m=mat2(g.yx*vec2(-1,1),-g)*m;
        sc*=dsc;
    }

    fragColor.xyz=vec3(0)+d+1.;
    fragColor.w=1.;
}

