Bitmap and Scrolling Text

A small piece made to demonstrate the usage of a sprite converted into unsigned integer (uint) values and an old-school scrolling wavy text.

Created by marcogomez on Mon, 18 Oct 2021 14:48:37 GMT.


#version 300 es
// ╔═════════════╦════════════════╗
// ║ Marco Gomez ║ https://mgz.me ║
// ╚═════════════╩════════════════╝
precision highp float;

uniform sampler2D prgm5Texture;
uniform vec2 resolution;

out vec4 fragColor;

void main(void) {
  vec2 uv = gl_FragCoord.xy / resolution.xy;
  vec4 prgm5 = texture(prgm5Texture, uv);
  fragColor = prgm5;
}

#version 300 es
// ╔═════════════╦════════════════╗
// ║ Marco Gomez ║ https://mgz.me ║
// ╚═════════════╩════════════════╝
precision highp float;

uniform vec2 resolution;
uniform float time;

out vec4 fragColor;

void sprite(inout vec4 color, vec2 p) {
  uint v=0u;
  v=p.y==83.?(p.x<8.?0u:(p.x<16.?0u:(p.x<24.?0u:(p.x<32.?0u:(p.x<40.?286331152u:(p.x<48.?286331153u:(p.x<56.?273u:0u))))))):v;
  v=p.y==82.?(p.x<8.?0u:(p.x<16.?0u:(p.x<24.?0u:(p.x<32.?286326784u:(p.x<40.?286331153u:(p.x<48.?286331153u:(p.x<56.?17895697u:0u))))))):v;
  v=p.y==81.?(p.x<8.?0u:(p.x<16.?0u:(p.x<24.?0u:(p.x<32.?286326784u:(p.x<40.?286331153u:(p.x<48.?286331153u:(p.x<56.?17895697u:0u))))))):v;
  v=p.y==80.?(p.x<8.?0u:(p.x<16.?0u:(p.x<24.?0u:(p.x<32.?286331152u:(p.x<40.?858993425u:(p.x<48.?858993459u:(p.x<56.?286331155u:(p.x<64.?17u:0u)))))))):v;
  v=p.y==79.?(p.x<8.?0u:(p.x<16.?0u:(p.x<24.?285212672u:(p.x<32.?856756497u:(p.x<40.?858993459u:(p.x<48.?858993459u:(p.x<56.?288568115u:(p.x<64.?69905u:0u)))))))):v;
  v=p.y==78.?(p.x<8.?0u:(p.x<16.?0u:(p.x<24.?285212672u:(p.x<32.?856756497u:(p.x<40.?858993459u:(p.x<48.?858993459u:(p.x<56.?288568115u:(p.x<64.?69905u:0u)))))))):v;
  v=p.y==77.?(p.x<8.?0u:(p.x<16.?0u:(p.x<24.?286261248u:(p.x<32.?858984721u:(p.x<40.?858993459u:(p.x<48.?858993459u:(p.x<56.?858993459u:(p.x<64.?286331155u:0u)))))))):v;
  v=p.y==76.?(p.x<8.?0u:(p.x<16.?0u:(p.x<24.?286330880u:(p.x<32.?1999843601u:(p.x<40.?858993463u:(p.x<48.?858993459u:(p.x<56.?859009843u:(p.x<64.?286339891u:(p.x<72.?17u:0u))))))))):v;
  v=p.y==75.?(p.x<8.?0u:(p.x<16.?0u:(p.x<24.?286330880u:(p.x<32.?1999843601u:(p.x<40.?858993463u:(p.x<48.?858993459u:(p.x<56.?859009843u:(p.x<64.?286339891u:(p.x<72.?17u:0u))))))))):v;
  v=p.y==74.?(p.x<8.?0u:(p.x<16.?0u:(p.x<24.?286331136u:(p.x<32.?930558225u:(p.x<40.?2004300595u:(p.x<48.?1999844215u:(p.x<56.?859010935u:(p.x<64.?286750515u:(p.x<72.?273u:0u))))))))):v;
  v=p.y==73.?(p.x<8.?0u:(p.x<16.?0u:(p.x<24.?286331153u:(p.x<32.?825439025u:(p.x<40.?2004318067u:(p.x<48.?2004316979u:(p.x<56.?860108663u:(p.x<64.?393687859u:(p.x<72.?69905u:0u))))))))):v;
  v=p.y==72.?(p.x<8.?0u:(p.x<16.?0u:(p.x<24.?286331153u:(p.x<32.?825439025u:(p.x<40.?2004318067u:(p.x<48.?2004316979u:(p.x<56.?860108663u:(p.x<64.?393687859u:(p.x<72.?69905u:0u))))))))):v;
  v=p.y==71.?(p.x<8.?0u:(p.x<16.?268435456u:(p.x<24.?856895761u:(p.x<32.?823210801u:(p.x<40.?858993459u:(p.x<48.?2004038451u:(p.x<56.?860107575u:(p.x<64.?2004038451u:(p.x<72.?69905u:0u))))))))):v;
  v=p.y==70.?(p.x<8.?0u:(p.x<16.?268435456u:(p.x<24.?858854161u:(p.x<32.?856756497u:(p.x<40.?858993427u:(p.x<48.?863467383u:(p.x<56.?879112467u:(p.x<64.?2004055859u:(p.x<72.?1118583u:0u))))))))):v;
  v=p.y==69.?(p.x<8.?0u:(p.x<16.?268435456u:(p.x<24.?858854161u:(p.x<32.?856756497u:(p.x<40.?858993427u:(p.x<48.?863467383u:(p.x<56.?879112467u:(p.x<64.?2004055859u:(p.x<72.?1118583u:0u))))))))):v;
  v=p.y==68.?(p.x<8.?0u:(p.x<16.?286261248u:(p.x<24.?863187729u:(p.x<32.?286331153u:(p.x<40.?823341889u:(p.x<48.?288568115u:(p.x<56.?1771660081u:(p.x<64.?2004318006u:(p.x<72.?1118583u:0u))))))))):v;
  v=p.y==67.?(p.x<8.?0u:(p.x<16.?286261248u:(p.x<24.?863188787u:(p.x<32.?1145311505u:(p.x<40.?876688180u:(p.x<48.?286470963u:(p.x<56.?2576987747u:(p.x<64.?930558777u:(p.x<72.?286331767u:0u))))))))):v;
  v=p.y==66.?(p.x<8.?0u:(p.x<16.?286261248u:(p.x<24.?863188787u:(p.x<32.?1145311505u:(p.x<40.?876688180u:(p.x<48.?286470963u:(p.x<56.?2576987747u:(p.x<64.?930558777u:(p.x<72.?286331767u:0u))))))))):v;
  v=p.y==65.?(p.x<8.?0u:(p.x<16.?286326784u:(p.x<24.?863467315u:(p.x<32.?912670993u:(p.x<40.?859050259u:(p.x<48.?856756531u:(p.x<56.?2579216790u:(p.x<64.?930296681u:(p.x<72.?286331699u:0u))))))))):v;
  v=p.y==64.?(p.x<8.?0u:(p.x<16.?823197696u:(p.x<24.?288847735u:(p.x<32.?2573624385u:(p.x<40.?286484121u:(p.x<48.?2573414673u:(p.x<56.?2612771769u:(p.x<64.?858993561u:(p.x<72.?286331665u:0u))))))))):v;
  v=p.y==63.?(p.x<8.?0u:(p.x<16.?823197696u:(p.x<24.?288847735u:(p.x<32.?2573624385u:(p.x<40.?286484121u:(p.x<48.?2573414673u:(p.x<56.?2612771769u:(p.x<64.?858993561u:(p.x<72.?286331665u:0u))))))))):v;
  v=p.y==62.?(p.x<8.?0u:(p.x<16.?286326784u:(p.x<24.?859272055u:(p.x<32.?2576967268u:(p.x<40.?1718196633u:(p.x<48.?2576979558u:(p.x<56.?2612771771u:(p.x<64.?858875545u:(p.x<72.?286331153u:0u))))))))):v;
  v=p.y==61.?(p.x<8.?0u:(p.x<16.?286326784u:(p.x<24.?1145254263u:(p.x<32.?858994278u:(p.x<40.?2612741171u:(p.x<48.?3147544985u:(p.x<56.?858993460u:(p.x<64.?823433619u:(p.x<72.?286331153u:0u))))))))):v;
  v=p.y==60.?(p.x<8.?0u:(p.x<16.?286326784u:(p.x<24.?1145254263u:(p.x<32.?858994278u:(p.x<40.?2612741171u:(p.x<48.?3147544985u:(p.x<56.?858993460u:(p.x<64.?823433619u:(p.x<72.?286331153u:0u))))))))):v;
  v=p.y==59.?(p.x<8.?0u:(p.x<16.?286326784u:(p.x<24.?1715540275u:(p.x<32.?858993462u:(p.x<40.?3149148979u:(p.x<48.?1153153979u:(p.x<56.?858993459u:(p.x<64.?286693683u:(p.x<72.?286470417u:0u))))))))):v;
  v=p.y==58.?(p.x<8.?0u:(p.x<16.?286326784u:(p.x<24.?1715540241u:(p.x<32.?2571383603u:(p.x<40.?3113851289u:(p.x<48.?2577120187u:(p.x<56.?882481561u:(p.x<64.?286667571u:(p.x<72.?286470929u:0u))))))))):v;
  v=p.y==57.?(p.x<8.?0u:(p.x<16.?286326784u:(p.x<24.?1715540241u:(p.x<32.?2571383603u:(p.x<40.?3113851289u:(p.x<48.?2577120187u:(p.x<56.?882481561u:(p.x<64.?286667571u:(p.x<72.?286470929u:0u))))))))):v;
  v=p.y==56.?(p.x<8.?0u:(p.x<16.?823197696u:(p.x<24.?2003899153u:(p.x<32.?858993463u:(p.x<40.?2576560947u:(p.x<48.?865704891u:(p.x<56.?858993459u:(p.x<64.?393705267u:(p.x<72.?286470963u:0u))))))))):v;
  v=p.y==55.?(p.x<8.?0u:(p.x<16.?823197696u:(p.x<24.?863047987u:(p.x<32.?1145324612u:(p.x<40.?2469872708u:(p.x<48.?2000264123u:(p.x<56.?1145324612u:(p.x<64.?393430084u:(p.x<72.?286470929u:0u))))))))):v;
  v=p.y==54.?(p.x<8.?0u:(p.x<16.?823197696u:(p.x<24.?863047987u:(p.x<32.?1145324612u:(p.x<40.?2469872708u:(p.x<48.?2000264123u:(p.x<56.?1145324612u:(p.x<64.?393430084u:(p.x<72.?286470929u:0u))))))))):v;
  v=p.y==53.?(p.x<8.?0u:(p.x<16.?823197696u:(p.x<24.?1144066355u:(p.x<32.?1717978724u:(p.x<40.?930375270u:(p.x<48.?1148402619u:(p.x<56.?1181116006u:(p.x<64.?322192484u:(p.x<72.?286470417u:0u))))))))):v;
  v=p.y==52.?(p.x<8.?0u:(p.x<16.?823197696u:(p.x<24.?2000052497u:(p.x<32.?3432617030u:(p.x<40.?912877260u:(p.x<48.?2573415219u:(p.x<56.?2580335814u:(p.x<64.?322397769u:(p.x<72.?286331153u:0u))))))))):v;
  v=p.y==51.?(p.x<8.?0u:(p.x<16.?823197696u:(p.x<24.?2000052497u:(p.x<32.?3432617030u:(p.x<40.?912877260u:(p.x<48.?2573415219u:(p.x<56.?2580335814u:(p.x<64.?322397769u:(p.x<72.?286331153u:0u))))))))):v;
  v=p.y==50.?(p.x<8.?0u:(p.x<16.?823197696u:(p.x<24.?2855690513u:(p.x<32.?2479658054u:(p.x<40.?966184009u:(p.x<48.?1720924569u:(p.x<56.?2620625996u:(p.x<64.?322594377u:(p.x<72.?286331187u:0u))))))))):v;
  v=p.y==49.?(p.x<8.?0u:(p.x<16.?286331136u:(p.x<24.?2855691025u:(p.x<32.?869045318u:(p.x<40.?966376259u:(p.x<48.?2576563131u:(p.x<56.?2620601419u:(p.x<64.?1664771657u:(p.x<72.?286331187u:(p.x<80.?17u:0u)))))))))):v;
  v=p.y==48.?(p.x<8.?0u:(p.x<16.?286331136u:(p.x<24.?2855691025u:(p.x<32.?869045318u:(p.x<40.?966376259u:(p.x<48.?2576563131u:(p.x<56.?2620601419u:(p.x<64.?1664771657u:(p.x<72.?286331187u:(p.x<80.?17u:0u)))))))))):v;
  v=p.y==47.?(p.x<8.?0u:(p.x<16.?339808512u:(p.x<24.?2855691025u:(p.x<32.?2576979558u:(p.x<40.?2470025625u:(p.x<48.?2570689723u:(p.x<56.?2576980377u:(p.x<64.?1664771689u:(p.x<72.?289477427u:(p.x<80.?17u:0u)))))))))):v;
  v=p.y==46.?(p.x<8.?0u:(p.x<16.?1234243840u:(p.x<24.?862348083u:(p.x<32.?2576967274u:(p.x<40.?3113458073u:(p.x<48.?865844411u:(p.x<56.?1771674009u:(p.x<64.?1717807718u:(p.x<72.?294929203u:(p.x<80.?17u:0u)))))))))):v;
  v=p.y==45.?(p.x<8.?0u:(p.x<16.?1234243840u:(p.x<24.?862348083u:(p.x<32.?2576967274u:(p.x<40.?3113458073u:(p.x<48.?865844411u:(p.x<56.?1771674009u:(p.x<64.?1717807718u:(p.x<72.?294929203u:(p.x<80.?17u:0u)))))))))):v;
  v=p.y==44.?(p.x<8.?0u:(p.x<16.?2487292160u:(p.x<24.?1721131827u:(p.x<32.?858993459u:(p.x<40.?3149476659u:(p.x<48.?2579287227u:(p.x<56.?858993459u:(p.x<64.?1771451187u:(p.x<72.?290034483u:(p.x<80.?17u:0u)))))))))):v;
  v=p.y==43.?(p.x<8.?0u:(p.x<16.?1180766464u:(p.x<24.?3147404083u:(p.x<32.?3149642683u:(p.x<40.?3113851291u:(p.x<48.?2579287244u:(p.x<56.?3149642137u:(p.x<64.?2576989115u:(p.x<72.?291783475u:(p.x<80.?17u:0u)))))))))):v;
  v=p.y==42.?(p.x<8.?0u:(p.x<16.?1180766464u:(p.x<24.?3147404083u:(p.x<32.?3149642683u:(p.x<40.?3113851291u:(p.x<48.?2579287244u:(p.x<56.?3149642137u:(p.x<64.?2576989115u:(p.x<72.?291783475u:(p.x<80.?17u:0u)))))))))):v;
  v=p.y==41.?(p.x<8.?0u:(p.x<16.?1234243840u:(p.x<24.?3149501235u:(p.x<32.?3149647052u:(p.x<40.?3149502907u:(p.x<48.?3150760891u:(p.x<56.?3434855353u:(p.x<64.?2577185740u:(p.x<72.?294929203u:(p.x<80.?17u:0u)))))))))):v;
  v=p.y==40.?(p.x<8.?0u:(p.x<16.?1234243840u:(p.x<24.?3149640499u:(p.x<32.?3149642683u:(p.x<40.?3149633979u:(p.x<48.?2579217339u:(p.x<56.?3149642678u:(p.x<64.?2612771771u:(p.x<72.?294929203u:(p.x<80.?17u:0u)))))))))):v;
  v=p.y==39.?(p.x<8.?0u:(p.x<16.?1234243840u:(p.x<24.?3149640499u:(p.x<32.?3149642683u:(p.x<40.?3149633979u:(p.x<48.?2579217339u:(p.x<56.?3149642678u:(p.x<64.?2612771771u:(p.x<72.?294929203u:(p.x<80.?17u:0u)))))))))):v;
  v=p.y==38.?(p.x<8.?0u:(p.x<16.?1771114752u:(p.x<24.?3149640499u:(p.x<32.?3149642683u:(p.x<40.?1109550779u:(p.x<48.?1143089561u:(p.x<56.?3149642134u:(p.x<64.?2612771771u:(p.x<72.?295068740u:(p.x<80.?17u:0u)))))))))):v;
  v=p.y==37.?(p.x<8.?0u:(p.x<16.?2522943744u:(p.x<24.?3149640772u:(p.x<32.?3149642683u:(p.x<40.?608584859u:(p.x<48.?1717707844u:(p.x<56.?3149633124u:(p.x<64.?2612771771u:(p.x<72.?292131908u:(p.x<80.?17u:0u)))))))))):v;
  v=p.y==36.?(p.x<8.?0u:(p.x<16.?2522943744u:(p.x<24.?3149640772u:(p.x<32.?3149642683u:(p.x<40.?608584859u:(p.x<48.?1717707844u:(p.x<56.?3149633124u:(p.x<64.?2612771771u:(p.x<72.?292131908u:(p.x<80.?17u:0u)))))))))):v;
  v=p.y==35.?(p.x<8.?0u:(p.x<16.?2433814784u:(p.x<24.?3149640806u:(p.x<32.?2612771771u:(p.x<40.?2004318105u:(p.x<48.?2004318071u:(p.x<56.?3147405719u:(p.x<64.?2612771771u:(p.x<72.?286889540u:(p.x<80.?17u:0u)))))))))):v;
  v=p.y==34.?(p.x<8.?0u:(p.x<16.?1628504064u:(p.x<24.?3149640806u:(p.x<32.?2579217339u:(p.x<40.?2004318073u:(p.x<48.?2004318071u:(p.x<56.?3147405175u:(p.x<64.?2612771771u:(p.x<72.?286680644u:0u))))))))):v;
  v=p.y==33.?(p.x<8.?0u:(p.x<16.?1628504064u:(p.x<24.?3149640806u:(p.x<32.?2579217339u:(p.x<40.?2004318073u:(p.x<48.?2004318071u:(p.x<56.?3147405175u:(p.x<64.?2612771771u:(p.x<72.?286680644u:0u))))))))):v;
  v=p.y==32.?(p.x<8.?0u:(p.x<16.?286326784u:(p.x<24.?3149501542u:(p.x<32.?2042346427u:(p.x<40.?2576971639u:(p.x<48.?2576980377u:(p.x<56.?3147396983u:(p.x<64.?2577120187u:(p.x<72.?286332467u:0u))))))))):v;
  v=p.y==31.?(p.x<8.?0u:(p.x<16.?286261248u:(p.x<24.?3149361937u:(p.x<32.?2006563771u:(p.x<40.?1717986919u:(p.x<48.?1717986918u:(p.x<56.?3111614054u:(p.x<64.?2040249275u:(p.x<72.?1118515u:0u))))))))):v;
  v=p.y==30.?(p.x<8.?0u:(p.x<16.?286261248u:(p.x<24.?3149361937u:(p.x<32.?2006563771u:(p.x<40.?1717986919u:(p.x<48.?1717986918u:(p.x<56.?3111614054u:(p.x<64.?2040249275u:(p.x<72.?1118515u:0u))))))))):v;
  v=p.y==29.?(p.x<8.?0u:(p.x<16.?268435456u:(p.x<24.?3149361425u:(p.x<32.?1738128315u:(p.x<40.?2899085382u:(p.x<48.?3435834572u:(p.x<56.?3111609416u:(p.x<64.?2004597691u:(p.x<72.?69905u:0u))))))))):v;
  v=p.y==28.?(p.x<8.?0u:(p.x<16.?0u:(p.x<24.?2578936081u:(p.x<32.?1201257403u:(p.x<40.?1431874132u:(p.x<48.?2287293781u:(p.x<56.?3111601498u:(p.x<64.?2004588987u:(p.x<72.?69905u:0u))))))))):v;
  v=p.y==27.?(p.x<8.?0u:(p.x<16.?0u:(p.x<24.?2578936081u:(p.x<32.?1201257403u:(p.x<40.?1431874132u:(p.x<48.?2287293781u:(p.x<56.?3111601498u:(p.x<64.?2004588987u:(p.x<72.?69905u:0u))))))))):v;
  v=p.y==26.?(p.x<8.?0u:(p.x<16.?0u:(p.x<24.?2574463249u:(p.x<32.?1201257401u:(p.x<40.?286344276u:(p.x<48.?286331153u:(p.x<56.?3111601492u:(p.x<64.?930585019u:(p.x<72.?273u:0u))))))))):v;
  v=p.y==25.?(p.x<8.?0u:(p.x<16.?0u:(p.x<24.?2003898641u:(p.x<32.?1234811289u:(p.x<40.?286331204u:(p.x<48.?286331153u:(p.x<56.?3113829441u:(p.x<64.?930584987u:(p.x<72.?273u:0u))))))))):v;
  v=p.y==24.?(p.x<8.?0u:(p.x<16.?0u:(p.x<24.?2003898641u:(p.x<32.?1234811289u:(p.x<40.?286331204u:(p.x<48.?286331153u:(p.x<56.?3113829441u:(p.x<64.?930584987u:(p.x<72.?273u:0u))))))))):v;
  v=p.y==23.?(p.x<8.?0u:(p.x<16.?0u:(p.x<24.?1999704320u:(p.x<32.?1769445785u:(p.x<40.?1145114950u:(p.x<48.?289686596u:(p.x<56.?2543412289u:(p.x<64.?859273113u:(p.x<72.?273u:0u))))))))):v;
  v=p.y==22.?(p.x<8.?0u:(p.x<16.?0u:(p.x<24.?1997607168u:(p.x<32.?2608298391u:(p.x<40.?1717847129u:(p.x<48.?1147561028u:(p.x<56.?2545653076u:(p.x<64.?322402169u:(p.x<72.?17u:0u))))))))):v;
  v=p.y==21.?(p.x<8.?0u:(p.x<16.?0u:(p.x<24.?1997607168u:(p.x<32.?2608298391u:(p.x<40.?1717847129u:(p.x<48.?1147561028u:(p.x<56.?2545653076u:(p.x<64.?322402169u:(p.x<72.?17u:0u))))))))):v;
  v=p.y==20.?(p.x<8.?0u:(p.x<16.?0u:(p.x<24.?856756224u:(p.x<32.?2608297847u:(p.x<40.?1717978249u:(p.x<48.?1717986406u:(p.x<56.?2545653892u:(p.x<64.?322402169u:(p.x<72.?17u:0u))))))))):v;
  v=p.y==19.?(p.x<8.?0u:(p.x<16.?0u:(p.x<24.?856756224u:(p.x<32.?3145167671u:(p.x<40.?1717986987u:(p.x<48.?1717986918u:(p.x<56.?2008791718u:(p.x<64.?286488375u:0u)))))))):v;
  v=p.y==18.?(p.x<8.?0u:(p.x<16.?0u:(p.x<24.?856756224u:(p.x<32.?3145167671u:(p.x<40.?1717986987u:(p.x<48.?1717986918u:(p.x<56.?2008791718u:(p.x<64.?286488375u:0u)))))))):v;
  v=p.y==17.?(p.x<8.?0u:(p.x<16.?0u:(p.x<24.?286261248u:(p.x<32.?3145167667u:(p.x<40.?1718004379u:(p.x<48.?1717986918u:(p.x<56.?2008791450u:(p.x<64.?286339895u:0u)))))))):v;
  v=p.y==16.?(p.x<8.?0u:(p.x<16.?0u:(p.x<24.?286261248u:(p.x<32.?3145167667u:(p.x<40.?2576980411u:(p.x<48.?2576980377u:(p.x<56.?2008791993u:(p.x<64.?17904439u:0u)))))))):v;
  v=p.y==15.?(p.x<8.?0u:(p.x<16.?0u:(p.x<24.?286261248u:(p.x<32.?3145167667u:(p.x<40.?2576980411u:(p.x<48.?2576980377u:(p.x<56.?2008791993u:(p.x<64.?17904439u:0u)))))))):v;
  v=p.y==14.?(p.x<8.?0u:(p.x<16.?0u:(p.x<24.?285212672u:(p.x<32.?3111596849u:(p.x<40.?2576989083u:(p.x<48.?2576980377u:(p.x<56.?932821403u:(p.x<64.?69939u:0u)))))))):v;
  v=p.y==13.?(p.x<8.?0u:(p.x<16.?0u:(p.x<24.?285212672u:(p.x<32.?2541171505u:(p.x<40.?3149625241u:(p.x<48.?3149642683u:(p.x<56.?930584983u:(p.x<64.?69939u:0u)))))))):v;
  v=p.y==12.?(p.x<8.?0u:(p.x<16.?0u:(p.x<24.?285212672u:(p.x<32.?2541171505u:(p.x<40.?3149625241u:(p.x<48.?3149642683u:(p.x<56.?930584983u:(p.x<64.?69939u:0u)))))))):v;
  v=p.y==11.?(p.x<8.?0u:(p.x<16.?0u:(p.x<24.?0u:(p.x<32.?2541170961u:(p.x<40.?2541189017u:(p.x<48.?2004457881u:(p.x<56.?863476119u:(p.x<64.?4371u:0u)))))))):v;
  v=p.y==10.?(p.x<8.?0u:(p.x<16.?0u:(p.x<24.?0u:(p.x<32.?1999843601u:(p.x<40.?859281815u:(p.x<48.?1999844147u:(p.x<56.?863467929u:(p.x<64.?4371u:0u)))))))):v;
  v=p.y==9.?(p.x<8.?0u:(p.x<16.?0u:(p.x<24.?0u:(p.x<32.?1999843601u:(p.x<40.?859281815u:(p.x<48.?1999844147u:(p.x<56.?863467929u:(p.x<64.?4371u:0u)))))))):v;
  v=p.y==8.?(p.x<8.?0u:(p.x<16.?0u:(p.x<24.?0u:(p.x<32.?1932726544u:(p.x<40.?2040109431u:(p.x<48.?2574742323u:(p.x<56.?322140025u:(p.x<64.?17u:0u)))))))):v;
  v=p.y==7.?(p.x<8.?0u:(p.x<16.?0u:(p.x<24.?0u:(p.x<32.?856756496u:(p.x<40.?2576971635u:(p.x<48.?2576980377u:(p.x<56.?288569207u:(p.x<64.?17u:0u)))))))):v;
  v=p.y==6.?(p.x<8.?0u:(p.x<16.?0u:(p.x<24.?0u:(p.x<32.?856756496u:(p.x<40.?2576971635u:(p.x<48.?2576980377u:(p.x<56.?288569207u:(p.x<64.?17u:0u)))))))):v;
  v=p.y==5.?(p.x<8.?0u:(p.x<16.?0u:(p.x<24.?0u:(p.x<32.?823201792u:(p.x<40.?2576840499u:(p.x<48.?2006415735u:(p.x<56.?286339895u:(p.x<64.?1u:0u)))))))):v;
  v=p.y==4.?(p.x<8.?0u:(p.x<16.?0u:(p.x<24.?0u:(p.x<32.?286326784u:(p.x<40.?2004038417u:(p.x<48.?863467383u:(p.x<56.?17895699u:0u))))))):v;
  v=p.y==3.?(p.x<8.?0u:(p.x<16.?0u:(p.x<24.?0u:(p.x<32.?286326784u:(p.x<40.?2004038417u:(p.x<48.?863467383u:(p.x<56.?17895699u:0u))))))):v;
  v=p.y==2.?(p.x<8.?0u:(p.x<16.?0u:(p.x<24.?0u:(p.x<32.?285212672u:(p.x<40.?286331153u:(p.x<48.?286331153u:(p.x<56.?1118481u:0u))))))):v;
  v=p.y==1.?(p.x<8.?0u:(p.x<16.?0u:(p.x<24.?0u:(p.x<32.?0u:(p.x<40.?286331152u:(p.x<48.?286331153u:(p.x<56.?273u:0u))))))):v;
  v=p.y==0.?(p.x<8.?0u:(p.x<16.?0u:(p.x<24.?0u:(p.x<32.?0u:(p.x<40.?286331152u:(p.x<48.?286331153u:(p.x<56.?273u:0u))))))):v;
  v=p.x>=0.&&p.x<84.?v:0u;
  float i=float((v>>uint(4.*p.x))&15u);
  color=i==1.?vec4(0.01):color;
  color=i==2.?vec4(.11,.075,.067,0.):color;
  color=i==3.?vec4(.25,.190,.180,0.):color;
  color=i==4.?vec4(.47,.047,.170,0.):color;
  color=i==5.?vec4(.17,.240,.350,0.):color;
  color=i==6.?vec4(.65,.290,.220,0.):color;
  color=i==7.?vec4(.54,.370,.330,0.):color;
  color=i==8.?vec4(.34,.510,.560,0.):color;
  color=i==9.?vec4(.93,.530,.380,0.):color;
  color=i==10.?vec4(.62,.810,.760,0.):color;
  color=i==11.?vec4(.98,.850,.620,0.):color;
  color=i==12.?vec4(1.,1.,1.,0.):color;
}

