The Code Therapy

Retrowave Wowzers

A very retrowave background

Created by mgshadermaster on Tue, 15 Aug 2023 11:20:09 GMT.


#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);
}