uniform sampler2D tDiffuse;
uniform float iTime;
uniform vec2 iResolution;
varying vec2 sv;
#define pi acos(-1.)
#define aTime 0.2 * iTime
#define darknessWidth 0.01
#define fractCount 10.0
#define color1 vec3(0.8, 0.4, 0.8)
#define color2 vec3(0.2, 0.6, 0.8)
#define lightsColor vec3(0.8, 0.1, 0.5)
float Hash21(vec2 p)
{
p = fract(p * vec2(234.56, 431.987));
p += dot(p, p + 65.89);
return fract(p.x*p.y);
}
float DiracDelta(float x, float a)
{
return 1.0/(a * sqrt(pi)) * exp( - pow(x/a, 2.0));
}
float TruchetLine(vec2 uv, float width, float tileNoise, out vec2 tUv)
{
uv.x *= mix(-1.0, 1.0, step(0.5, tileNoise));
vec2 circleUV = uv - sign(uv.x + uv.y) * 0.5;
float lineDist = abs(uv.x + uv.y);
float dist = abs(lineDist - 0.5);
float mask = smoothstep(0.01, -0.01, dist - width);
float angle = atan(circleUV.x, circleUV.y); // -pi to pi
tUv.x = fract(angle/(0.5 * pi));// * checker + 1.0)*0.5; // - 1 to 1
tUv.y = abs((lineDist - (0.5 - width))/(2.0 * width) - 0.5) * 2.0;
return mask;
}
float TruchetCircle(vec2 uv, float width, float tileNoise, out vec2 tUv)
{
uv.x *= mix(-1.0, 1.0, step(0.5, tileNoise));
vec2 circleUV = uv - sign(uv.x + uv.y) * 0.5;
float circleDist = length(circleUV);
float dist = abs(circleDist - 0.5);
float mask = smoothstep(0.01, -0.01, dist - width);
float angle = atan(circleUV.x, circleUV.y); // -pi to pi
tUv.x = fract(angle/(0.5 * pi));// * checker + 1.0)*0.5; // - 1 to 1
tUv.y = abs((circleDist - (0.5 - width))/(2.0 * width) - 0.5) * 2.0;
return mask;
}
vec3 MoveAlongBars(vec2 uv, float checker, float time, vec3 baseCol)
{
float brightness = 0.8;
float stime = 2.0 + sin(time * 3.0 * pi);
// uv *= 2.0 * pi;
// float id = floor(uv.x);
//uv = fract(uv * 0.5);
brightness += sin(3.4 * uv.y + stime) * 0.8; //uv.x * 0.1 / (sin(pi * uv.y * 3.0) * sin(pi * time + id));
//brightness += cos(fract(uv.x * checker + time) * pi);
brightness += pow(fract(uv.x * checker + 3.0 * time), 10.0);
//brightness += uv.y * 0.01 / (sin(pi * uv.x * 0.01) * sin(pi * time + id));
return baseCol * brightness;
}
void main()
{
// Normalized pixel coordinates (from 0 to 1)
vec2 uv = (sv - 0.5) * iResolution.xy / iResolution.y;
vec2 fv = uv;
fv.y = abs(fv.y);
//fv.x = mix(fv.x, 0.0, /*abs(sv.y - 0.5)*/fv.y * iResolution.y / iResolution.x);
fv.x /= 5.0 * fv.y;
vec3 debug = abs(vec3(sv.y - 0.5));
fv.y /= 0.25 * pow(fv.y, 0.75);
//fv.y /= 0.65 * sqrt(fv.y);
//fv.y = mix(5.0 * fv.y, 0.0, fv.y);
//fv.y /= 0.002 * abs(sv.y - 0.5);
//fv.y = mix(sqrt(10.0 * fv.y), 0.0, fv.y);
fv *= fractCount;
vec2 tileId = floor(fv);
float tileNoise = Hash21(tileId);
float checker = mod(tileId.x + tileId.y, 2.0) * 2.0 - 1.0;
fv = fract(fv) - 0.5;
vec2 tUv = vec2(0.0);
vec2 tUvCircle = vec2(0.0);
vec2 tUvLine = vec2(0.0);
float mask = 0.0;
float maskCircle = 0.0;
float maskLine = 0.0;
float time = 1.45 * iTime;
float upDown = step(sign(uv.y), 0.0);
float inverseUpDown = abs(upDown - 1.0);
vec3 truchetColor = mix(color1, color2, upDown);
vec3 tileColor = mix(color1, color2, inverseUpDown);
float onOfHalfTime = mix(0.0, 1.0, max(0.0, sign(sin(time * 0.5))));
float onOfQuarterTime = mix(0.0, 1.0, max(0.0, sign(sin(time * 0.25))));
float inverseOnOfHalfTime = abs(onOfHalfTime - 1.0);
tileColor *= 3.0 * DiracDelta(fract(time * 3.0) + 0.5, 0.5) * checker * inverseOnOfHalfTime;
// Time varying pixel color
maskCircle = TruchetCircle(fv, 0.1, tileNoise, tUvCircle);
maskLine = TruchetLine(fv, 0.2, tileNoise, tUvLine);
float switchUpDown = sign(onOfQuarterTime * 2.0 - 1.0);
float upMask = step(darknessWidth, switchUpDown * uv.y);
float downMask = step(switchUpDown * uv.y, -darknessWidth);
mask = mix(maskLine, maskCircle, onOfQuarterTime);
tUv = mix(tUvLine, tUvCircle, onOfQuarterTime);
vec3 colUP = vec3(tUv.x, tUv.y, 0.0) * mask;
colUP = MoveAlongBars(tUv, checker, time, truchetColor) * mask;
//colUP += tileColor * pow(sin(time), 16.0) * clamp(0.0, 1.0, checker) * (1.0 - mask);
//colUP += mix(0.0, 1.0, pow(0.8 + 0.5 * sin(time), 8.0)) * tileColor * clamp(0.0, 1.0, checker) * (1.0 - mask);
colUP += tileColor * (1.0 - mask);
vec3 colDown = vec3(tUv.x, tUv.y, 0.0) * mask;
colDown = MoveAlongBars(tUv, checker, time, truchetColor) * mask;
colDown += tileColor * (1.0 - mask);
//colDown = vec3(checker);
vec3 col = vec3(0.0);
col += colUP * upMask;
col += colDown * downMask;
col = clamp(col, vec3(0.0), vec3(1.0));
vec2 lightUV = uv;
lightUV.x -= 0.6;
float amp = 0.0;
for(float i = 0.0; i <5.0; i++)
{
amp = 0.05 * pow(sin(5.0 * time + i * 1.23), 2.0);
col += amp/pow(length(lightUV), 0.7) * sin(lightsColor * (i + 1.0));// * onOfHalfTime;
lightUV.x += 0.3;
}
// lightUV = uv;
// lightUV.y -= 0.4;
// for(float i = 0.0; i < 5.0; i++)
// {
// amp = 0.02 * pow(sin(5.0 * time + i * pi * 0.20), 2.0);
// col += amp/pow(length(lightUV), 0.7) * sin(lightsColor * (i + 1.0));// * onOfHalfTime;
// lightUV.y += 0.25;
// }
col *= (1.0 - 0.8 * length(sv - vec2(0.5)));
//col = vec3(1.0 - 0.8 * length(sv - vec2(0.5)));
// if(fv.x > 0.45) col = vec3(1.0, 0.0, 0.0);
// if(fv.y > 0.45) col = vec3(1.0, 0.0, 0.0);
gl_FragColor = vec4(col, 1.0);
}