void main(void) {
  vec2 resMult = floor(resolution.xy / 164.0);
  float resRcp = 1.0 / max(min(resMult.x, resMult.y), 1.0);
  vec2 screenSize = floor(resolution.xy * resRcp);
  vec2 pixel = floor(gl_FragCoord.xy * resRcp - screenSize * 0.5);
  vec4 c;
  sprite(c, pixel + vec2(42.0, -10.0));
  fragColor = c;
}

#version 300 es
// ╔═════════════╦════════════════╗
// ║ Marco Gomez ║ https://mgz.me ║
// ╚═════════════╩════════════════╝
precision highp float;

uniform sampler2D prgm1Texture;
uniform sampler2D prgm2Texture;
uniform vec2 resolution;
uniform float time;
uniform int frame;

out vec4 fragColor;

const int starLayers = 12;
const float starSpeed = 8.0;

float hash (vec2 uv) {
  return fract(sin(dot(uv, vec2(12.4124, 48.4124))) * 48512.41241);
}

float starsNoise (vec2 uv) {
  vec2 b = floor(uv);
  return mix(
    mix(hash(b), hash(b + vec2(1.0, 0.0)), 0.5),
    mix(hash(b + vec2(0.0, 1.0)), hash(b + vec2(1.0, 1.0)), 0.5),
    0.5
  );
}

