Josip Å tajdohar

Disco without raymarching fragment code:


                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);
                }