#define GLSLIFY 1
uniform float time;
uniform float seed;
uniform vec2 resolution;
uniform vec2 cursor;
uniform vec2 scroll;
uniform float transition;
#define PATTERN_TIME_SCALE .8
#define LED_SIZE 2.
int octaves=10;
vec3[7]palette=vec3[](
vec3(.7,.3,.3),
vec3(.3,.7,.3),
vec3(.3,.3,.7),
vec3(.7,.7,.3),
vec3(.3,.7,.7),
vec3(.1,.1,.2),
vec3(.2,.2,.3)
);
int paletteSize=7;
float random(in vec2 st){
return fract(sin(dot(st.xy,vec2(12.9898,78.233)))*43758.5453123);
}
float perlin(in vec2 p){
vec2 ip=floor(p);
vec2 u=fract(p);
u=u*u*(3.-2.*u);
float res=mix(
mix(random(ip),random(ip+vec2(1.,0.)),u.x),
mix(random(ip+vec2(0.,1.)),random(ip+vec2(1.,1.)),u.x),u.y);
return res*res;
}
float fbm(in vec2 st){
float value=0.;
float amp=.6;
float freq=0.;
for(int i=0;i<octaves;i++){
value+=amp*perlin(st);
st*=2.1;
amp*=.35;
}
return value;
}
vec3 rgbToHsl(vec3 c){
vec4 K=vec4(0.,-1./3.,2./3.,-1.);
vec4 p=mix(vec4(c.bg,K.wz),vec4(c.gb,K.xy),step(c.b,c.g));
vec4 q=mix(vec4(p.xyw,c.r),vec4(c.r,p.yzx),step(p.x,c.r));
float d=q.x-min(q.w,q.y);
float e=1.e-10;
return vec3(abs(q.z+(q.w-q.y)/(6.*d+e)),d/(q.x+e),q.x);
}
vec3 hslToRgb(vec3 c){
vec4 K=vec4(1.,2./3.,1./3.,3.);
vec3 p=abs(fract(c.xxx+K.xyz)*6.-K.www);
return c.z*mix(K.xxx,clamp(p-K.xxx,0.,1.),c.y);
}
float pattern(in vec2 p){
float f=0.;
vec2 q=vec2(
fbm(p+time*PATTERN_TIME_SCALE*.2+vec2(0.)),
fbm(p+time*PATTERN_TIME_SCALE*.3+vec2(2.4,4.8))
);
vec2 r=vec2(
fbm(q+time*PATTERN_TIME_SCALE*.3+4.*q+vec2(3.,9.)),
fbm(q+time*PATTERN_TIME_SCALE*.2+8.*q+vec2(2.4,8.4))
);
f=fbm(p+r*2.+time*.09);
return f;
}
const float indexMatrix[4]=float[](0.,8.,
12.,4.);
float indexValue(){
float x=mod(gl_FragCoord.x,2.);
float y=mod(gl_FragCoord.y,2.);
return indexMatrix[int(x+y*2.)]/4.;
}
float hueDistance(float h1,float h2){
float diff=abs((h1-h2));
return min(abs((1.-diff)),diff);
}
vec3[2]closestColors(float hue){
vec3 closest=vec3(-2.,0.,0.);
vec3 secondClosest=vec3(-2.,0.,0.);
vec3 temp;
for(int i=0;i<paletteSize;++i){
temp=rgbToHsl(palette[i]);
float tempDistance=hueDistance(temp.x,hue);
if(tempDistance<hueDistance(closest.x,hue)){
secondClosest=closest;
closest=temp;
}else{
if(tempDistance<hueDistance(secondClosest.x,hue)){
secondClosest=temp;
}
}
}
return vec3[2](
closest,secondClosest
);;
}
vec3 dither(vec3 color){
vec3 hsl=rgbToHsl(color);
vec3[2]cs=closestColors(hsl.x);
float d=indexValue();
float hueDiff=hueDistance(hsl.x,cs[0].x)/hueDistance(cs[1].x,cs[0].x);
return hslToRgb(hueDiff<d?cs[0]:cs[1]);
}
void show(inout vec4 col,inout vec2 uv){
float r=pattern(uv/94.+3825.235);
float g=pattern(uv/87.-23.253);
float b=pattern(uv/93.+2353.2);
col=vec4(vec3(r,g,b),1.);
}
void dither(inout vec4 col,inout vec2 uv){
vec2 pixel=mod(floor(uv/LED_SIZE),8.)/8.;
float factor=1.3;
vec3 oCol=col.rgb;
oCol=dither(oCol);
col=vec4(oCol,1.);
}
void main(){
vec2 aspect=vec2(1.,resolution.y/resolution.x);
vec4 col=vec4(0.,0.,0.,1.);
vec2 uv=gl_FragCoord.xy;
show(col,uv);
dither(col,uv);
gl_FragColor=col;
}