vec3 renderNightGrid(vec2 uv, float t) {
  vec2 suv = uv;
  uv = uv - vec2(0.5);
  float horizon = 0.0;
  float fov = 0.3;
  float scaling = 0.1;
  vec3 p = vec3(uv.x, fov, uv.y - horizon);
  vec2 sc = vec2(p.x / p.z, p.y / p.z) * scaling;
  sc.y -= t * 0.2;
  if (sc.y > 0.0) { sc.y *= 0.0; }
  float checkerboard = sign((mod(sc.x, 0.1) - 0.05) * (mod(sc.y, 0.1) - 0.05));
  checkerboard *= p.z * p.z * 10.0;
  float stars = 0.0;
  float fl, s;
  for (int layer = 0; layer < starLayers; layer++) {
    fl = float(layer);
    s = (370.0 - fl * 30.0);
    stars += step(
      0.1,
      pow(
        abs(
          starsNoise(mod(vec2(suv.x * s + t * starSpeed - fl * 100.0, suv.y * s), resolution.x))
        ),
        21.0
      )
    ) * (fl / float(starLayers));
  }
  vec3 color = (uv.y <= 0.0)
    ? vec3(checkerboard * 0.1, 0.0, checkerboard)
    : vec3(sc.y, 0.0, uv.y - 0.1) + stars;
  color = clamp(color * 3.0, 0.0, 1.0);
  return color;
}

