#version 300 es
precision highp float;
uniform sampler2D eTexture0; // https://i.imgur.com/dnUpvFG.png
uniform vec2 resolution;
uniform float time;
out vec4 fragColor;
#define gap 0.05
const int _SQUOTE = 39, _LPAR = 40, _RPAR = 41, _ASTERISK = 42, _PLUS = 43, _COMMA = 44;
const int _MINUS = 45, _DOT = 46, _SLASH = 47, _COLON = 58, _SEMICOLON = 59, _LT = 60;
const int _ = 32;
const int _0 = 48, _1 = 49, _2 = 50, _3 = 51, _4 = 52, _5 = 53, _6 = 54, _7 = 55, _8 = 56, _9 = 57;
const int _A = 65, _B = 66, _C = 67, _D = 68, _E = 69, _F = 70, _G = 71, _H = 72, _I = 73;
const int _J = 74, _K = 75, _L = 76, _M = 77, _N = 78, _O = 79, _P = 80, _Q = 81, _R = 82;
const int _S = 83, _T = 84, _U = 85, _V = 86, _W = 87, _X = 88, _Y = 89, _Z = 90;
const int _a = 97, _b = 98, _c = 99, _d = 100, _e = 101, _f = 102, _g = 103, _h = 104, _i = 105;
const int _j = 106, _k = 107, _l = 108, _m = 109, _n = 110, _o = 111, _p = 112, _q = 113, _r = 114;
const int _s = 115, _t = 116, _u = 117, _v = 118, _w = 119, _x = 120, _y = 121, _z = 122;
float drawChar(in vec2 uv, in int i, in float s) {
vec2 coord = (fract(uv / s) + vec2(i, 15 - i / 16)) / 16.0;
if ((i / 16) % 2 != 0) coord.x = 1.0 - coord.x;
float c = texture(eTexture0, coord).w;
float f = fwidth(c);
return 1.0 - smoothstep(0.51 - f, 0.55 + f, c);
}
#define DRAW(uv, col, TEXT, POS)\
{\
const int chars[] = int[]TEXT; \
float len = float(chars.length()); \
vec2 uv = uv - POS; \
vec2 tl = vec2(len + 0.5, (len + 0.5) / resolution.x * resolution.y); \
vec2 lv = fract(uv * tl), id = floor(uv * tl); \
id = abs(id); \
int c = chars[clamp(int(id.x), 0, chars.length() - 1)]; \
float reach = id.y * len + id.x; \
col += (reach < len) ? drawChar(lv, c, 1.0) : 0.0; \
}
vec4 drawText(vec2 uv) {
vec3 col = vec3(0.0);
vec2 gv = fract(uv);
DRAW(gv, col, (_W,_o,_W), vec2(0.0, 1.0 / 70.0));
return vec4(clamp(pow(col, vec3(5.0)), 0.0, 1.0), col.x);
}
float rect(vec2 dimension, vec2 position, vec2 uv){
float draw;
draw = 1.0 * step(position.x,uv.x) * step(uv.x,(position.x+dimension.x)) * step(position.y,uv.y) * step(uv.y,(position.y+dimension.y));
return draw;
}
vec3 palette(float t){
//[[0.731 1.098 0.192] [0.358 1.090 0.657] [1.077 0.360 0.328] [0.965 2.265 0.837]]
vec3 a = vec3(0.731, 1.098, 0.192);
vec3 b = vec3(.358, 1.090, 0.657);
vec3 c = vec3(1.077, 0.360, 0.328);
vec3 d = vec3(0.965, 2.265, 0.837);
return a + b*cos(6.28318*(c*t+d));
}
float sdBox( in vec2 p, in vec2 b )
{
vec2 d = abs(p)-b;
return length(max(d,0.0)) + min(max(d.x,d.y),0.0);
}
float sdSegment( in vec2 p, in vec2 a, in vec2 b )
{
vec2 pa = p-a, ba = b-a;
float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );
return length( pa - ba*h );
}
void main(void) {
vec2 uv = (gl_FragCoord.xy / resolution.xy) * 2.0 - 1.0;
uv.x *= resolution.x/resolution.y;
vec4 finalColor = vec4 (0.0,0.0,0.0,1.0);
vec2 line = uv;
vec2 forwardIlusion = uv;
vec2 wow = uv;
line.y = line.y + gap;
for (float i; i < 3.0; i += 0.2){
vec2 movementLine = line;
movementLine.y += (fract(time/3.0) + i - 1.0);
float d = sdBox(vec2(movementLine.x,movementLine.y), vec2(2.2, 0.0));
d = 0.01/d;
finalColor += vec4(d*0.2,0.0,d,1.0);
}
finalColor *= vec4(step(uv.y,-gap),step(uv.y,-gap),step(uv.y,-gap),1.0);
float d = 0.0;
if (uv.y > -gap){
d = length(uv) - 0.5;
d = step(d,0.1);
finalColor += vec4(d,d/5.0,0.0,1.0);
d = length(uv) - 0.5;
d = 0.05/d;
finalColor += vec4(d,d/4.0,0.0,1.0);
}
else{
d = 0.0;
finalColor += vec4(d,d/5.0,0.0,1.0);
}
d = sdBox(vec2(line.x,line.y), vec2(2.2, 0.0));
d = 0.02/d;
finalColor += vec4(d*0.2,0.0,d,1.0);
for (float i = -2.0; i <= 2.0; i += 0.2){
d = sdSegment(vec2(forwardIlusion.x,forwardIlusion.y), vec2(i,-gap), vec2(i*8.0,-1.0));
d = 0.01/d;
finalColor += vec4(d*0.2,0.0,d,1.0);
}
finalColor *= vec4(palette(sin(time/2.0)),1.0);
uv = gl_FragCoord.xy / resolution.xy;
uv = clamp(uv * 1.1 + vec2(-0.09, -0.14), 0.0, 1.0);
uv.x += sin(time + uv.y * 3.0) * 0.01;
uv.y += sin(2.0 * time + uv.x * 12.0) * 0.03;
uv.y -= 0.4;
vec4 col = drawText(uv);
vec3 textColour = vec3(0.5,0.5,1.0) * palette(sin(time/2.0 + 5.0));
fragColor = col * vec4(textColour.r,textColour.g,textColour.b,1.0);
fragColor += vec4(finalColor);
}