#version 430 core
///////////////////////////////////////////////////////////////////////////////
// shader inputs/outputs
///////////////////////////////////////////////////////////////////////////////
uniform float iGlobalTime; // in seconds
uniform vec2 iResolution; // viewport resolution (in pixels) (1080p or 720p)
// all samplers have linear filtering applied, wraping set to repeat
//
uniform sampler1D iFFTTexture; // 1024
uniform float iFFT[8]; // latest frame
uniform float iFFTs[8]; // smoothed latest frame
uniform sampler2D iFFTsHistory; // smoothed fft history, 8x1024, x coord = bin, y coord n-frames earlier, y=0 is latest frame
// predefined textures
//
uniform sampler2D iTex1;
uniform sampler2D iTex2;
uniform sampler2D iTex3;
uniform sampler2D iTex4;
uniform sampler2D iNoise;
uniform sampler2D iChecker;
// out_color must be written in order to see anything
//
layout(location = 0) out vec4 out_color;
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
float m(vec3 pos){
float t=iGlobalTime;
pos *= mat3(1,0,0,0,cos(t),sin(t),0,-sin(t),cos(t));
pos = abs(fract(pos*.1-.25+vec3(iFFTs[0]*2+.9,0,0))-.5)*10;
float f = 1;
for (int i=0;i<1;i++){
pos *=1.02;
f*=1.02;
pos *= mat3(cos(t),sin(t),0,-sin(t),cos(t),0,0,0,1);
pos = pos.yzx;
pos = abs(fract(pos*.3-.25+vec3(iFFTs[0]*.4+.9,0,0))-.5)/.3;
}
pos/=f;
return length(pos-vec3(iFFT[1],iFFT[2],iFFT[3])*.4)-.6+texture(iNoise,pos.xy)*.4+texture(iNoise,pos.yz)*.3;
}
vec3 norm(vec3 pos){
vec2 v=vec2(1e-3,0);
return normalize(vec3(m(pos+v.xyy),m(pos+v.yxy),m(pos+v.yyx))-m(pos));
}
int[] test={1,31,1,0,31,0,1,31,1,0,31,5,31,0,31,1,31};
void main(void)
{
vec2 s = vec2( gl_FragCoord.xy ) / iResolution-.5;
vec3 pos =vec3(0,0,-10+fract(iGlobalTime)*4);
vec3 dir = normalize(vec3(s,1));
float sum=0;
for (int i = 0; i < 100; i++){
float di=m(pos);
pos+=dir*di;
sum+=1/max(1e-4,di);
}
ivec2 v=ivec2(gl_FragCoord.xy/30+vec2(cos(iGlobalTime),sin(iGlobalTime))*5);
v.y=20-v.y;
v.x-=10;
int v2=(test[v.x]>>v.y)&1;
out_color = v2+vec4(sum*1e-6)*dot(norm(pos),vec3(.3,.3,-.9))*abs(cos(pos).xyzz);// + uv.xyxy * 0.5 * (sin( iGlobalTime ) + 1.5);
}