void main(void) {
  float frameScale = 29.97;
  float frameTime = floor(time * frameScale) / frameScale;
  float yMod = 2.0;
  float yRes = resolution.y / yMod;
  vec2 uv = gl_FragCoord.xy / resolution.xy;
  vec3 color = renderNightGrid(uv, time);
  float o = pow(abs(sin(frameTime) * 0.2 + 0.2), 2.0);
  uv.y += floor(o * yRes) / yRes;
  uv = floor(uv * yRes) / yRes;
  vec4 prgm1 = texture(prgm1Texture, uv);
  if (prgm1.x > 0.0) {
    fragColor = prgm1;
  } else {
    if (frame % 2 == 0) { fragColor += vec4(color, 0.0) * 0.4; }
    fragColor += texture(prgm2Texture, gl_FragCoord.xy / resolution.xy) * 0.85;
  }
}

#version 300 es
// ╔═════════════╦════════════════╗
// ║ Marco Gomez ║ https://mgz.me ║
// ╚═════════════╩════════════════╝
precision highp float;

uniform sampler2D prgm2Texture;
uniform vec2 resolution;
uniform float time;
uniform float fft;

out vec4 fragColor;

const float reinhardAmount = 0.5;
const float contrast = 1.0;
const float brightness = 1.2;
const float amount = 1.0;
const float saturation = 0.5;
const vec2 vignetteSize = vec2(0.25, 0.25);
const float vignetteRoundness = 0.12;
const float vignetteMix = 1.0;
const float vignetteSmoothness = 0.42;
const float W = 1.2;
const float T = 7.5;

