#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;
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void main(void)
{
vec2 uv = vec2( gl_FragCoord.xy ) / iResolution;
vec2 uv5 = uv - 0.5;
uv5.y*=0.6;
vec2 uvo=uv5;
vec2 m;
m.x = atan(uv5.x / uv5.y);
m.y = length(uv5);
float f = texture( iFFTTexture, m.y ).r * 1000;
m.y -= iGlobalTime;
vec4 t = texture( iChecker, m.xy );
//öout_color = f + t;// + uv.xyxy * 0.5 * (sin( iGlobalTime ) + 1.5);
out_color = texture2D(iChecker,uv+vec2(1.0+iGlobalTime,-1.0))*iFFT[0]*2.0*vec4(.9,.4,.1,1.0);
uv5*=(.5+length(uv5)*2.0);
uv5.x+=sin(uv5.y*iFFT[1]+iGlobalTime*.2);
uv5.y+=sin(uv5.x*iFFT[2]+iGlobalTime*.1);
uv5.x /= (1.5+sin(iGlobalTime)+uv5.y);
float tt = iGlobalTime *.5 + pow(iFFT[0],4.0)*1.0;
uv5 *= mat2(cos(tt),sin(tt),-sin(tt),cos(tt));
vec3 color = vec3(iFFT[0]+iFFT[1]+iFFT[2],iFFT[3]+iFFT[4],iFFT[5]+iFFT[7]+iFFT[6]) * vec3(.5,.6,1.9);
color = normalize(color)*6.0;
float amp = iFFTs[0]+.2;
amp*=amp*4.0*amp;
uv5 *= 1.0 + amp*2.0;
vec4 s = texture2D(iFFTsHistory,uv5).x * vec4(color,1.0);
s += texture2D(iNoise,gl_FragCoord.xy*(1.0+amp))*0.6;
out_color = s*amp + amp*.6;
out_color += vec4(length(out_color*vec4(1.,0.7,2.,.0)))*1.0 - vec4(length(uvo))*1.5;
}