{
  "history": [
    {
      "breakpoints": [],
      "visible": true,
      "aspectRatio": 1,
      "userDownsample": 0.25,
      "layerType": "effect",
      "type": "gradient",
      "usesPingPong": false,
      "speed": 0.25,
      "trackMouse": 0,
      "trackAxes": "xy",
      "mouseMomentum": 0,
      "texture": false,
      "animating": false,
      "isMask": 0,
      "compiledFragmentShaders": [
        "#version 300 es\nprecision highp float;in vec2 vTextureCoord;uniform vec2 uMousePos;vec3 getColor(int index) { switch(index) { case 0: return vec3(0, 0, 0); case 1: return vec3(0, 0, 0); case 2: return vec3(0, 0, 0); case 3: return vec3(0, 0, 0); case 4: return vec3(0, 0, 0); case 5: return vec3(0, 0, 0); case 6: return vec3(0, 0, 0); case 7: return vec3(0, 0, 0); case 8: return vec3(0, 0, 0); case 9: return vec3(0, 0, 0); case 10: return vec3(0, 0, 0); case 11: return vec3(0, 0, 0); case 12: return vec3(0, 0, 0); case 13: return vec3(0, 0, 0); case 14: return vec3(0, 0, 0); case 15: return vec3(0, 0, 0); default: return vec3(0.0); } }const float PI = 3.14159265;vec2 rotate(vec2 coord, float angle) { float s = sin(angle); float c = cos(angle); return vec2( coord.x * c - coord.y * s, coord.x * s + coord.y * c ); }out vec4 fragColor;vec3 getColor(vec2 uv) {return vec3(0, 0, 0); }void main() {vec2 uv = vTextureCoord; vec2 pos = vec2(0.5, 0.5) + mix(vec2(0), (uMousePos-0.5), 0.0000); uv -= pos; uv /= (0.5000*2.); uv = rotate(uv, (0.0000 - 0.5) * 2. * PI); vec4 color = vec4(getColor(uv), 1.); fragColor = color; }"
      ],
      "compiledVertexShaders": [
        "#version 300 es\nprecision mediump float;in vec3 aVertexPosition; in vec2 aTextureCoord;uniform mat4 uMVMatrix; uniform mat4 uPMatrix;out vec2 vTextureCoord; out vec3 vVertexPosition;void main() { gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0); vTextureCoord = aTextureCoord; }"
      ],
      "data": {
        "downSample": 0.5,
        "depth": false,
        "uniforms": {},
        "isBackground": true
      },
      "id": "effect"
    },
    {
      "breakpoints": [],
      "visible": true,
      "aspectRatio": 1,
      "userDownsample": 0.5,
      "layerType": "effect",
      "type": "beam",
      "usesPingPong": false,
      "speed": 0.08,
      "trackMouse": 0,
      "trackAxes": "xy",
      "mouseMomentum": 0,
      "texture": false,
      "animating": true,
      "isMask": 0,
      "compiledFragmentShaders": [
        "#version 300 es\nprecision highp float; precision highp int;in vec2 vTextureCoord;uniform sampler2D uTexture;uniform float uTime;uniform vec2 uMousePos; uniform vec2 uResolution; vec3 blend (int blendMode, vec3 src, vec3 dst) { return src; }uvec2 pcg2d(uvec2 v) { v = v * 1664525u + 1013904223u; v.x += v.y * v.y * 1664525u + 1013904223u; v.y += v.x * v.x * 1664525u + 1013904223u; v ^= v >> 16; v.x += v.y * v.y * 1664525u + 1013904223u; v.y += v.x * v.x * 1664525u + 1013904223u; return v; }float randFibo(vec2 p) { uvec2 v = floatBitsToUint(p); v = pcg2d(v); uint r = v.x ^ v.y; return float(r) / float(0xffffffffu); }vec3 Tonemap_tanh(vec3 x) { x = clamp(x, -40.0, 40.0); return (exp(x) - exp(-x)) / (exp(x) + exp(-x)); }out vec4 fragColor;const float PI = 3.14159265359; const float TWO_PI = 2.0 * PI;float luma(vec3 color) { return dot(color, vec3(0.299, 0.587, 0.114)); }mat2 rot(float a) { return mat2(cos(a),-sin(a),sin(a),cos(a)); }vec3 drawExpandingRings(vec2 uv, vec2 center, float scale, float angle) { uv.x *= uResolution.x/uResolution.y; center.x *= uResolution.x/uResolution.y; vec2 skew = vec2(0.3900, 1. - 0.3900) * 2.; uv = uv * rot(0.0000 * TWO_PI) * skew; center = center * rot(0.0000 * TWO_PI) * skew; float modulo = fract(uTime * 0.02 + 1.0000); float ringRadius = scale * 0.5 * modulo; float distFromCenter = length(uv - center); float ringDist = abs(distFromCenter - ringRadius); float lineRadius = 0.2200 * modulo; float brightness = lineRadius / (1.0 - smoothstep(0.2, 0.002, ringDist + 0.02));brightness = brightness * max(0., 1.-modulo);vec3 ringColor = brightness * pow(1.-ringDist, 3.) * vec3(0.7176470588235294, 0.7176470588235294, 0.7176470588235294); return ringColor; }vec3 getBeam(vec2 uv) { vec2 pos = vec2(0.5, 0.03728222996515684) + mix(vec2(0), (uMousePos-0.5), 0.0000); return drawExpandingRings(uv, pos, 0.7700, 0.0000); }void main() { vec2 uv = vTextureCoord; vec4 bg = texture(uTexture, uv);vec3 beam = getBeam(uv); float dither = (randFibo(gl_FragCoord.xy) - 0.5) / 255.0;vec3 blended = blend(0, Tonemap_tanh(beam), bg.rgb); vec3 result = mix(bg.rgb, blended, 0.2000); result += dither;vec4 color = vec4(result, max(bg.a, luma(beam))); fragColor = color;}"
      ],
      "compiledVertexShaders": [
        "#version 300 es\nprecision mediump float;in vec3 aVertexPosition; in vec2 aTextureCoord;uniform mat4 uMVMatrix; uniform mat4 uPMatrix; uniform mat4 uTextureMatrix;out vec2 vTextureCoord; out vec3 vVertexPosition;void main() { gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0); vTextureCoord = (uTextureMatrix * vec4(aTextureCoord, 0.0, 1.0)).xy; }"
      ],
      "data": { "depth": false, "uniforms": {}, "isBackground": false },
      "id": "effect1"
    },
    {
      "breakpoints": [],
      "visible": true,
      "aspectRatio": 1,
      "userDownsample": 0.5,
      "layerType": "effect",
      "type": "beam",
      "usesPingPong": false,
      "speed": 0.06,
      "trackMouse": 0,
      "trackAxes": "xy",
      "mouseMomentum": 0,
      "texture": false,
      "animating": true,
      "isMask": 0,
      "compiledFragmentShaders": [
        "#version 300 es\nprecision highp float; precision highp int;in vec2 vTextureCoord;uniform sampler2D uTexture;uniform float uTime;uniform vec2 uMousePos; uniform vec2 uResolution; vec3 blend (int blendMode, vec3 src, vec3 dst) { return src; }uvec2 pcg2d(uvec2 v) { v = v * 1664525u + 1013904223u; v.x += v.y * v.y * 1664525u + 1013904223u; v.y += v.x * v.x * 1664525u + 1013904223u; v ^= v >> 16; v.x += v.y * v.y * 1664525u + 1013904223u; v.y += v.x * v.x * 1664525u + 1013904223u; return v; }float randFibo(vec2 p) { uvec2 v = floatBitsToUint(p); v = pcg2d(v); uint r = v.x ^ v.y; return float(r) / float(0xffffffffu); }vec3 Tonemap_tanh(vec3 x) { x = clamp(x, -40.0, 40.0); return (exp(x) - exp(-x)) / (exp(x) + exp(-x)); }out vec4 fragColor;const float PI = 3.14159265359; const float TWO_PI = 2.0 * PI;float luma(vec3 color) { return dot(color, vec3(0.299, 0.587, 0.114)); }mat2 rot(float a) { return mat2(cos(a),-sin(a),sin(a),cos(a)); }vec3 drawExpandingRings(vec2 uv, vec2 center, float scale, float angle) { uv.x *= uResolution.x/uResolution.y; center.x *= uResolution.x/uResolution.y; vec2 skew = vec2(0.4000, 1. - 0.4000) * 2.; uv = uv * rot(0.0000 * TWO_PI) * skew; center = center * rot(0.0000 * TWO_PI) * skew; float modulo = fract(uTime * 0.02 + 1.0000); float ringRadius = scale * 0.5 * modulo; float distFromCenter = length(uv - center); float ringDist = abs(distFromCenter - ringRadius); float lineRadius = 0.2200 * modulo; float brightness = lineRadius / (1.0 - smoothstep(0.2, 0.002, ringDist + 0.02));brightness = brightness * max(0., 1.-modulo);vec3 ringColor = brightness * pow(1.-ringDist, 3.) * vec3(0.39215686274509803, 0.39215686274509803, 0.39215686274509803); return ringColor; }vec3 getBeam(vec2 uv) { vec2 pos = vec2(0.5, 0.03728222996515684) + mix(vec2(0), (uMousePos-0.5), 0.0000); return drawExpandingRings(uv, pos, 0.5200, 0.0000); }void main() { vec2 uv = vTextureCoord; vec4 bg = texture(uTexture, uv);vec3 beam = getBeam(uv); float dither = (randFibo(gl_FragCoord.xy) - 0.5) / 255.0;vec3 blended = blend(0, Tonemap_tanh(beam), bg.rgb); vec3 result = mix(bg.rgb, blended, 0.2400); result += dither;vec4 color = vec4(result, max(bg.a, luma(beam))); fragColor = color;}"
      ],
      "compiledVertexShaders": [
        "#version 300 es\nprecision mediump float;in vec3 aVertexPosition; in vec2 aTextureCoord;uniform mat4 uMVMatrix; uniform mat4 uPMatrix; uniform mat4 uTextureMatrix;out vec2 vTextureCoord; out vec3 vVertexPosition;void main() { gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0); vTextureCoord = (uTextureMatrix * vec4(aTextureCoord, 0.0, 1.0)).xy; }"
      ],
      "data": { "depth": false, "uniforms": {}, "isBackground": false },
      "id": "effect2"
    },
    {
      "breakpoints": [],
      "visible": true,
      "aspectRatio": 1,
      "userDownsample": 0.5,
      "layerType": "effect",
      "type": "stretch",
      "usesPingPong": false,
      "trackMouse": 0,
      "trackAxes": "xy",
      "mouseMomentum": 0,
      "texture": false,
      "animating": false,
      "isMask": 0,
      "compiledFragmentShaders": [
        "#version 300 es\nprecision mediump float; in vec3 vVertexPosition; in vec2 vTextureCoord; uniform sampler2D uTexture; uniform vec2 uMousePos; uniform vec2 uResolution; float ease (int easingFunc, float t) { return t == 0.0 ? 0.0 : t == 1.0 ? 1.0 : t < 0.5 ? pow(2.0, (20.0 * t) - 10.0) / 2.0 : (2.0 - pow(2.0, -20.0 * t + 10.0)) / 2.0; }out vec4 fragColor;vec2 rotate(vec2 v, float angle) { float c = cos(angle); float s = sin(angle); return vec2(v.x * c - v.y * s, v.x * s + v.y * c); }vec3 chromatic_aberration(vec3 color, vec2 uv, float amount) { vec2 offset = normalize(vTextureCoord - 0.5) * amount / vec2(uResolution.x/uResolution.y, 1); vec4 left = texture(uTexture, uv - offset); vec4 right = texture(uTexture, uv + offset);color.r = left.r; color.b = right.b;return color; }void main() { vec2 uv = vTextureCoord; float angle = (0.5000 - 0.25) * -6.28318530718; float stretchX = vec2(1.41, 20).x * 4. * 1.8400; float stretchY = vec2(1.41, 20).y * 4. * 1.8400;vec2 pos = vec2(0.5, 0.401) + (uMousePos - 0.5) * 0.0000; vec2 offset = uv - pos; vec2 rotatedOffset = rotate(offset, -angle); vec2 stretchedOffset = rotatedOffset; if (1 == 1) { if (rotatedOffset.x > 0.0) { float stretchIntensity = rotatedOffset.x; float easedIntensity = ease(18, stretchIntensity); stretchedOffset.x = rotatedOffset.x / (1.0 + stretchX * easedIntensity); stretchedOffset.y = rotatedOffset.y / (1.0 + stretchY * easedIntensity * easedIntensity); } } else if (1 == 2) { float stretchIntensity = abs(rotatedOffset.x); float easedIntensity = ease(18, stretchIntensity); stretchedOffset.x = sign(rotatedOffset.x) * stretchIntensity / (1.0 + stretchX * easedIntensity); stretchedOffset.y = rotatedOffset.y / (1.0 + stretchY * easedIntensity * easedIntensity); } vec2 finalOffset = rotate(stretchedOffset, angle); vec2 st = pos + finalOffset; vec4 color = texture(uTexture, st);color.rgb = chromatic_aberration(color.rgb, st, length(st - uv) * 0.05 * 0.0000); fragColor = color;}"
      ],
      "compiledVertexShaders": [
        "#version 300 es\nprecision mediump float;in vec3 aVertexPosition; in vec2 aTextureCoord;uniform mat4 uMVMatrix; uniform mat4 uPMatrix; uniform mat4 uTextureMatrix;out vec2 vTextureCoord; out vec3 vVertexPosition;void main() { gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0); vTextureCoord = (uTextureMatrix * vec4(aTextureCoord, 0.0, 1.0)).xy; }"
      ],
      "data": { "depth": false, "uniforms": {}, "isBackground": false },
      "id": "effect3"
    },
    {
      "breakpoints": [],
      "visible": true,
      "aspectRatio": 1,
      "userDownsample": 0.5,
      "layerType": "effect",
      "type": "bloom",
      "usesPingPong": false,
      "texture": false,
      "animating": false,
      "mouseMomentum": 0,
      "isMask": 0,
      "compiledFragmentShaders": [
        "#version 300 es\nprecision highp float; precision highp int;in vec3 vVertexPosition; in vec2 vTextureCoord;uniform sampler2D uTexture;out vec4 fragColor;float luma(vec4 color) { return dot(color.rgb, vec3(0.299, 0.587, 0.114)); }vec4 thresholdPass(vec4 color) { color.rgb = pow(color.rgb, vec3(1.0/2.2)); color.rgb = 1.2 * (color.rgb - 0.5) + 0.5; vec4 bloom = color * smoothstep(0.0000 - 0.1, 0.0000, luma(color)); return vec4(bloom.rgb, color.a); }vec4 getColor(vec4 color) { return thresholdPass(color); }void main() { vec2 uv = vTextureCoord; vec4 color = texture(uTexture, uv); fragColor = getColor(color); }",
        "#version 300 es\nprecision highp float; precision highp int;in vec3 vVertexPosition; in vec2 vTextureCoord;uniform sampler2D uTexture;uniform vec2 uResolution;out vec4 fragColor;float getExponentialWeight(int index) { switch(index) { case 0: return 1.0000000000; case 1: return 0.7165313106; case 2: return 0.5134171190; case 3: return 0.3678794412; case 4: return 0.2636050919; case 5: return 0.1888756057; case 6: return 0.1353352832; case 7: return 0.0969670595; case 8: return 0.0694877157; default: return 0.0; } }vec4 blur(vec2 uv, bool vertical, float radius, bool diamond) { vec4 color = vec4(0.0); float total_weight = 0.0; float aspectRatio = uResolution.x/uResolution.y;vec2 dir; if (diamond) { dir = vertical ? vec2(1, 1) : vec2(1, -1); } else { dir = vertical ? vec2(0, 1) : vec2(1, 0); } dir *= vec2(0.5000, 1. - 0.5000); dir.x /= aspectRatio; vec4 center = texture(uTexture, uv); float center_weight = getExponentialWeight(0); color += center * center_weight; total_weight += center_weight;radius *= 1.0000; for (int i = 1; i <= 8; i++) { float weight = getExponentialWeight(i); float offset = mix(0.015, 0.025, radius) * float(i)/8.; vec4 sample1 = texture(uTexture, uv + offset * dir); vec4 sample2 = texture(uTexture, uv - offset * dir); color += (sample1 + sample2) * weight; total_weight += 2.0 * weight; }return color / total_weight; }vec4 blurPass(vec2 uv, bool vertical, float radius, float intensity, bool diamond) { return blur(uv, vertical, radius, diamond); }vec4 getColor(vec4 color) { return blurPass(vTextureCoord, false, 40., 1.25, true); }void main() { vec2 uv = vTextureCoord; vec4 color = texture(uTexture, uv); fragColor = getColor(color); }",
        "#version 300 es\nprecision highp float; precision highp int;in vec3 vVertexPosition; in vec2 vTextureCoord;uniform sampler2D uTexture; uniform sampler2D uBgTexture;uniform vec2 uResolution;out vec4 fragColor;float luma(vec4 color) { return dot(color.rgb, vec3(0.299, 0.587, 0.114)); }float getExponentialWeight(int index) { switch(index) { case 0: return 1.0000000000; case 1: return 0.7165313106; case 2: return 0.5134171190; case 3: return 0.3678794412; case 4: return 0.2636050919; case 5: return 0.1888756057; case 6: return 0.1353352832; case 7: return 0.0969670595; case 8: return 0.0694877157; default: return 0.0; } }vec4 blur(vec2 uv, bool vertical, float radius, bool diamond) { vec4 color = vec4(0.0); float total_weight = 0.0; float aspectRatio = uResolution.x/uResolution.y;vec2 dir; if (diamond) { dir = vertical ? vec2(1, 1) : vec2(1, -1); } else { dir = vertical ? vec2(0, 1) : vec2(1, 0); } dir *= vec2(0.5000, 1. - 0.5000); dir.x /= aspectRatio; vec4 center = texture(uTexture, uv); float center_weight = getExponentialWeight(0); color += center * center_weight; total_weight += center_weight;radius *= 1.0000; for (int i = 1; i <= 8; i++) { float weight = getExponentialWeight(i); float offset = mix(0.015, 0.025, radius) * float(i)/8.; vec4 sample1 = texture(uTexture, uv + offset * dir); vec4 sample2 = texture(uTexture, uv - offset * dir); color += (sample1 + sample2) * weight; total_weight += 2.0 * weight; }return color / total_weight; }vec4 thresholdPass(vec4 color) { color.rgb = pow(color.rgb, vec3(1.0/2.2)); color.rgb = 1.2 * (color.rgb - 0.5) + 0.5; vec4 bloom = color * smoothstep(0.0000 - 0.1, 0.0000, luma(color)); return vec4(bloom.rgb, color.a); }vec4 blurCombinePass(vec2 uv, bool vertical, float radius, float intensity, bool diamond) { vec4 blurred = blur(uv, vertical, radius, diamond); return (thresholdPass(texture(uBgTexture, uv)) * 0.5 + blurred * intensity); }vec4 getColor(vec4 color) { return blurCombinePass(vTextureCoord, true, 40., 1.25, true); }void main() { vec2 uv = vTextureCoord; vec4 color = texture(uTexture, uv); fragColor = getColor(color); }",
        "#version 300 es\nprecision highp float; precision highp int;in vec3 vVertexPosition; in vec2 vTextureCoord;uniform sampler2D uTexture;uniform vec2 uResolution;out vec4 fragColor;float getExponentialWeight(int index) { switch(index) { case 0: return 1.0000000000; case 1: return 0.7165313106; case 2: return 0.5134171190; case 3: return 0.3678794412; case 4: return 0.2636050919; case 5: return 0.1888756057; case 6: return 0.1353352832; case 7: return 0.0969670595; case 8: return 0.0694877157; default: return 0.0; } }vec4 blur(vec2 uv, bool vertical, float radius, bool diamond) { vec4 color = vec4(0.0); float total_weight = 0.0; float aspectRatio = uResolution.x/uResolution.y;vec2 dir; if (diamond) { dir = vertical ? vec2(1, 1) : vec2(1, -1); } else { dir = vertical ? vec2(0, 1) : vec2(1, 0); } dir *= vec2(0.5000, 1. - 0.5000); dir.x /= aspectRatio; vec4 center = texture(uTexture, uv); float center_weight = getExponentialWeight(0); color += center * center_weight; total_weight += center_weight;radius *= 1.0000; for (int i = 1; i <= 8; i++) { float weight = getExponentialWeight(i); float offset = mix(0.015, 0.025, radius) * float(i)/8.; vec4 sample1 = texture(uTexture, uv + offset * dir); vec4 sample2 = texture(uTexture, uv - offset * dir); color += (sample1 + sample2) * weight; total_weight += 2.0 * weight; }return color / total_weight; }vec4 blurPass(vec2 uv, bool vertical, float radius, float intensity, bool diamond) { return blur(uv, vertical, radius, diamond); }vec4 getColor(vec4 color) { return blurPass(vTextureCoord, false, 15., 1.1, true); }void main() { vec2 uv = vTextureCoord; vec4 color = texture(uTexture, uv); fragColor = getColor(color); }",
        "#version 300 es\nprecision highp float; precision highp int;in vec3 vVertexPosition; in vec2 vTextureCoord;uniform sampler2D uTexture; uniform sampler2D uBgTexture;uniform vec2 uResolution;out vec4 fragColor;float luma(vec4 color) { return dot(color.rgb, vec3(0.299, 0.587, 0.114)); }float getExponentialWeight(int index) { switch(index) { case 0: return 1.0000000000; case 1: return 0.7165313106; case 2: return 0.5134171190; case 3: return 0.3678794412; case 4: return 0.2636050919; case 5: return 0.1888756057; case 6: return 0.1353352832; case 7: return 0.0969670595; case 8: return 0.0694877157; default: return 0.0; } }vec4 blur(vec2 uv, bool vertical, float radius, bool diamond) { vec4 color = vec4(0.0); float total_weight = 0.0; float aspectRatio = uResolution.x/uResolution.y;vec2 dir; if (diamond) { dir = vertical ? vec2(1, 1) : vec2(1, -1); } else { dir = vertical ? vec2(0, 1) : vec2(1, 0); } dir *= vec2(0.5000, 1. - 0.5000); dir.x /= aspectRatio; vec4 center = texture(uTexture, uv); float center_weight = getExponentialWeight(0); color += center * center_weight; total_weight += center_weight;radius *= 1.0000; for (int i = 1; i <= 8; i++) { float weight = getExponentialWeight(i); float offset = mix(0.015, 0.025, radius) * float(i)/8.; vec4 sample1 = texture(uTexture, uv + offset * dir); vec4 sample2 = texture(uTexture, uv - offset * dir); color += (sample1 + sample2) * weight; total_weight += 2.0 * weight; }return color / total_weight; }vec4 thresholdPass(vec4 color) { color.rgb = pow(color.rgb, vec3(1.0/2.2)); color.rgb = 1.2 * (color.rgb - 0.5) + 0.5; vec4 bloom = color * smoothstep(0.0000 - 0.1, 0.0000, luma(color)); return vec4(bloom.rgb, color.a); }vec4 blurCombinePass(vec2 uv, bool vertical, float radius, float intensity, bool diamond) { vec4 blurred = blur(uv, vertical, radius, diamond); return (thresholdPass(texture(uBgTexture, uv)) * 0.5 + blurred * intensity); }vec4 getColor(vec4 color) { return blurCombinePass(vTextureCoord, true, 15., 1.1, true); }void main() { vec2 uv = vTextureCoord; vec4 color = texture(uTexture, uv); fragColor = getColor(color); }",
        "#version 300 es\nprecision highp float; precision highp int;in vec3 vVertexPosition; in vec2 vTextureCoord;uniform sampler2D uTexture;uniform vec2 uResolution;out vec4 fragColor;float getExponentialWeight(int index) { switch(index) { case 0: return 1.0000000000; case 1: return 0.7165313106; case 2: return 0.5134171190; case 3: return 0.3678794412; case 4: return 0.2636050919; case 5: return 0.1888756057; case 6: return 0.1353352832; case 7: return 0.0969670595; case 8: return 0.0694877157; default: return 0.0; } }vec4 blur(vec2 uv, bool vertical, float radius, bool diamond) { vec4 color = vec4(0.0); float total_weight = 0.0; float aspectRatio = uResolution.x/uResolution.y;vec2 dir; if (diamond) { dir = vertical ? vec2(1, 1) : vec2(1, -1); } else { dir = vertical ? vec2(0, 1) : vec2(1, 0); } dir *= vec2(0.5000, 1. - 0.5000); dir.x /= aspectRatio; vec4 center = texture(uTexture, uv); float center_weight = getExponentialWeight(0); color += center * center_weight; total_weight += center_weight;radius *= 1.0000; for (int i = 1; i <= 8; i++) { float weight = getExponentialWeight(i); float offset = mix(0.015, 0.025, radius) * float(i)/8.; vec4 sample1 = texture(uTexture, uv + offset * dir); vec4 sample2 = texture(uTexture, uv - offset * dir); color += (sample1 + sample2) * weight; total_weight += 2.0 * weight; }return color / total_weight; }vec4 blurPass(vec2 uv, bool vertical, float radius, float intensity, bool diamond) { return blur(uv, vertical, radius, diamond); }vec4 getColor(vec4 color) { return blurPass(vTextureCoord, false, 7.5, 1., false); }void main() { vec2 uv = vTextureCoord; vec4 color = texture(uTexture, uv); fragColor = getColor(color); }",
        "#version 300 es\nprecision highp float; precision highp int;in vec3 vVertexPosition; in vec2 vTextureCoord;uniform sampler2D uTexture;uniform vec2 uResolution;out vec4 fragColor;float getExponentialWeight(int index) { switch(index) { case 0: return 1.0000000000; case 1: return 0.7165313106; case 2: return 0.5134171190; case 3: return 0.3678794412; case 4: return 0.2636050919; case 5: return 0.1888756057; case 6: return 0.1353352832; case 7: return 0.0969670595; case 8: return 0.0694877157; default: return 0.0; } }vec4 blur(vec2 uv, bool vertical, float radius, bool diamond) { vec4 color = vec4(0.0); float total_weight = 0.0; float aspectRatio = uResolution.x/uResolution.y;vec2 dir; if (diamond) { dir = vertical ? vec2(1, 1) : vec2(1, -1); } else { dir = vertical ? vec2(0, 1) : vec2(1, 0); } dir *= vec2(0.5000, 1. - 0.5000); dir.x /= aspectRatio; vec4 center = texture(uTexture, uv); float center_weight = getExponentialWeight(0); color += center * center_weight; total_weight += center_weight;radius *= 1.0000; for (int i = 1; i <= 8; i++) { float weight = getExponentialWeight(i); float offset = mix(0.015, 0.025, radius) * float(i)/8.; vec4 sample1 = texture(uTexture, uv + offset * dir); vec4 sample2 = texture(uTexture, uv - offset * dir); color += (sample1 + sample2) * weight; total_weight += 2.0 * weight; }return color / total_weight; }vec4 blurPass(vec2 uv, bool vertical, float radius, float intensity, bool diamond) { return blur(uv, vertical, radius, diamond); }vec4 getColor(vec4 color) { return blurPass(vTextureCoord, true, 7.5, 1., false); }void main() { vec2 uv = vTextureCoord; vec4 color = texture(uTexture, uv); fragColor = getColor(color); }",
        "#version 300 es\nprecision highp float; precision highp int;in vec3 vVertexPosition; in vec2 vTextureCoord;uniform sampler2D uTexture; uniform sampler2D uBgTexture;uvec2 pcg2d(uvec2 v) { v = v * 1664525u + 1013904223u; v.x += v.y * v.y * 1664525u + 1013904223u; v.y += v.x * v.x * 1664525u + 1013904223u; v ^= v >> 16; v.x += v.y * v.y * 1664525u + 1013904223u; v.y += v.x * v.x * 1664525u + 1013904223u; return v; }float randFibo(vec2 p) { uvec2 v = floatBitsToUint(p); v = pcg2d(v); uint r = v.x ^ v.y; return float(r) / float(0xffffffffu); }out vec4 fragColor;float luma(vec4 color) { return dot(color.rgb, vec3(0.299, 0.587, 0.114)); }vec4 finalPass(vec4 bloomColor) { float dither = (randFibo(gl_FragCoord.xy) - 0.5) / 255.0; bloomColor.rgb *= vec3(0.27450980392156865, 0.27450980392156865, 0.27450980392156865); bloomColor.rgb += dither; bloomColor.a = luma(bloomColor); vec4 sceneColor = texture(uBgTexture, vTextureCoord); vec4 finalColor = mix(sceneColor, sceneColor + bloomColor, 1.0000 * 1.75); return finalColor; }vec4 getColor(vec4 color) { return finalPass(color); }void main() { vec2 uv = vTextureCoord; vec4 color = texture(uTexture, uv); fragColor = getColor(color); }"
      ],
      "compiledVertexShaders": [
        "#version 300 es\nprecision mediump float;in vec3 aVertexPosition; in vec2 aTextureCoord;uniform mat4 uMVMatrix; uniform mat4 uPMatrix; uniform mat4 uTextureMatrix;out vec2 vTextureCoord; out vec3 vVertexPosition;void main() { gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0); vTextureCoord = (uTextureMatrix * vec4(aTextureCoord, 0.0, 1.0)).xy; }"
      ],
      "data": {
        "downSample": 0.5,
        "depth": false,
        "uniforms": {},
        "isBackground": false,
        "passes": [
          { "prop": "pass", "value": 1, "downSample": 0.25 },
          { "prop": "pass", "value": 2, "downSample": 0.25, "includeBg": true },
          { "prop": "pass", "value": 3, "downSample": 0.25 },
          { "prop": "pass", "value": 4, "downSample": 0.25, "includeBg": true },
          { "prop": "pass", "value": 5, "downSample": 0.5 },
          { "prop": "pass", "value": 6, "downSample": 0.5, "includeBg": true },
          { "prop": "pass", "value": 7, "downSample": 1, "includeBg": true }
        ]
      },
      "id": "effect4"
    },
    {
      "breakpoints": [],
      "visible": true,
      "aspectRatio": 1,
      "userDownsample": 1,
      "layerType": "effect",
      "type": "beam",
      "usesPingPong": false,
      "speed": 0.25,
      "trackMouse": 0,
      "trackAxes": "xy",
      "mouseMomentum": 0,
      "texture": false,
      "animating": false,
      "isMask": 0,
      "compiledFragmentShaders": [
        "#version 300 es\nprecision highp float; precision highp int;in vec2 vTextureCoord;uniform sampler2D uTexture;uniform vec2 uMousePos; vec3 blend (int blendMode, vec3 src, vec3 dst) { return src + dst; }uvec2 pcg2d(uvec2 v) { v = v * 1664525u + 1013904223u; v.x += v.y * v.y * 1664525u + 1013904223u; v.y += v.x * v.x * 1664525u + 1013904223u; v ^= v >> 16; v.x += v.y * v.y * 1664525u + 1013904223u; v.y += v.x * v.x * 1664525u + 1013904223u; return v; }float randFibo(vec2 p) { uvec2 v = floatBitsToUint(p); v = pcg2d(v); uint r = v.x ^ v.y; return float(r) / float(0xffffffffu); }vec3 Tonemap_tanh(vec3 x) { x = clamp(x, -40.0, 40.0); return (exp(x) - exp(-x)) / (exp(x) + exp(-x)); }out vec4 fragColor;const float PI = 3.14159265359; const float TWO_PI = 2.0 * PI;float luma(vec3 color) { return dot(color, vec3(0.299, 0.587, 0.114)); }vec3 drawViewportEdges(vec2 uv) { float distToEdge = min(min(uv.x, uv.y), min(1.0 - uv.x, 1.0 - uv.y)); float sdf = distToEdge; float glowThickness = 0.5000 * 0.8; float glow = glowThickness / (1.0 - smoothstep(0.12, 0.01, abs(sdf) + 0.02)); return glow * pow(1.0-abs(sdf), 3.0) * vec3(1, 1, 1); }vec3 getBeam(vec2 uv) { vec2 pos = vec2(0.5, 0.5) + mix(vec2(0), (uMousePos-0.5), 0.0000); return drawViewportEdges(uv); }void main() { vec2 uv = vTextureCoord; vec4 bg = texture(uTexture, uv);vec3 beam = getBeam(uv); float dither = (randFibo(gl_FragCoord.xy) - 0.5) / 255.0;vec3 blended = blend(1, Tonemap_tanh(beam), bg.rgb); vec3 result = mix(bg.rgb, blended, 0.1300); result += dither;vec4 color = vec4(result, max(bg.a, luma(beam))); fragColor = color;}"
      ],
      "compiledVertexShaders": [
        "#version 300 es\nprecision mediump float;in vec3 aVertexPosition; in vec2 aTextureCoord;uniform mat4 uMVMatrix; uniform mat4 uPMatrix; uniform mat4 uTextureMatrix;out vec2 vTextureCoord; out vec3 vVertexPosition;void main() { gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0); vTextureCoord = (uTextureMatrix * vec4(aTextureCoord, 0.0, 1.0)).xy; }"
      ],
      "data": { "depth": false, "uniforms": {}, "isBackground": false },
      "id": "effect5"
    },
    {
      "breakpoints": [],
      "visible": true,
      "aspectRatio": 1,
      "userDownsample": 1,
      "layerType": "effect",
      "type": "custom",
      "usesPingPong": false,
      "texture": false,
      "speed": 0.5,
      "mouseMomentum": 0,
      "animating": true,
      "isMask": 0,
      "customFragmentShaders": [
        "#version 300 es\nprecision highp float;\n\n// Unicorn Studio inputs\nin vec2 vTextureCoord;\n\nuniform sampler2D uTexture;\nuniform sampler2D uCustomTexture;\n\nuniform vec2 uResolution;   // px\nuniform vec2 uMousePos;     // 0..1\nuniform float uMouseClick;   // 0 or 1\nuniform vec3 uColor1;\nuniform vec3 uColor2;\nuniform vec2 uPos;\nuniform float uAmount;\nuniform float uScale;\nuniform float uFrequency;\nuniform float uAngle;\nuniform float uAmplitude;\nuniform int uVariant;\n\nuniform float uTime;\n\nout vec4 fragColor;\n\n// ==============================\n// configuration\n// ==============================\n\nconst float DENSITY_MIN   = 6.0;\nconst float DENSITY_MAX   = 80.0;\nconst float CONTRAST_MIN  = 0.6;\nconst float CONTRAST_MAX  = 1.8;\n\nconst float STEP_CELLS_Y  = 0.65;   // small Y offset\nconst float CHANNEL_DELAY = 0.10;   // slight phase lag\n\nconst float MACRO_SCALE   = 0.13;\nconst float MICRO_FREQ    = 1.5;\nconst float MACRO_WEIGHT  = 0.90;\n\nconst float MICRO_SPEED_MIN = 0.02;\nconst float MICRO_SPEED_MAX = 0.06;\nconst float MACRO_SPEED_MIN = 0.006;\nconst float MACRO_SPEED_MAX = 0.018;\n\n// NEW — center “freeze” controls\nconst float CENTER_STABILITY_RADIUS   = 0.35; // radius (0–1)\nconst float CENTER_STABILITY_STRENGTH = 0.7;  // how strong to bias towards max size\n\n// Fresnel-like radial size bias (center + rim larger)\nconst float FRESNEL_CENTER_RADIUS    = 0.6; // where center lobe fades\nconst float FRESNEL_CENTER_SOFTNESS  = 0.2; // width of the center fade\nconst float FRESNEL_CENTER_STRENGTH  = 0.5; // 0..1, how much bigger at center\n\nconst float FRESNEL_RIM_START        = 0.8; // start of rim boost (radius 0..1)\nconst float FRESNEL_RIM_END          = 0.2; // end of rim boost\nconst float FRESNEL_RIM_STRENGTH     = 0.5; // 0..1, how much bigger near edges\n\n\n// ==============================\n// helpers\n// ==============================\nfloat luma(vec3 c) { return dot(c, vec3(0.2126, 0.7152, 0.0722)); }\nmat2 rot(float a) { float s = sin(a), c = cos(a); return mat2(c, -s, s, c); }\n\nfloat hash21(vec2 p) {\n  p = fract(p * vec2(123.34, 345.45));\n  p += dot(p, p + 34.345);\n  return fract(p.x * p.y);\n}\n\nfloat noise2(vec2 p) {\n  vec2 i = floor(p);\n  vec2 f = fract(p);\n  float a = hash21(i);\n  float b = hash21(i + vec2(1.0, 0.0));\n  float c = hash21(i + vec2(0.0, 1.0));\n  float d = hash21(i + vec2(1.0, 1.0));\n  vec2  u = f * f * (3.0 - 2.0 * f);\n  return mix(mix(a, b, u.x), mix(c, d, u.x), u.y);\n}\n\nfloat centerMask(vec2 uv, float yyScale) {\n  vec2 g = (uv - 0.5) * vec2(1.0, 1.0 / yyScale);\n  float d = length(g) * 2.0;\n  return smoothstep(0.65, 1.3, d);\n}\n\n// ===================================================\n// Dot function: per-cell, seam-safe, with center bias\n// ===================================================\nfloat dotFromCell(vec2 id, vec2 fu, float val, float noiseAmp, float mouseLocal,float t, float aaWidth, vec2 uv) {\n  // sample modulation once per cell (prevents wobble)\n  vec2 cellCenter = id + vec2(0.5);\n\n  float tmMicro = mix(MICRO_SPEED_MIN, MICRO_SPEED_MAX, clamp(uFrequency, 0.0, 1.0));\n  float tmMacro = mix(MACRO_SPEED_MIN, MACRO_SPEED_MAX, clamp(uFrequency, 0.0, 1.0));\n\n  float nMicro = noise2(cellCenter * MICRO_FREQ + t * tmMicro);\n  float nMacro = noise2(cellCenter * MACRO_SCALE + t * tmMacro);\n  nMacro = mix(nMacro, noise2(cellCenter * (MACRO_SCALE * 1.8) + 11.7 + t * tmMacro), 0.2);\n\n  float n = mix(nMicro, nMacro, MACRO_WEIGHT);\n\n  // Fresnel-like radial bias: larger at center and near edges (rim)\n  vec2 centered = uv - 0.5;\n  centered.x *= uResolution.x / max(uResolution.y, 1.0); // keep circle round on non-square viewports\nfloat rRad = length(centered);\n\nfloat centerFalloff = 1.0 - smoothstep(\n  FRESNEL_CENTER_RADIUS - FRESNEL_CENTER_SOFTNESS,\n  FRESNEL_CENTER_RADIUS + FRESNEL_CENTER_SOFTNESS,\n  rRad\n);\n\nfloat rim = smoothstep(FRESNEL_RIM_START, FRESNEL_RIM_END, rRad);\n\n  // combined Fresnel profile (0..1)\n  float fresnelProfile = clamp(\n    centerFalloff * FRESNEL_CENTER_STRENGTH +\n    rim           * FRESNEL_RIM_STRENGTH,\n    0.0, 1.0\n  );\n\n  // bias modulation toward larger dots where fresnelProfile > 0\n  n = mix(n, 1.0, fresnelProfile);\n\n\n  // final ink radius\n  float ink = 1.0 - val;\n  ink += (n - 0.5) * 2.0 * noiseAmp;\n  ink = clamp(ink, 0.0, 1.0);\n\n  float r = sqrt(2.0) * ink * 0.5;\n  float d = length(fu);\n\n  float fw = aaWidth;\n  return 1.0 - smoothstep(r, r + fw, d);\n}\n\n// ==============================\n// Main\n// ==============================\nvoid main() {\n  vec2 uv  = vTextureCoord;\n  vec4 src = texture(uTexture, uv);\n  vec3 base = src.rgb;\n\n  float density  = mix(DENSITY_MIN, DENSITY_MAX, clamp(uScale,   0.0, 1.0));\n  float contrast = mix(CONTRAST_MIN, CONTRAST_MAX, clamp(uAmount, 0.0, 1.0));\n  float nAmp     = uAmplitude * 0.35;\n  float angle    = uAngle;\n\n  // mouse local effect\n  float distMouse     = distance(uv, uMousePos);\n  float cursorRadius  = 0.12;\n  float cursorFalloff = 1.0 - smoothstep(cursorRadius * 0.5, cursorRadius, distMouse);\n  float mouseLocal    = max(cursorFalloff * (0.35 + 0.65 * uMouseClick), 0.0);\n\n  // subtle center reduction (keeps previous tone balance)\n  float cMask      = centerMask(uv, 0.70);\n  float centerBias = -(1.0 - cMask) * 0.25 * 0.6;\n\n  // grid setup\n  float aspect = uResolution.x / max(uResolution.y, 1.0);\n  vec2 suv = (uv - 0.5);\n  suv.x *= aspect;\n\n  vec2 gridBase = (rot(angle) * suv) * density;\n\n  vec2 offA = vec2(0.0,  STEP_CELLS_Y);\n  vec2 offB = vec2(0.0,  0.0);\n  vec2 offC = vec2(0.0, -STEP_CELLS_Y);\n\n  vec2 gridA = gridBase + offA;\n  vec2 gridB = gridBase + offB;\n  vec2 gridC = gridBase + offC;\n\n  vec2 idA = floor(gridA), fuA = fract(gridA) - 0.5;\n  vec2 idB = floor(gridB), fuB = fract(gridB) - 0.5;\n  vec2 idC = floor(gridC), fuC = fract(gridC) - 0.5;\n\n  vec2 wA = fwidth(gridA);\n  vec2 wB = fwidth(gridB);\n  vec2 wC = fwidth(gridC);\n  float aaA = max(wA.x, wA.y);\n  float aaB = max(wB.x, wB.y);\n  float aaC = max(wC.x, wC.y);\n\n  float tA = uTime + CHANNEL_DELAY;\n  float tB = uTime;\n  float tC = uTime - CHANNEL_DELAY;\n\n  vec3 outCol = vec3(0.0);\n\n  if (uVariant == 0) {\n    vec3 cmy = 1.0 - clamp(base * contrast, 0.0, 1.0);\n\n    float cDot = dotFromCell(idA, fuA, clamp(1.0 - cmy.x - centerBias, 0.0, 1.0),\n                             nAmp, mouseLocal, tA, aaA, uv);\n    float mDot = dotFromCell(idB, fuB, clamp(1.0 - cmy.y - centerBias, 0.0, 1.0),\n                             nAmp, mouseLocal, tB, aaB, uv);\n    float yDot = dotFromCell(idC, fuC, clamp(1.0 - cmy.z - centerBias, 0.0, 1.0),\n                             nAmp, mouseLocal, tC, aaC, uv);\n\n    vec3 paper = vec3(1.0);\n    paper -= vec3(cDot, 0.0, 0.0);\n    paper -= vec3(0.0, mDot, 0.0);\n    paper -= vec3(0.0, 0.0, yDot);\n\n    float overlap = min(min(cDot, mDot), yDot);\n    paper = mix(paper, vec3(0.3), overlap * 0.2);\n\n    outCol = clamp(paper, 0.0, 1.0);\n  }\n  else if (uVariant == 1) {\n    float v = clamp(luma(base) * contrast - centerBias, 0.0, 1.0);\n    float kDot = dotFromCell(idB, fuB, v, nAmp, mouseLocal, tB, aaB, uv);\n    outCol = mix(vec3(1.0), vec3(0.0), kDot);\n  }\n  else {\n    float rDot = dotFromCell(idA, fuA, clamp(base.r * contrast - centerBias, 0.0, 1.0),\n                             nAmp, mouseLocal, tA, aaA, uv);\n    float gDot = dotFromCell(idB, fuB, clamp(base.g * contrast - centerBias, 0.0, 1.0),\n                             nAmp, mouseLocal, tB, aaB, uv);\n    float bDot = dotFromCell(idC, fuC, clamp(base.b * contrast - centerBias, 0.0, 1.0),\n                             nAmp, mouseLocal, tC, aaC, uv);\n\n    vec3 dots = vec3(rDot, gDot, bDot);\n    float overlap = min(min(dots.r, dots.g), dots.b);\n    dots = mix(dots, vec3(1.0), overlap * 0.5);\n    outCol = clamp(dots, 0.0, 1.0);\n  }\n\n  float outA = src.a > 0.0 ? src.a : 1.0;\n  fragColor = vec4(outCol, outA);\n}\n"
      ],
      "customVertexShaders": [
        "#version 300 es\nprecision mediump float;\n\nin vec3 aVertexPosition;\nin vec2 aTextureCoord;\n\nuniform mat4 uMVMatrix;\nuniform mat4 uPMatrix;\nuniform mat4 uTextureMatrix;\n\nout vec2 vTextureCoord;\nout vec3 vVertexPosition;\n\nvoid main() {\n  gl_Position = vec4(aVertexPosition, 1.0);\n  vTextureCoord = (vec4(aTextureCoord, 0.0, 1.0)).xy;\n}"
      ],
      "compiledFragmentShaders": [
        "#version 300 es\nprecision highp float;in vec2 vTextureCoord;uniform sampler2D uTexture;uniform vec2 uResolution; uniform vec2 uMousePos;uniform float uTime;out vec4 fragColor;const float DENSITY_MIN = 6.0; const float DENSITY_MAX = 80.0; const float CONTRAST_MIN = 0.6; const float CONTRAST_MAX = 1.8;const float STEP_CELLS_Y = 0.65; const float CHANNEL_DELAY = 0.10;const float MACRO_SCALE = 0.13; const float MICRO_FREQ = 1.5; const float MACRO_WEIGHT = 0.90;const float MICRO_SPEED_MIN = 0.02; const float MICRO_SPEED_MAX = 0.06; const float MACRO_SPEED_MIN = 0.006; const float MACRO_SPEED_MAX = 0.018;const float CENTER_STABILITY_RADIUS = 0.35; const float CENTER_STABILITY_STRENGTH = 0.7;const float FRESNEL_CENTER_RADIUS = 0.6; const float FRESNEL_CENTER_SOFTNESS = 0.2; const float FRESNEL_CENTER_STRENGTH = 0.5;const float FRESNEL_RIM_START = 0.8; const float FRESNEL_RIM_END = 0.2; const float FRESNEL_RIM_STRENGTH = 0.5;float luma(vec3 c) { return dot(c, vec3(0.2126, 0.7152, 0.0722)); } mat2 rot(float a) { float s = sin(a), c = cos(a); return mat2(c, -s, s, c); }float hash21(vec2 p) { p = fract(p * vec2(123.34, 345.45)); p += dot(p, p + 34.345); return fract(p.x * p.y); }float noise2(vec2 p) { vec2 i = floor(p); vec2 f = fract(p); float a = hash21(i); float b = hash21(i + vec2(1.0, 0.0)); float c = hash21(i + vec2(0.0, 1.0)); float d = hash21(i + vec2(1.0, 1.0)); vec2 u = f * f * (3.0 - 2.0 * f); return mix(mix(a, b, u.x), mix(c, d, u.x), u.y); }float centerMask(vec2 uv, float yyScale) { vec2 g = (uv - 0.5) * vec2(1.0, 1.0 / yyScale); float d = length(g) * 2.0; return smoothstep(0.65, 1.3, d); }float dotFromCell(vec2 id, vec2 fu, float val, float noiseAmp, float mouseLocal,float t, float aaWidth, vec2 uv) { vec2 cellCenter = id + vec2(0.5);float tmMicro = mix(MICRO_SPEED_MIN, MICRO_SPEED_MAX, clamp(0.5000, 0.0, 1.0)); float tmMacro = mix(MACRO_SPEED_MIN, MACRO_SPEED_MAX, clamp(0.5000, 0.0, 1.0));float nMicro = noise2(cellCenter * MICRO_FREQ + t * tmMicro); float nMacro = noise2(cellCenter * MACRO_SCALE + t * tmMacro); nMacro = mix(nMacro, noise2(cellCenter * (MACRO_SCALE * 1.8) + 11.7 + t * tmMacro), 0.2);float n = mix(nMicro, nMacro, MACRO_WEIGHT); vec2 centered = uv - 0.5; centered.x *= uResolution.x / max(uResolution.y, 1.0); float rRad = length(centered);float centerFalloff = 1.0 - smoothstep( FRESNEL_CENTER_RADIUS - FRESNEL_CENTER_SOFTNESS, FRESNEL_CENTER_RADIUS + FRESNEL_CENTER_SOFTNESS, rRad );float rim = smoothstep(FRESNEL_RIM_START, FRESNEL_RIM_END, rRad); float fresnelProfile = clamp( centerFalloff * FRESNEL_CENTER_STRENGTH + rim * FRESNEL_RIM_STRENGTH, 0.0, 1.0 ); n = mix(n, 1.0, fresnelProfile); float ink = 1.0 - val; ink += (n - 0.5) * 2.0 * noiseAmp; ink = clamp(ink, 0.0, 1.0);float r = sqrt(2.0) * ink * 0.5; float d = length(fu);float fw = aaWidth; return 1.0 - smoothstep(r, r + fw, d); }void main() { vec2 uv = vTextureCoord; vec4 src = texture(uTexture, uv); vec3 base = src.rgb;float density = mix(DENSITY_MIN, DENSITY_MAX, clamp(0.9420, 0.0, 1.0)); float contrast = mix(CONTRAST_MIN, CONTRAST_MAX, clamp(0.5200, 0.0, 1.0)); float nAmp = 0.7500 * 0.35; float angle = 0.0000; float distMouse = distance(uv, uMousePos); float cursorRadius = 0.12; float cursorFalloff = 1.0 - smoothstep(cursorRadius * 0.5, cursorRadius, distMouse); float mouseLocal = max(cursorFalloff * (0.35 + 0.65 * 0.0000), 0.0); float cMask = centerMask(uv, 0.70); float centerBias = -(1.0 - cMask) * 0.25 * 0.6; float aspect = uResolution.x / max(uResolution.y, 1.0); vec2 suv = (uv - 0.5); suv.x *= aspect;vec2 gridBase = (rot(angle) * suv) * density;vec2 offA = vec2(0.0, STEP_CELLS_Y); vec2 offB = vec2(0.0, 0.0); vec2 offC = vec2(0.0, -STEP_CELLS_Y);vec2 gridA = gridBase + offA; vec2 gridB = gridBase + offB; vec2 gridC = gridBase + offC;vec2 idA = floor(gridA), fuA = fract(gridA) - 0.5; vec2 idB = floor(gridB), fuB = fract(gridB) - 0.5; vec2 idC = floor(gridC), fuC = fract(gridC) - 0.5;vec2 wA = fwidth(gridA); vec2 wB = fwidth(gridB); vec2 wC = fwidth(gridC); float aaA = max(wA.x, wA.y); float aaB = max(wB.x, wB.y); float aaC = max(wC.x, wC.y);float tA = uTime + CHANNEL_DELAY; float tB = uTime; float tC = uTime - CHANNEL_DELAY;vec3 outCol = vec3(0.0);if (0 == 0) { vec3 cmy = 1.0 - clamp(base * contrast, 0.0, 1.0);float cDot = dotFromCell(idA, fuA, clamp(1.0 - cmy.x - centerBias, 0.0, 1.0), nAmp, mouseLocal, tA, aaA, uv); float mDot = dotFromCell(idB, fuB, clamp(1.0 - cmy.y - centerBias, 0.0, 1.0), nAmp, mouseLocal, tB, aaB, uv); float yDot = dotFromCell(idC, fuC, clamp(1.0 - cmy.z - centerBias, 0.0, 1.0), nAmp, mouseLocal, tC, aaC, uv);vec3 paper = vec3(1.0); paper -= vec3(cDot, 0.0, 0.0); paper -= vec3(0.0, mDot, 0.0); paper -= vec3(0.0, 0.0, yDot);float overlap = min(min(cDot, mDot), yDot); paper = mix(paper, vec3(0.3), overlap * 0.2);outCol = clamp(paper, 0.0, 1.0); } else if (0 == 1) { float v = clamp(luma(base) * contrast - centerBias, 0.0, 1.0); float kDot = dotFromCell(idB, fuB, v, nAmp, mouseLocal, tB, aaB, uv); outCol = mix(vec3(1.0), vec3(0.0), kDot); } else { float rDot = dotFromCell(idA, fuA, clamp(base.r * contrast - centerBias, 0.0, 1.0), nAmp, mouseLocal, tA, aaA, uv); float gDot = dotFromCell(idB, fuB, clamp(base.g * contrast - centerBias, 0.0, 1.0), nAmp, mouseLocal, tB, aaB, uv); float bDot = dotFromCell(idC, fuC, clamp(base.b * contrast - centerBias, 0.0, 1.0), nAmp, mouseLocal, tC, aaC, uv);vec3 dots = vec3(rDot, gDot, bDot); float overlap = min(min(dots.r, dots.g), dots.b); dots = mix(dots, vec3(1.0), overlap * 0.5); outCol = clamp(dots, 0.0, 1.0); }float outA = src.a > 0.0 ? src.a : 1.0; fragColor = vec4(outCol, outA); }"
      ],
      "compiledVertexShaders": [
        "#version 300 es\nprecision mediump float;in vec3 aVertexPosition; in vec2 aTextureCoord;out vec2 vTextureCoord; out vec3 vVertexPosition;void main() { gl_Position = vec4(aVertexPosition, 1.0); vTextureCoord = (vec4(aTextureCoord, 0.0, 1.0)).xy; }"
      ],
      "data": {
        "depth": false,
        "uniforms": {},
        "isBackground": false,
        "heightSegments": 250,
        "widthSegments": 250
      },
      "id": "effect6"
    }
  ],
  "options": {
    "name": "Reflect Blackhole (Remix)",
    "fps": 60,
    "dpi": 1,
    "scale": 0.75,
    "includeLogo": false,
    "isProduction": false
  },
  "version": "1.4.33",
  "id": "vCIsT3MRVFVt18h3XnN1"
}