float filmicReinhardCurve(float x) {
  float q = (T * T + 1.0) * x * x;
  return q / (q + x + T * T);
}

vec3 filmicReinhard(vec3 c) {
  float w = filmicReinhardCurve(W);
  return vec3(
    filmicReinhardCurve(c.r),
    filmicReinhardCurve(c.g),
    filmicReinhardCurve(c.b)
  ) / w;
}

vec3 ContrastSaturationBrightness(vec3 color, float brt, float sat, float con) {
  const float AvgLumR = 0.5;
  const float AvgLumG = 0.5;
  const float AvgLumB = 0.5;
  const vec3 LumCoeff = vec3(0.2125, 0.7154, 0.0721);
  vec3 AvgLumin = vec3(AvgLumR, AvgLumG, AvgLumB);
  vec3 brtColor = color * brt;
  vec3 intensity = vec3(dot(brtColor, LumCoeff));
  vec3 satColor = mix(intensity, brtColor, sat);
  vec3 conColor = mix(AvgLumin, satColor, con);
  return conColor;
}

float sdSquare(vec2 point, float width) {
  vec2 d = abs(point) - width;
  return min(max(d.x, d.y), 0.0) + length(max(d, 0.0));
}

float vignette(vec2 uv, vec2 size, float roundness, float smoothness) {
  uv -= 0.5;
  float minWidth = min(size.x, size.y);
  uv.x = sign(uv.x) * clamp(abs(uv.x) - abs(minWidth - size.x), 0.0, 1.0);
  uv.y = sign(uv.y) * clamp(abs(uv.y) - abs(minWidth - size.y), 0.0, 1.0);
  float boxSize = minWidth * (1.0 - roundness);
  float dist = sdSquare(uv, boxSize) - (minWidth * roundness);
  return 1.0 - smoothstep(0.0, smoothness, dist);
}

void main(void) {
  vec2 uv = gl_FragCoord.xy / resolution.xy;
  vec4 prgm2 = texture(prgm2Texture, uv);
  vec3 reinhard = filmicReinhard(prgm2.rgb);
  vec3 color = prgm2.rgb;
  color = mix(prgm2.rgb, reinhard, reinhardAmount);
  color = ContrastSaturationBrightness(color, brightness, saturation, contrast);
  float v = vignette(uv, vignetteSize, vignetteRoundness, vignetteSmoothness);
  vec3 vig = color * v;
  color = mix(color, vig, vignetteMix);
  color = mix(prgm2.xyz, color, amount);
  color = clamp(color, 0.0, 1.0);
  fragColor = vec4(color, 1.0);
}

#version 300 es
// ╔═════════════╦════════════════╗
// ║ Marco Gomez ║ https://mgz.me ║
// ╚═════════════╩════════════════╝
precision highp float;

uniform sampler2D prgm3Texture;
uniform sampler2D textTexture;
uniform vec2 resolution;
uniform float time;

out vec4 fragColor;

#define scrollSpeed 3.0
#define fontSize 0.3
#define sinAmplitude 1.0
#define sinFrequency 0.4
#define sinSpeed 3.
#define scrollLength 58.0
#define baseColor vec4(0.0, 0.0, 1.0, 0.0)
#define SS(a) c += char(u, a); u.x -= 0.5;

vec4 char(vec2 pos, float c) {
  vec4 o = texture(
    textTexture,
    clamp(pos, 0.0, 1.0) / 16.0 + fract(floor(vec2(c, 15.999 - c / 16.0)) / 16.0)
  );
  return(
    (o.r > 0.0) ? baseColor * smoothstep(0.0, 0.5, o.r - o.a * 0.2) : vec4(0.0)
  );
}

#define _spc SS(32.);
#define _A SS(65.);
#define _B SS(66.);
#define _C SS(67.);
#define _D SS(68.);
#define _E SS(69.);
#define _F SS(70.);
#define _G SS(71.);
#define _H SS(72.);
#define _I SS(73.);
#define _J SS(74.);
#define _K SS(75.);
#define _L SS(76.);
#define _M SS(77.);
#define _N SS(78.);
#define _O SS(79.);
#define _P SS(80.);
#define _Q SS(81.);
#define _R SS(82.);
#define _S SS(83.);
#define _T SS(84.);
#define _U SS(85.);
#define _V SS(86.);
#define _W SS(87.);
#define _X SS(88.);
#define _Y SS(89.);
#define _Z SS(90.);
#define _a SS(97.);
#define _b SS(98.);
#define _c SS(99.);
#define _d SS(100.);
#define _e SS(101.);
#define _f SS(102.);
#define _g SS(103.);
#define _h SS(104.);
#define _i SS(105.);
#define _j SS(106.);
#define _k SS(107.);
#define _l SS(108.);
#define _m SS(109.);
#define _n SS(110.);
#define _o SS(111.);
#define _p SS(112.);
#define _q SS(113.);
#define _r SS(114.);
#define _s SS(115.);
#define _t SS(116.);
#define _u SS(117.);
#define _v SS(118.);
#define _w SS(119.);
#define _x SS(120.);
#define _y SS(121.);
#define _z SS(122.);
#define _or SS(33.);
#define _dot SS(46.);

vec4 scroll(vec2 u) {
  vec4 c = vec4(0.0);
  _spc _spc _spc _spc _spc _spc _spc _spc _spc _spc _spc _spc _spc _spc _spc _spc _spc _spc _spc _spc;
  _W _e _l _c _o _m _e _spc _t _o _spc _T _h _e _C _o _d _e _T _h _e _r _a _p _y;
  _spc _spc _spc _spc _spc _spc _spc _spc _spc _spc;
  return c;
}

void main(void) {
  float frameScale = 29.97;
  float frameTime = floor(time * frameScale) / frameScale;
  float yMod = 32.0;
  float yRes = resolution.y / yMod;
  vec2 uv = (gl_FragCoord.xy / resolution.y * 2.0 - 1.0) / fontSize;
  uv.x += -4.0 + mod(time * scrollSpeed, scrollLength);
  uv.y += floor((0.5 + sinAmplitude * sin(uv.x * sinFrequency + time * sinSpeed)) * yMod * 0.42) / (yMod * 0.42);
  vec4 prgm2 = texture(prgm3Texture, gl_FragCoord.xy / resolution.xy);
  uv = floor(uv * yRes) / yRes;
  fragColor = (scroll(vec2(uv.x, uv.y + 1.5)) == baseColor)
    ? vec4(gl_FragCoord.xy / resolution.xy, 0.5 + 0.5 * sin(time * 2.0), 1.0) * 1.5
    : prgm2;
}

#version 300 es
// ╔═════════════╦════════════════╗
// ║ Marco Gomez ║ https://mgz.me ║
// ╚═════════════╩════════════════╝
precision highp float;

uniform sampler2D prgm4Texture;
uniform vec2 resolution;
uniform float time;

out vec4 fragColor;

const float PI = acos(-1.0);
const float TAU = PI * 2.0;
const float hardscan = -16.0;
const float hardPix = -4.0;
const float maskDark = 0.5;
const float maskLight = 2.5;

float toLinear(float c) {
  return (c <= 0.04045) ? c / 12.92 : pow(abs((c + 0.055) / 1.055), 2.4);
}

vec3 toLinear(vec3 c) {
  return vec3(toLinear(c.r), toLinear(c.g), toLinear(c.b));
}

float toSRGB(float c) {
  return(c < 0.0031308 ? c * 12.92 : 1.055 * pow(abs(c), 0.41666) - 0.055);
}

vec3 toSRGB(vec3 c) {
  return vec3(toSRGB(c.r), toSRGB(c.g), toSRGB(c.b));
}

vec3 fetch(vec2 pos, vec2 off, vec2 res) {
  pos = floor(pos * res + off) / res;
  if (max(abs(pos.x - 0.5), abs(pos.y - 0.5)) > 0.5) {
    return vec3(0.0);
  }
  vec2 vRes = vec2(400.0, 300.0);
  pos = floor(pos * vRes) / vRes;
  return toLinear(texture(prgm4Texture, pos.xy, -16.0).xyz);
}

vec2 dist(vec2 pos, vec2 res) {
  pos = pos * res;
  return -((pos - floor(pos)) - vec2(0.5));
}

float gauss(float pos, float scale) {
  return exp2(scale * pos * pos);
}

vec3 horz3(vec2 pos, float off, vec2 res) {
  vec3 b = fetch(pos, vec2(-1.0, off), res);
  vec3 c = fetch(pos, vec2(+0.0, off), res);
  vec3 d = fetch(pos, vec2(+1.0, off), res);
  float dst = dist(pos, res).x;
  float scale = hardPix;
  float wb = gauss(dst - 1.0, scale);
  float wc = gauss(dst + 0.0, scale);
  float wd = gauss(dst + 1.0, scale);
  return (b * wb + c * wc + d * wd) / (wb + wc + wd);
}

vec3 horz5(vec2 pos, float off, vec2 res) {
  vec3 a = fetch(pos, vec2(-2.0, off), res);
  vec3 b = fetch(pos, vec2(-1.0, off), res);
  vec3 c = fetch(pos, vec2(+0.0, off), res);
  vec3 d = fetch(pos, vec2(+1.0, off), res);
  vec3 e = fetch(pos, vec2(+2.0, off), res);
  float dst = dist(pos, res).x;
  float scale = hardPix;
  float wa = gauss(dst - 2.0, scale);
  float wb = gauss(dst - 1.0, scale);
  float wc = gauss(dst + 0.0, scale);
  float wd = gauss(dst + 1.0, scale);
  float we = gauss(dst + 2.0, scale);
  return (a * wa + b * wb + c * wc + d * wd + e * we) / (wa + wb + wc + wd + we);
}

float scan(vec2 pos, float off, vec2 res) {
  float dst = dist(pos, res).y;
  return gauss(dst + off, hardscan);
}

vec3 tri(vec2 pos, vec2 res) {
  vec3 a = horz3(pos, -1.0, res);
  vec3 b = horz5(pos, +0.0, res);
  vec3 c = horz3(pos, +1.0, res);
  float wa = scan(pos, -1.0, res);
  float wb = scan(pos, +0.0, res);
  float wc = scan(pos, +1.0, res);
  return a * wa + b * wb + c * wc;
}

vec3 mask(vec2 pos) {
  pos.x += pos.y * 3.0;
  vec3 m = vec3(maskDark, maskDark, maskDark);
  pos.x = fract(pos.x / 6.0);
  if (pos.x < 0.333) {
    m.r = maskLight;
  } else if (pos.x < 0.666) {
    m.g = maskLight;
  } else {
    m.b = maskLight;
  }
  return m;
}

float bar(float pos, float bar) {
  pos -= bar;
  return pos * pos < 4.0 ? 0.0 : 1.0;
}

float rand(vec2 uv, float t) {
  float seed = dot(uv, vec2(12.9898, 78.233));
  return fract(sin(seed) * 43758.5453123 + t);
}

float gaussian(float z, float u, float o) {
  return (
    (1.0 / (o * sqrt(TAU))) *
    (exp(-(((z - u) * (z - u)) / (2.0 * (o * o)))))
  );
}

vec3 gaussgrain(float t) {
  vec2 ps = vec2(1.0) / resolution.xy;
  vec2 uv = gl_FragCoord.xy * ps;
  float noise = rand(uv, t);
  noise = gaussian(noise, 0.0, 0.5);
  return vec3(noise);
}

vec2 warp(vec2 uv, vec2 warpAmount) {
  uv = uv * 2.0 - 1.0;
  vec2 offset = abs(uv.yx) / vec2(warpAmount.x, warpAmount.y);
  uv = uv + uv * offset * offset;
  uv = uv * 0.5 + 0.5;
  return uv;
}

void drawVig(inout vec3 color, vec2 uv) {
  float vignette = uv.x * uv.y * (1.0 - uv.x) * (1.0 - uv.y);
  vignette = clamp(pow(abs(16.0 * vignette), 0.1), 0.0, 1.0);
  color *= vignette;
}

void main(void) {
  vec2 warpAmount = vec2(7.0, 5.0);
  vec2 res = vec2(640.0, 320.0);
  vec2 uv = gl_FragCoord.xy / resolution.xy;
  float vig = (0.0 + 1.0 * 21.0 * uv.x * uv.y * (1.0 - uv.x) * (1.0 - uv.y));
  float v = exp(-0.01 * length(uv)) * vig;
  float frameScale = 29.97;
  float frameTime = floor(time * frameScale) / frameScale;
  vec3 g = gaussgrain(frameTime) * 0.07;
  vec2 pos = mix(uv, warp(uv, warpAmount), 0.75);
  vec4 color = vec4(tri(pos, res) * mask(gl_FragCoord.xy), 1.0);
  drawVig(color.xyz, uv);
  color.xyz = toSRGB(color.xyz * 2.0) - g;
  color = mix(color, color * v, 0.7);
  fragColor = color;
}