{"history":[{"breakpoints":[],"visible":true,"aspectRatio":1,"userDownsample":1,"layerType":"effect","type":"twodlight","usesPingPong":false,"texture":false,"animating":false,"mouseMomentum":0,"mouseSpring":0,"isMask":0,"compiledFragmentShaders":["#version 300 es\nprecision highp float;\nprecision highp int;in vec2 vTextureCoord;uniform sampler2D uTexture;uniform vec2 uMousePos;\nuniform vec2 uResolution;uvec2 pcg2d(uvec2 v) {\nv = v * 1664525u + 1013904223u;\nv.x += v.y * v.y * 1664525u + 1013904223u;\nv.y += v.x * v.x * 1664525u + 1013904223u;\nv ^= v >> 16;\nv.x += v.y * v.y * 1664525u + 1013904223u;\nv.y += v.x * v.x * 1664525u + 1013904223u;\nreturn v;\n}float randFibo(vec2 p) {\nuvec2 v = floatBitsToUint(p);\nv = pcg2d(v);\nuint r = v.x ^ v.y;\nreturn float(r) / float(0xffffffffu);\n}float deband() {\nreturn (randFibo(gl_FragCoord.xy) - 0.5) / 255.0;\n}const float EPSILON = 0.0002;\nconst int MAX_STEPS = 20;\nconst float MAX_STEPS_F = 20.0;\nconst float STEP_SCALE = 64.0 / 20.0;\nconst float AMBIENT_STEP = 0.01 * STEP_SCALE;\nconst float SOURCE_ACCUM_GAIN = 0.05;\nconst float SOURCE_RADIUS_SCALE = 0.0;out vec4 fragColor;vec3 Tonemap_tanh(vec3 x) {\nx = clamp(x, -40.0, 40.0);\nreturn (exp(x) - exp(-x)) / (exp(x) + exp(-x));\n}float SHADER_COST_RAYMARCH_HINT(float value) {\nreturn value;\n}float interleavedGradientNoise(vec2 st) {\nreturn fract(52.9829189 * fract(dot(st, vec2(0.06711056, 0.00583715))));\n}void main() {\nvec4 sceneColor = texture(uTexture, vTextureCoord);\nvec2 aspectRatio = uResolution / min(uResolution.x, uResolution.y);\nvec2 uv = vTextureCoord * aspectRatio;\nvec2 pos = vec2(0.501530781870759, 0.6420565576064312) + mix(vec2(0), (uMousePos-0.5), 0.0000);\npos = pos * aspectRatio;\nvec2 lightDelta = pos - uv;\nfloat lightDist = length(lightDelta);if(lightDist <= EPSILON) {\nvec3 lightColor = Tonemap_tanh(sceneColor.rgb * vec3(1, 1, 1) + vec3(1, 1, 1) * (0.25 + 1.0000 * 0.5) * SOURCE_ACCUM_GAIN);\nfloat dither = deband();\nlightColor += dither;\nvec4 color = vec4(lightColor, 1.0);\nfragColor = color;return;\n}vec2 lightDir = lightDelta / lightDist;\nvec2 lightPerp = vec2(-lightDir.y, lightDir.x);\nbool hitObject = false;\nvec2 marchPos = uv;\nfloat rayDist = 0.;\nfloat jitter = interleavedGradientNoise(vTextureCoord * uResolution) - 0.5;\nfloat diffusion = 0.5400*0.125;\nfloat cappedScale = min(1.8, 0.8100);\nfloat ambient = 0.;\nfloat sourceGlow = 1.0 - smoothstep(0.0, 0.045 + cappedScale * 0.08, lightDist);\nfloat sourceRadius = (0.015 + cappedScale * 0.06) * SOURCE_RADIUS_SCALE;\nfloat sourceAccum = (SOURCE_ACCUM_GAIN * 1.0000) * (0.015 + 1.0000 * 0.12) / max(lightDist * lightDist, sourceRadius * sourceRadius);\nvec2 offset = lightPerp * jitter * diffusion;\nfloat baseStepLength = 0.01 * max(cappedScale, 0.05) * STEP_SCALE;\nfloat stepLength = min(baseStepLength, max(lightDist / (MAX_STEPS_F * 0.8), EPSILON));\nvec2 step = (lightDir + offset) * stepLength;\nmarchPos += step * (jitter + 0.5);\nvec3 prevColor = vec3(0.0);for(int i = 0; i < MAX_STEPS; i++) {\nfloat traveled = length(marchPos - uv);\nfloat dist = SHADER_COST_RAYMARCH_HINT(traveled);if (dist >= lightDist) {\nbreak;\n}marchPos += step * mix(dist, 1., 0.4);\nvec4 texColor = texture(uTexture, marchPos / aspectRatio);rayDist = dist / lightDist;vec3 color = texColor.rgb;float colorDiff = length(color - prevColor);\nbool hit = colorDiff > 0.2500;\nif (hit && !hitObject) {\nhitObject = true;\nprevColor = color;\nif(dist < lightDist) {\nbreak;\n}\n} else {\nambient -= AMBIENT_STEP;\n}\n}rayDist = mix(rayDist * lightDist, rayDist, 1.0000 * 1.5);\nfloat lightMix = max(0.0, 1. - rayDist + ambient * 1.0000);\nvec3 lightColor = mix(vec3(1, 1, 1), sceneColor.rgb * vec3(1, 1, 1), lightMix);\nlightColor += vec3(1, 1, 1) * (sourceGlow * (0.04 + 1.0000 * 0.1) + sourceAccum);\nlightColor = Tonemap_tanh(sceneColor.rgb * lightColor);\nfloat dither = deband();\nlightColor += dither;\nvec4 color = vec4(lightColor, 1.);\nfragColor = color;}"],"compiledVertexShaders":["#version 300 es\nprecision mediump float;in vec3 aVertexPosition;\nin vec2 aTextureCoord;uniform mat4 uMVMatrix;\nuniform mat4 uPMatrix;\nuniform mat4 uTextureMatrix;out vec2 vTextureCoord;\nout vec3 vVertexPosition;void main() {\ngl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);\nvTextureCoord = (uTextureMatrix * vec4(aTextureCoord, 0.0, 1.0)).xy;\n}"],"trackMouse":0,"trackAxes":"xy","data":{"depth":false,"uniforms":{},"isBackground":false},"id":"2d_light"},{"breakpoints":[],"visible":true,"aspectRatio":1,"userDownsample":1,"layerType":"effect","type":"beam","usesPingPong":false,"texture":false,"animating":true,"mouseMomentum":0.07,"mouseSpring":0.09,"isMask":0,"compiledFragmentShaders":["#version 300 es\nprecision highp float;\nprecision highp int;in vec2 vTextureCoord;uniform sampler2D uTexture;uniform float uTime;uniform vec2 uMousePos;\nuniform vec2 uResolution;\nvec3 blend (int blendMode, vec3 src, vec3 dst) {\nreturn 1. - (1. - src) * (1. - dst);\n}vec4 applyLayerMix(vec4 color, vec4 bg, float amount) {\ncolor.rgb = mix(bg.rgb, color.rgb, amount);\ncolor.a = max(bg.a, amount);\nreturn color;\n}uvec2 pcg2d(uvec2 v) {\nv = v * 1664525u + 1013904223u;\nv.x += v.y * v.y * 1664525u + 1013904223u;\nv.y += v.x * v.x * 1664525u + 1013904223u;\nv ^= v >> 16;\nv.x += v.y * v.y * 1664525u + 1013904223u;\nv.y += v.x * v.x * 1664525u + 1013904223u;\nreturn v;\n}float randFibo(vec2 p) {\nuvec2 v = floatBitsToUint(p);\nv = pcg2d(v);\nuint r = v.x ^ v.y;\nreturn float(r) / float(0xffffffffu);\n}float deband() {\nreturn (randFibo(gl_FragCoord.xy) - 0.5) / 255.0;\n}const float TAU = 6.28318530718;vec3 Tonemap_tanh(vec3 x) {\nx = clamp(x, -40.0, 40.0);\nreturn (exp(x) - exp(-x)) / (exp(x) + exp(-x));\n}out vec4 fragColor;const float PI = 3.14159265359;\nconst float TWO_PI = 2.0 * PI;float luma(vec3 color) {\nreturn dot(color, vec3(0.299, 0.587, 0.114));\n}mat2 rot(float a) {\nreturn mat2(cos(a),-sin(a),sin(a),cos(a));\n}float sdBox(vec2 p, vec2 b) {\nvec2 q = abs(p)-b;\nreturn length(max(q,0.0)) + min(max(q.x,q.y),0.0);\n}float sdEquilateralTriangle(vec2 p, float r ) {\nconst float k = sqrt(3.0);\np.x = abs(p.x) - r;\np.y = p.y + r/k;\nif( p.x+k*p.y>0.0 ) p = vec2(p.x-k*p.y,-k*p.x-p.y)/2.0;\np.x -= clamp( p.x, -2.0*r, 0.0 );\nreturn -length(p)*sign(p.y);\n}float sdStar4(vec2 p, float r) {\nvec2 q = abs(p * 1./r * 0.15);\nr = max(r, 0.001);\nfloat power = 0.4;\nvec2 pn = q / r;\nfloat d = pow(pn.x, power) + pow(pn.y, power);\nreturn max(1. - 1./d, 0.0);\n}float sdDiamond(vec2 p, float r) {\np = abs(p);\nreturn (p.x + p.y - r) * 0.70710678118;\n}float sdPentagon( vec2 p, float r ) {\nconst vec3 k = vec3(0.809016994, 0.587785252, 0.726542528);\np.x = abs(p.x);\np -= 2.0*min(dot(vec2(-k.x,k.y),p),0.0)*vec2(-k.x,k.y);\np -= 2.0*min(dot(vec2( k.x,k.y),p),0.0)*vec2( k.x,k.y);\np -= vec2(clamp(p.x,-r*k.z,r*k.z),r);\nreturn length(p)*sign(p.y);\n}float sdHexagon( vec2 p, float r ) {\nconst vec3 k = vec3(-0.866025404, 0.5, 0.577350269);\np = abs(p);\np -= 2.0*min(dot(k.xy,p),0.0)*k.xy;\np -= vec2(clamp(p.x, -k.z*r, k.z*r), r);\nreturn length(p)*sign(p.y);\n}float sdOctagon( vec2 p, float r ) {\nconst vec3 k = vec3(-0.9238795325, 0.3826834323, 0.4142135623 );\np = abs(p);\np -= 2.0*min(dot(vec2( k.x,k.y),p),0.0)*vec2( k.x,k.y);\np -= 2.0*min(dot(vec2(-k.x,k.y),p),0.0)*vec2(-k.x,k.y);\np -= vec2(clamp(p.x, -r*k.z, r*k.z), r);\nreturn length(p)*sign(p.y);\n}float sdVesica(vec2 p, float r) {\nfloat d = r;\nvec2 c1 = vec2(-d * 0.5, 0.0);\nvec2 c2 = vec2( d * 0.5, 0.0);\nreturn max(length(p - c1) - r, length(p - c2) - r);\n}float sdArchway(vec2 p, float r_param) {\np.y += 0.06;\nvec2 rect_half_extents = vec2(r_param, r_param);\nfloat d_rect = sdBox(p, rect_half_extents);vec2 circle_center = vec2(0.0, r_param);\nfloat d_disk = length(p - circle_center) - r_param;\nfloat d_plane_above_rect_top = r_param - p.y;\nfloat d_semicircle = max(d_disk, d_plane_above_rect_top);return min(d_rect, d_disk);\n}float sdX(vec2 p, float w) {\np = abs(p);\nfloat d1 = sdBox(rot(PI/4.0) * p, vec2(w, w * 0.3));\nfloat d2 = sdBox(rot(-PI/4.0) * p, vec2(w, w * 0.3));\nreturn min(d1, d2);\n}float sdRing(vec2 p, float r1, float r2) {\nreturn abs(length(p) - r1) - r2;\n}float getSDFShape(vec2 p, float r, int shapeType) {\nswitch(shapeType) {\ncase 6: return sdEquilateralTriangle(p, r);\ncase 7: return sdDiamond(p, r); break;\ncase 8: return sdPentagon(p, r); break;\ncase 9: return sdHexagon(p, r); break;\ncase 10: return sdOctagon(p, r); break;\ncase 11: return sdVesica(p, r); break;\ncase 12: return sdArchway(p, r * 0.75); break;\ncase 13: return sdX(p, r); break;\ncase 14: return sdRing(p, r, r * 0.2); break;\ncase 17: return sdStar4(p, r); break;\ndefault: return sdEquilateralTriangle(p, r);\n}\n}float drawSDFShape(vec2 uv, vec2 center, float scale, int shapeType, vec2 resolution, float skewVal, float angleVal, float thickness) {\nfloat aspect = resolution.x/resolution.y;\nuv.x *= aspect;\ncenter.x *= aspect;\nvec2 skew = vec2(skewVal, 1. - skewVal) * 2.;\nuv = uv * rot(angleVal * TWO_PI) * skew;\ncenter = center * rot(angleVal * TWO_PI) * skew;\nvec2 p = uv - center;\nfloat r = scale * 0.4;\nfloat sdf = getSDFShape(p, r, shapeType);\nfloat t = thickness * 0.8;\nfloat glow = t / max(0.0001, 1.0 - smoothstep(0.12, 0.01, abs(sdf) + 0.02));\nreturn glow * pow(1.0-abs(sdf), 3.0);\n}float getBeam(vec2 uv, vec2 pos, float radius, float angleVal, float skewVal, float thickness, float time, float phaseVal, vec2 resolution) {\nreturn drawSDFShape(uv, pos, radius, 13, resolution, skewVal, angleVal, thickness);\n}void main() {\nvec2 uv = vTextureCoord;\nvec4 bg = texture(uTexture, uv);\nvec2 pos = vec2(0.5329626957093254, 0.08218943498243192) + mix(vec2(0), (uMousePos-0.5), 0.1100);\nfloat beam = getBeam(uv, pos, 0.7540, 0.7479, 0.0600, 0.1000, uTime, 0.5000, uResolution);\nvec3 beamColor = beam * vec3(0.4, 0.1, 1);\nfloat ssBeam = beam / (beam + 1.0);\nbeamColor = mix(beamColor, vec3(0.4, 0.1, 1), mix(1.0, ssBeam, 0.0000)) * beam;float dither = deband();\nvec3 result = Tonemap_tanh(beamColor);\nfloat lum = luma(beamColor);\nresult += dither;float layerMix = 1.0000;\nvec4 color;vec3 blended = blend(4, result, bg.rgb);\ncolor = applyLayerMix(vec4(blended, 1.0), bg, layerMix);\nfragColor = color;}"],"compiledVertexShaders":["#version 300 es\nprecision mediump float;in vec3 aVertexPosition;\nin vec2 aTextureCoord;uniform mat4 uMVMatrix;\nuniform mat4 uPMatrix;\nuniform mat4 uTextureMatrix;out vec2 vTextureCoord;\nout vec3 vVertexPosition;void main() {\ngl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);\nvTextureCoord = (uTextureMatrix * vec4(aTextureCoord, 0.0, 1.0)).xy;\n}"],"speed":0.25,"trackMouse":0.11,"trackAxes":"xy","data":{"depth":false,"uniforms":{},"isBackground":false},"id":"beam"},{"breakpoints":[],"visible":true,"aspectRatio":1,"userDownsample":1,"layerType":"effect","type":"liquify","usesPingPong":false,"texture":false,"animating":true,"mouseMomentum":0,"mouseSpring":0,"isMask":0,"compiledFragmentShaders":["#version 300 es\nprecision mediump float;in vec3 vVertexPosition;\nin vec2 vTextureCoord;uniform float uTime;\nuniform sampler2D uTexture;uniform vec2 uMousePos;\nuniform vec2 uResolution;float ease (int easingFunc, float t) {\nreturn t;\n}const float PI = 3.14159265359;mat2 rot(float a) {\nreturn mat2(cos(a), -sin(a), sin(a), cos(a));\n}vec2 liquify(vec2 st, float dist) {\nfloat aspectRatio = uResolution.x / uResolution.y;\nvec2 pos = vec2(0.5, 0.5) + mix(vec2(0), (uMousePos - 0.5), 0.0000);\nvec2 drift = vec2(0, 0.0000 * uTime * 0.0125) * rot(0.0000 * -2. * PI);pos += drift;\nvec2 skew = mix(vec2(1), vec2(1, 0), 0.0000);\nst -= pos;\nst.x *= aspectRatio;\nst = st * rot(0.0000 * 2. * PI);\nst *= skew;\nfloat freq = (5.0 * (0.0600 + 0.1));\nfloat t = uTime * 0.025;float amplitude = 0.6700 * mix(0.2, 0.2/(0.0600 + 0.05), 0.25) * dist;for (float i = 1.0; i <= 5.0; i++) {\nst = st * rot(i / 5. * PI * 2.);\nfloat ff = i * freq;\nst.x += amplitude * cos(ff * st.y + t);\nst.y += amplitude * sin(ff * st.x + t);\n}st /= skew;st = st * rot(0.0000 * -2. * PI);\nst.x /= aspectRatio;\nst += pos;return st;\n}vec2 caLiquifiedUV;\nvec2 caOriginalUV;out vec4 fragColor;vec2 distortUV(vec2 uv) {\nfloat aspectRatio = uResolution.x / uResolution.y;\nvec2 mPos = vec2(0.5, 0.5) + mix(vec2(0), (uMousePos - 0.5), 0.0000);\nfloat dist = ease(0, max(0., 1. - distance(uv * vec2(aspectRatio, 1), mPos * vec2(aspectRatio, 1)) * 4. * (1. - 1.0000)));if (dist <= 0.001) return uv;\nif (0.6700 <= 0.001) return uv;\nif (0.5000 <= 0.001) return uv;vec2 liquifiedUV = liquify(uv, dist);\ncaLiquifiedUV = liquifiedUV;\ncaOriginalUV = uv;\nreturn mix(uv, liquifiedUV, 0.5000);\n}void main() {\nvec2 uv = vTextureCoord;\nvec2 distortedUV = distortUV(uv);\nvec4 color = texture(uTexture, distortedUV);vec2 dir = caLiquifiedUV - caOriginalUV;\nfloat distanceUv = length(dir);\nif (distanceUv > 0.001) {\nvec2 normalizedUv = dir / distanceUv;\nfloat chromAbb = 1.0000 * 0.5;\nvec2 offsetR = caLiquifiedUV + chromAbb * normalizedUv * distanceUv;\nvec2 offsetB = caLiquifiedUV - chromAbb * normalizedUv * distanceUv;\nvec4 colorR = texture(uTexture, mix(caOriginalUV, offsetR, 0.5000));\nvec4 colorB = texture(uTexture, mix(caOriginalUV, offsetB, 0.5000));\ncolor = vec4(colorR.r, color.g, colorB.b, colorR.a * color.a * colorB.a);\n}\nfragColor = color;}"],"compiledVertexShaders":["#version 300 es\nprecision mediump float;in vec3 aVertexPosition;\nin vec2 aTextureCoord;uniform mat4 uMVMatrix;\nuniform mat4 uPMatrix;\nuniform mat4 uTextureMatrix;out vec2 vTextureCoord;\nout vec3 vVertexPosition;void main() {\ngl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);\nvTextureCoord = (uTextureMatrix * vec4(aTextureCoord, 0.0, 1.0)).xy;\n}"],"speed":0.25,"trackMouse":0,"trackAxes":"xy","data":{"depth":false,"uniforms":{},"isBackground":false},"id":"liquify"},{"breakpoints":[],"visible":true,"aspectRatio":1,"userDownsample":1,"layerType":"effect","type":"mondrian","usesPingPong":false,"texture":false,"animating":true,"mouseMomentum":0,"mouseSpring":0,"isMask":0,"compiledFragmentShaders":["#version 300 es\nprecision highp float;in vec2 vTextureCoord;uniform sampler2D uTexture;\nuniform float uTime;uniform vec2 uMousePos;\nuniform vec2 uResolution;float ease (int easingFunc, float t) {\nreturn t;\n}float getExponentialWeight(int index) {\nswitch(index) {\ncase 0: return 1.0000000000;\ncase 1: return 0.7165313106;\ncase 2: return 0.5134171190;\ncase 3: return 0.3678794412;\ncase 4: return 0.2636050919;\ncase 5: return 0.1888756057;\ncase 6: return 0.1353352832;\ncase 7: return 0.0969670595;\ncase 8: return 0.0694877157;\ncase 9: return 0.0497870684;\ncase 10: return 0.0356739933;\ncase 11: return 0.0255615332;\ncase 12: return 0.0183156389;\ncase 13: return 0.0131237287;\ncase 14: return 0.0094035626;\ncase 15: return 0.0067379470;\ndefault: return 0.0;\n}\n}out vec4 fragColor;const int ITERATIONS = 16;\nconst float TAU = 6.28318530718;\nconst float REFERENCE_SHORT_SIDE = 1000.0;mat2 rot(float a) {\nfloat s = sin(a);\nfloat c = cos(a);\nreturn mat2(c, -s, s, c);\n}vec2 perp(vec2 v) {\nreturn vec2(-v.y, v.x);\n}vec2 rotateAround(vec2 point, vec2 center, mat2 rotation, float aspectRatio) {\nvec2 translated = point - center;\ntranslated.x *= aspectRatio;\ntranslated = rotation * translated;\ntranslated.x /= aspectRatio;\nreturn translated + center;\n}vec2 getGridOffset(int index) {\nswitch (index) {\ncase 0: return vec2(-0.22, -0.18);\ncase 1: return vec2(0.18, -0.24);\ncase 2: return vec2(-0.14, 0.20);\ncase 3: return vec2(0.24, 0.12);\ncase 4: return vec2(-0.30, 0.02);\ncase 5: return vec2(0.08, -0.32);\ncase 6: return vec2(0.30, -0.06);\ncase 7: return vec2(-0.06, 0.30);\ncase 8: return vec2(0.12, 0.26);\ncase 9: return vec2(-0.26, -0.08);\ncase 10: return vec2(0.28, 0.22);\ncase 11: return vec2(-0.18, 0.28);\ncase 12: return vec2(0.04, -0.20);\ncase 13: return vec2(-0.32, 0.14);\ncase 14: return vec2(0.22, -0.14);\ndefault: return vec2(0.0);\n}\n}vec2 pixelateUV(vec2 uv, vec2 anchorPos, float pixelSizePx, vec2 gridOffset) {\nfloat shortSide = max(min(uResolution.x, uResolution.y), 0.0001);\nvec2 scale = uResolution / shortSide;\nfloat pixelSize = pixelSizePx / REFERENCE_SHORT_SIDE;\nvec2 scaledAnchorPos = anchorPos * scale;\nvec2 pixelCoord = floor((((uv * scale) - scaledAnchorPos) / pixelSize) + gridOffset) * pixelSize;\nvec2 sampleCoord = pixelCoord + (vec2(0.5) - gridOffset) * pixelSize + scaledAnchorPos;\nreturn sampleCoord / scale;\n}vec2 distortUV(vec2 uv) {\nif (0.5000 > 0.0001) {\nfloat aspectRatio = uResolution.x / uResolution.y;\nvec2 anchorPos = vec2(0.5, 0.5) + mix(vec2(0.0), (uMousePos - 0.5), 0.0000);\nvec2 mixPos = vec2(0.5, 0.5) + mix(vec2(0.0), (uMousePos - 0.5), 0.0000);\nvec2 accumulatedUv = vec2(0.0);\nfloat accumulatedWeight = 0.0;\nfloat maxPixelSize = 1.0 + 0.5000 * 50.0;\nfloat curvePower = mix(0.0, -0.5, 1.0000);\nmat2 distortionRotation = rot(0.0000 * TAU);\nvec2 rotatedUv = rotateAround(uv, anchorPos, rot(0.0000 * TAU * -1.0), aspectRatio);for (int i = 0; i < ITERATIONS; i++) {\nfloat weight = getExponentialWeight(i);\nfloat curve = pow(getExponentialWeight((ITERATIONS - 1) - i), curvePower);\nfloat pixelSizePx = mix(maxPixelSize, 1.0, curve);\nfloat offsetStrength = mix(0.35, 0.0, curve);\nvec2 baseOffset = getGridOffset(i) * offsetStrength;\nvec2 swayDir = normalize(perp(baseOffset) + vec2(0.00001, 0.0));float swayAmount = 1.0;\nif(uTime > 0.0) {\nswayAmount = sin(uTime * 0.035 + float(i) * 1.6180339) * abs(offsetStrength) * 0.18;\n}\nvec2 gridOffset = baseOffset + swayDir * swayAmount;\nvec2 pixelUv = pixelateUV(rotatedUv, anchorPos, pixelSizePx, gridOffset);accumulatedUv += pixelUv * weight;\naccumulatedWeight += weight;\n}vec2 blurredUv = rotateAround(\naccumulatedUv / max(accumulatedWeight, 0.0001),\nanchorPos,\ndistortionRotation,\naspectRatio\n);\nfloat blendRadius = ease(\n0,\nmax(0.0, 1.0 - distance(blurredUv * vec2(aspectRatio, 1.0), mixPos * vec2(aspectRatio, 1.0)) * 4.0 * (1.0 - 1.0000))\n);return mix(uv, blurredUv, 1.0000 * blendRadius);\n}return uv;\n}void main() {\nvec2 baseUv = vTextureCoord;\nvec2 uv = distortUV(baseUv);\nvec4 color = texture(uTexture, uv);\nvec4 bg = texture(uTexture, baseUv);\nfragColor = color;}"],"compiledVertexShaders":["#version 300 es\nprecision mediump float;in vec3 aVertexPosition;\nin vec2 aTextureCoord;uniform mat4 uMVMatrix;\nuniform mat4 uPMatrix;\nuniform mat4 uTextureMatrix;out vec2 vTextureCoord;\nout vec3 vVertexPosition;void main() {\ngl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);\nvTextureCoord = (uTextureMatrix * vec4(aTextureCoord, 0.0, 1.0)).xy;\n}"],"speed":0.12,"trackMouse":0,"trackAxes":"xy","data":{"depth":false,"uniforms":{},"isBackground":false},"id":"mondrian"},{"breakpoints":[],"visible":true,"aspectRatio":1,"userDownsample":1,"layerType":"effect","type":"sdf_shape","usesPingPong":false,"texture":{"src":"/assets/unicorn/logoart-mark.png","sampler":"uCustomTexture"},"animating":true,"mouseMomentum":1,"mouseSpring":0,"isMask":0,"compiledFragmentShaders":["#version 300 es\nprecision highp float;\nprecision highp int;in vec2 vTextureCoord;\nuniform sampler2D uTexture;\nuniform sampler2D uCustomTexture;uniform float uTime;uniform vec2 uMousePos;\nuniform vec2 uResolution;uvec2 pcg2d(uvec2 v) {\nv = v * 1664525u + 1013904223u;\nv.x += v.y * v.y * 1664525u + 1013904223u;\nv.y += v.x * v.x * 1664525u + 1013904223u;\nv ^= v >> 16;\nv.x += v.y * v.y * 1664525u + 1013904223u;\nv.y += v.x * v.x * 1664525u + 1013904223u;\nreturn v;\n}float randFibo(vec2 p) {\nuvec2 v = floatBitsToUint(p);\nv = pcg2d(v);\nuint r = v.x ^ v.y;\nreturn float(r) / float(0xffffffffu);\n}const float PI = 3.14159265359;\nconst float TAU = 6.28318530718;\nconst float PHI = 1.61803398875;\nconst vec3 viewDir = vec3(0,0, -4.25);ivec2 customTexSize;\nfloat customTexAspect;const mat3 ROT_Y_90 = mat3(\n0.0, 0.0, 1.0,\n0.0, 1.0, 0.0,\n-1.0, 0.0, 0.0\n);const mat3 ROT_Z_90 = mat3(\n0.0, -1.0, 0.0,\n1.0, 0.0, 0.0,\n0.0, 0.0, 1.0\n);const mat3 ROT_X_90 = mat3(\n1.0, 0.0, 0.0,\n0.0, 0.0, -1.0,\n0.0, 1.0, 0.0\n);float interleavedGradientNoise(vec2 st) {\nreturn fract(52.9829189 * fract(dot(st, vec2(0.06711056, 0.00583715))));\n}mat3 rotY(float ang) {\nfloat c = cos(ang), s = sin(ang);\nreturn mat3(c, 0.0, s, 0.0, 1.0, 0.0, -s, 0.0, c);\n}mat3 rotX(float ang) {\nfloat c = cos(ang), s = sin(ang);\nreturn mat3(1.0, 0.0, 0.0, 0.0, c, -s, 0.0, s, c);\n}mat3 rotZ(float ang) {\nfloat c = cos(ang), s = sin(ang);\nreturn mat3(c, -s, 0.0, s, c, 0.0, 0.0, 0.0, 1.0);\n}vec3 twistY(vec3 p, float amount) {\nfloat c = cos(amount * p.y);\nfloat s = sin(amount * p.y);\nmat2 m = mat2(c, -s, s, c);\nreturn vec3(m * p.xz, p.y);\n}vec3 twistX(vec3 p, float amount) {\nfloat c = cos(amount * p.x);\nfloat s = sin(amount * p.x);\nmat2 m = mat2(c, -s, s, c);\nreturn vec3(p.x, m * p.yz);\n}float opExtrusion(vec3 p, float d, float h) {\nvec2 w = vec2( d, abs(p.z) - h );\nreturn min(max(w.x,w.y),0.0) + length(max(w,0.0));\n}float median(float r, float g, float b) {\nreturn max(min(r, g), min(max(r, g), b));\n}float sdCustom(vec3 p) {\np *= rotX(radians(90.0));\np *= rotY(radians(180.0));\np *= rotZ(radians(180.0));\nvec2 uv = p.xy * 0.25 + 0.5;\nif (customTexAspect > 1.0) {\nuv.y = (uv.y - 0.5) * customTexAspect + 0.5;\n} else {\nuv.x = (uv.x - 0.5) / customTexAspect + 0.5;\n}vec4 sdColor = texture(uCustomTexture, uv);\nfloat msdf = median(sdColor.r, sdColor.g, sdColor.b);\nfloat sdf = sdColor.a;\nfloat sd = msdf;\nif(sdf < 1.) {\nfloat tuning = 0.023;\nsd = mix(msdf, max(msdf - tuning, sdf), sdf);\n}float screenPxDistance = sd - 0.5;\nfloat d = -screenPxDistance;return opExtrusion(p, d, 0.2500 * 0.5);\n}vec3 getRepeat(vec3 p) {\nfloat spacing = (0.5000 + 0.0000 * 0.38) * 8.;\nreturn p;\n}vec3 getThreeDRepeat(vec3 p) {\nfloat spacing = (0.5000 + 0.0000 * 0.38) * 8.;\nreturn p;\n}vec3 getAdjustedP(vec3 p) {\nfloat scale = max(0.3320, 0.000000001);\nfloat scaleFactor = 1.0/scale;\nvec3 adjustedP = p * scaleFactor;vec2 twist = vec2(0, 0);adjustedP.xy *= vec2(uResolution.x / uResolution.y, 1);adjustedP *= (1. + (0.0000 + 0.01));vec2 mousePos = mix(vec2(0), uMousePos - 0.5, 0.0000);\nvec2 axis = vec2(-1. * vec3(0.6585365853658537, 0.5613240418118467, 0.4995).y - 1. + mousePos.y/PI, vec3(0.6585365853658537, 0.5613240418118467, 0.4995).x + mousePos.x/PI) * 2.;adjustedP = getRepeat(adjustedP);float baseTime = uTime * 0.02;\nfloat timeX = vec3(0, 1, 0).x * baseTime;\nfloat timeY = vec3(0, 1, 0).y * baseTime;\nfloat timeZ = vec3(0, 1, 0).z * baseTime;mat3 rotYMat = rotY(axis.y * PI);\nmat3 rotXMat = rotX(axis.x * PI);\nmat3 rotZMat = rotZ(vec3(0.6585365853658537, 0.5613240418118467, 0.4995).z * 2.0 * PI);mat3 combinedRotation = rotZMat * rotYMat * rotXMat;\nmat3 combinedAnimation = rotZ(timeZ) * rotX(timeX) * rotY(timeY);adjustedP = combinedRotation * adjustedP;\nadjustedP = combinedAnimation * adjustedP;\nadjustedP = getThreeDRepeat(adjustedP);if (twist.y != 0.0) {\nadjustedP = twistY(adjustedP, -1.0 * twist.y);\n} else {\nadjustedP = adjustedP.xzy;\n}if (twist.x != 0.0) {\nadjustedP = twistX(adjustedP, -1.0 * twist.x);\n}return adjustedP;\n}float getMergedSDF(vec3 p) {\np = getAdjustedP(p);\nreturn sdCustom(p);\n}float fresnel(vec3 eyeVector, vec3 worldNormal, float power) {\nfloat NdotV = abs(dot(eyeVector, worldNormal));\nfloat width = fwidth(dot(eyeVector, worldNormal));\nfloat threshold = 0.2;\nfloat edgeDampFactor = smoothstep(threshold, -threshold, width);\nfloat fresnelFactor = 1.0 - NdotV;\nreturn pow(fresnelFactor, power) * mix(1., edgeDampFactor * 2., 0.5);\n}float ign(vec2 st) {\nreturn fract(52.9829189 * fract(dot(st, vec2(0.06711056, 0.00583715))));\n}float ignGaussian4(vec2 st) {\nfloat n0 = ign(st + vec2(0.5, 0.5));\nfloat n1 = ign(st + vec2(5.2, 1.3));\nfloat n2 = ign(st + vec2(1.7, 9.2));\nfloat n3 = ign(st + vec2(8.3, 2.8));\nreturn (n0 + n1 + n2 + n3 - PHI) * PHI;\n}vec2 rot90(vec2 v) {\nreturn vec2(v.y, -v.x);\n}vec3 sampleDispersionTap(vec3 rd, vec3 normal, float iorBase, vec3 dispCoefficients, float step, vec2 blurOffset) {\nvec3 disp = step * dispCoefficients;\nvec3 ior = 1.0 / (iorBase + disp);\nvec3 refractedRayR = refract(rd, normal, ior.r);\nvec3 refractedRayG = refract(rd, normal, ior.g);\nvec3 refractedRayB = refract(rd, normal, ior.b);return vec3(\ntexture(uTexture, vTextureCoord - refractedRayR.xy + blurOffset).r,\ntexture(uTexture, vTextureCoord - refractedRayG.xy + blurOffset).g,\ntexture(uTexture, vTextureCoord - refractedRayB.xy + blurOffset).b\n);\n}vec3 frostOrDispersion(vec3 rd, vec3 normal) {\nvec3 refractionColor = vec3(0.0);\nfloat iorBase = 1. + 0.5000 * 0.25;\nvec3 dispCoefficients = vec3(0.03, 0.06, 0.1) * 0.2500 * 1.2;\nvec2 texel = 1.0 / uResolution;\nfloat aspectRatio = uResolution.x / uResolution.y;\nvec2 aspect = vec2(aspectRatio, 1.0);\nvec2 px = gl_FragCoord.xy;\nfloat noise = ign(px * 1.212);\nfloat angle = noise * PHI;\nvec2 screenAxis = vec2(cos(angle), sin(angle));\nvec2 screenAxisPerp = rot90(screenAxis);\nvec2 axis = screenAxis / aspect;\nvec2 axisPerp = screenAxisPerp / aspect;\nfloat jitter = ignGaussian4(px);\njitter = clamp(jitter, -2.0, 2.0) * 0.5;\nfloat blurRadius = max((0.0000 * 25.0) * texel.y * (1.0 + jitter), 0.0);dispCoefficients *= mix(jitter, 1.0, 0.6);vec2 blurAxis = vec2(0.0);\nvec2 blurAxisPerp = vec2(0.0);\nif (blurRadius > texel.y * 0.5) {\nblurAxis = axis * blurRadius;\nblurAxisPerp = axisPerp * blurRadius;\n}refractionColor += sampleDispersionTap(rd, normal, iorBase, dispCoefficients, 0.125, blurAxis);\nrefractionColor += sampleDispersionTap(rd, normal, iorBase, dispCoefficients, 0.375, -blurAxis);\nrefractionColor += sampleDispersionTap(rd, normal, iorBase, dispCoefficients, 0.625, blurAxisPerp);\nrefractionColor += sampleDispersionTap(rd, normal, iorBase, dispCoefficients, 0.875, -blurAxisPerp);return clamp(refractionColor * 0.25, 0.0, 1.0);\n}vec3 calculateNormal(vec3 p, float eps) {\nvec2 e = vec2(1.0, -1.0) * eps * 0.5;\nreturn normalize(\ne.xyy * getMergedSDF(p + e.xyy) +\ne.yyx * getMergedSDF(p + e.yyx) +\ne.yxy * getMergedSDF(p + e.yxy) +\ne.xxx * getMergedSDF(p + e.xxx)\n);\n}vec3 sampleTexture(vec3 rd, vec3 normal) {return frostOrDispersion(rd, normal);\n}float getFinalSDF(vec3 p) {\nreturn max(0.0000000001, getMergedSDF(p) - (0.0000 + 0.005)) * max(0.3320, 0.000000001);\n}const int STEPS = 72;\nconst float MAX_DISTANCE = 120.0;vec4 rayMarch(vec3 ro, vec3 rd) {\nfloat pixelSize = 0.005;\nfloat jitter = interleavedGradientNoise(gl_FragCoord.xy);\nfloat traveled = jitter;\nvec3 entryPoint = vec3(0.0);\nvec3 entryNormal = vec3(0.0);\nfloat partialAlpha = 0.0;\nfloat lastDistance = 0.0;\nfloat smoothing = mix(1., 4., 0.2000);for (int i = 0; i < STEPS; ++i) {\nvec3 currentPos = ro + rd * traveled;\nfloat distance = getFinalSDF(currentPos);\nfloat progress = float(i)/float(STEPS);\nfloat step = distance * mix(0.5, 2.0, progress) * mix(1.0, jitter + 0.5, 1. - progress);if (distance > MAX_DISTANCE) break;if (distance < pixelSize) {\npartialAlpha = 1.;\nentryPoint = currentPos;\nentryNormal = calculateNormal(entryPoint, pixelSize * smoothing);\nbreak;\n}lastDistance = distance;traveled += max(step, pixelSize);\nif (traveled > MAX_DISTANCE) break;\n}if (partialAlpha == 0.0) {\nreturn texture(uTexture, vTextureCoord);\n}vec3 samplePosition = mix(rd, entryPoint, 0.0000);vec3 refractionColor = sampleTexture(samplePosition, entryNormal);\nvec3 lightDir = vec3(((vec2(vec3(0.25, 0.25, -3).x, 1.-vec3(0.25, 0.25, -3).y) - 0.333) * 3.) - vec2(0.4942686525459249, 0.5250176756237273), vec3(0.25, 0.25, -3).z);\nvec3 normLightDir = normalize(lightDir);float lightAndShadow = dot(entryNormal, normLightDir);\nvec3 lightColor = mix(vec3(1), vec3(0.13333333333333333, 1, 0.6549019607843137), 1. - 0.7800);\nvec3 fresnelEffect = vec3(0.0);fresnelEffect = fresnel(rd, entryNormal, 8.0) * 0.5000 * vec3(0.13333333333333333, 1, 0.6549019607843137);vec3 specularEffect = vec3(0.0);vec3 halfwayDir = normalize(lightDir + rd);\nfloat specFactor = pow(max(dot(entryNormal, halfwayDir), 0.0), 64.0 * 0.5000 + 0.01);\nspecularEffect = specFactor * 0.5000 * lightColor;vec3 combinedEffects = fresnelEffect + specularEffect;\nvec3 finalColor = mix(refractionColor, vec3(0.13333333333333333, 1, 0.6549019607843137) * lightAndShadow, 0.7800);\nfinalColor += combinedEffects;vec4 outputColor = vec4(finalColor, 1.);return outputColor;\n}out vec4 fragColor;void main() {\nvec4 col = vec4(0);\nvec2 uv = vTextureCoord;\nvec4 bg = texture(uTexture, uv);customTexSize = textureSize(uCustomTexture, 0);\ncustomTexAspect = float(customTexSize.x) / float(customTexSize.y);if(float(customTexSize.x) == float(uResolution.x) && float(customTexSize.y) == float(uResolution.y)) {\ndiscard;\n}if(0.3320 <= 0.0001 || 1.0000 <= 0.0001) {\ncol = vec4(0);\nif(1 == 1) {\ncol = bg;\n}\nfragColor = col;\nreturn;\n}vec2 pos = vec2(0.4942686525459249, 0.5250176756237273) + mix(vec2(0), (uMousePos-0.5), 0.0000);\nuv = uv - pos;\nfloat fovFactor = tan(radians(20.) * 0.5);\nvec3 rd = vec3(uv * fovFactor, 0.5);\ncol = rayMarch(viewDir, rd);\nfloat dither = (randFibo(vTextureCoord.xy) - 0.5) / 255.0;\ncol += dither;col = mix(bg, col, 1.0000);\nfragColor = col;}"],"compiledVertexShaders":["#version 300 es\nprecision mediump float;in vec3 aVertexPosition;\nin vec2 aTextureCoord;uniform mat4 uMVMatrix;\nuniform mat4 uPMatrix;\nuniform mat4 uTextureMatrix;out vec2 vTextureCoord;\nout vec3 vVertexPosition;void main() {\ngl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);\nvTextureCoord = (uTextureMatrix * vec4(aTextureCoord, 0.0, 1.0)).xy;\n}"],"speed":0.66,"trackMouseMove":0,"trackAxes":"xy","trackMouse":0,"data":{"depth":false,"uniforms":{},"isBackground":false},"id":"3d_shape"},{"breakpoints":[],"visible":true,"aspectRatio":1,"userDownsample":1,"layerType":"effect","type":"outline","usesPingPong":false,"texture":false,"animating":false,"mouseMomentum":0,"mouseSpring":0,"isMask":0,"compiledFragmentShaders":["#version 300 es\nprecision highp float;\nin vec2 vTextureCoord;uniform sampler2D uTexture;\nuniform sampler2D uBgTexture;\nuniform vec2 uResolution;\nvec3 blend (int blendMode, vec3 src, vec3 dst) {\nreturn src + dst;\n}\nvec4 applyLayerMix(vec4 color, vec4 bg, float amount) {\ncolor.rgb = mix(bg.rgb, color.rgb, amount);\ncolor.a = max(bg.a, amount);\nreturn color;\n}out vec4 fragColor;float luma(vec3 c) {\nreturn dot(c, vec3(0.299, 0.587, 0.114));\n}float interleavedGradientNoise(vec2 st) {\nreturn fract(52.9829189 * fract(dot(st, vec2(0.06711056, 0.00583715))));\n}void main() {\nvec2 uv = vTextureCoord;float thickness = 0.5000;vec2 pixel = (1.0 / uResolution) * max(thickness * 4.0, 0.001);\nfloat noise = interleavedGradientNoise(gl_FragCoord.xy);pixel *= mix(1.0, noise, 0.1);float tl = luma(texture(uTexture, uv + pixel * vec2(-1, -1)).rgb);\nfloat t = luma(texture(uTexture, uv + pixel * vec2( 0, -1)).rgb);\nfloat tr = luma(texture(uTexture, uv + pixel * vec2( 1, -1)).rgb);\nfloat l = luma(texture(uTexture, uv + pixel * vec2(-1, 0)).rgb);\nfloat r = luma(texture(uTexture, uv + pixel * vec2( 1, 0)).rgb);\nfloat bl = luma(texture(uTexture, uv + pixel * vec2(-1, 1)).rgb);\nfloat b = luma(texture(uTexture, uv + pixel * vec2( 0, 1)).rgb);\nfloat br = luma(texture(uTexture, uv + pixel * vec2( 1, 1)).rgb);float gx = -tl - 2.0 * l - bl + tr + 2.0 * r + br;\nfloat gy = -tl - 2.0 * t - tr + bl + 2.0 * b + br;\nfloat edge = length(vec2(gx, gy));float soft = max(1.0000 * 0.5, 0.001);\nedge = smoothstep(0.5000 - soft, 0.5000 + soft, edge);\nedge *= (0.5000 * 2.0);vec4 scene = texture(uBgTexture, uv);\nvec3 outline = vec3(1, 1, 1) * edge;\nvec3 blended = outline;blended = blend(1, outline, scene.rgb);vec4 col = applyLayerMix(vec4(blended, 1.0), scene, 0.2600);\nfragColor = col;}"],"compiledVertexShaders":["#version 300 es\nprecision mediump float;in vec3 aVertexPosition;\nin vec2 aTextureCoord;uniform mat4 uMVMatrix;\nuniform mat4 uPMatrix;\nuniform mat4 uTextureMatrix;out vec2 vTextureCoord;\nout vec3 vVertexPosition;void main() {\ngl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);\nvTextureCoord = (uTextureMatrix * vec4(aTextureCoord, 0.0, 1.0)).xy;\n}"],"trackMouse":0,"trackAxes":"xy","data":{"depth":false,"uniforms":{},"isBackground":false},"id":"outline"},{"layerType":"flattened","id":"flat_6","compiledFragmentShaders":["#version 300 es\nprecision highp float;\nin vec2 vTextureCoord;\nin vec3 vVertexPosition;\n\nuniform sampler2D uBgTexture;\nuniform vec2 uMousePos;\nuniform vec2 uResolution;\nuniform float uL0_ElemOpacity;\nuniform float uL1_Time;\nuniform float uL1_ElemOpacity;\nuniform float uL2_Time;\nuniform float uL2_ElemOpacity;\n\nconst float MAX_ITERATIONS = 32.0;\nconst int MAX_LEVEL = 4;\nconst float TAU = 6.28318530718;\n\nout vec4 fragColor;\n\nfloat interleavedGradientNoise_L0(vec2 st) {\nreturn fract(52.9829189 * fract(dot(st, vec2(0.06711056, 0.00583715))));\n}\nvec4 godRays_L0(vec2 st) {\nvec3 color = vec3(0);\nfloat decay = mix(0.89, 0.965, 0.7800);\nvec2 pos = vec2(0.3722460220318238, 0.6297429620563035) - mix(vec2(0), (vec2(1. - uMousePos.x, 1. - uMousePos.y) - 0.5), 0.0000);\nfloat weight = 1.0;\nvec2 stepDir = (pos - st) / MAX_ITERATIONS * (0.25 + min(1., 0.7800)) * 0.75;\nfloat noise = interleavedGradientNoise_L0(st * uResolution);\nvec2 sampleUv = st + stepDir * noise;\nvec2 perpDir = vec2(-stepDir.y, stepDir.x);\nfloat intensity = 2.8 * 0.9000;\nfor (float i = 0.0;\ni < MAX_ITERATIONS;\ni++) {\nfloat theta = i/MAX_ITERATIONS;\nsampleUv += stepDir + (perpDir * theta * sin((noise * 0.25) * (1.0 + theta) * 50.0)) * 0.0000 * 0.25;\nvec4 samp = texture(uBgTexture, sampleUv);\nfloat lum = dot(samp.rgb, vec3(0.299, 0.587, 0.114));\nfloat thresh = smoothstep(0.4000 - 0.1, 0.4000, lum);\ncolor += samp.rgb * thresh * weight * intensity;\nweight *= decay;\nif(weight < 0.05) break;\n}\nreturn vec4(color / MAX_ITERATIONS, 1.0);\n}\nuvec2 pcg2d(uvec2 v) {\nv = v * 1664525u + 1013904223u;\nv.x += v.y * v.y * 1664525u + 1013904223u;\nv.y += v.x * v.x * 1664525u + 1013904223u;\nv ^= v >> 16;\nv.x += v.y * v.y * 1664525u + 1013904223u;\nv.y += v.x * v.x * 1664525u + 1013904223u;\nreturn v;\n}\nfloat randFibo(vec2 p) {\nuvec2 v = floatBitsToUint(p);\nv = pcg2d(v);\nuint r = v.x ^ v.y;\nreturn float(r) / float(0xffffffffu);\n}\nfloat getBayerFromCoordLevelScaled_L1(vec2 pixelpos, float scale) {\nfloat finalBayer = 0.0;\nfloat finalDivisor = 0.0;\nfloat layerMult = 1.0;\nfor(float bayerLevel = float(MAX_LEVEL);\nbayerLevel >= 1.0;\nbayerLevel--) {\nfloat bayerSize = exp2(bayerLevel) * 0.5 / scale;\nvec2 bayercoord = mod(floor(pixelpos.xy / bayerSize), 2.0);\nlayerMult *= 4.0;\nfloat byxx2 = bayercoord.x * 2.0;\nfinalBayer += mix(byxx2, 3.0 - byxx2, bayercoord.y) / 3.0 * layerMult;\nfinalDivisor += layerMult;\n}\nreturn (finalBayer / finalDivisor - 0.006);\n}\nfloat getBayerNoise_L1(vec2 st, float delta, float scale) {\nvec2 center = uResolution * 0.5;\nvec2 centered = st * uResolution - center;\nvec2 offset = vec2(\nmod(delta * 0.618033988749895, 16.0),\nmod(delta * 0.381966011250105, 16.0)\n) * 20.;\nvec2 final = (centered + center + offset);\nreturn getBayerFromCoordLevelScaled_L1(final, scale);\n}\nvec3 dither_L1(vec3 color, vec2 st) {\nfloat delta = floor(uL1_Time);\nvec2 offset = vec2(randFibo(vec2(123,16) + delta), randFibo(vec2(56,96) + delta));\nfloat noise = 0.0;\nnoise = getBayerNoise_L1(st, delta, 0.5);\nfloat dither_threshold = max(0.0001, 0.5000);\nfloat num_levels = 1.0 / dither_threshold;\nreturn floor(color * num_levels + noise) / num_levels;\n}\nvec3 getColor_L2(int index) {\nswitch(index) {\ncase 0: return vec3(0, 0, 0);\ncase 1: return vec3(0.0196078431372549, 0.3411764705882353, 0.1803921568627451);\ncase 2: return vec3(0.043137254901960784, 0.5215686274509804, 0.2901960784313726);\ncase 3: return vec3(0.06274509803921569, 0.7137254901960784, 0.403921568627451);\ncase 4: return vec3(0.13333333333333333, 1, 0.6549019607843137);\ncase 5: return vec3(0.807843137254902, 1, 0.8666666666666667);\ndefault: return vec3(0.0);\n}\n}\nfloat getStop_L2(int index) {\nswitch(index) {\ncase 0: return 0.0000;\ncase 1: return 0.2000;\ncase 2: return 0.4000;\ncase 3: return 0.6000;\ncase 4: return 0.8000;\ncase 5: return 1.0000;\ndefault: return 0.0;\n}\n}\nfloat deband_L2() {\nreturn (randFibo(gl_FragCoord.xy) - 0.5) / 255.0;\n}\nfloat luma_L2(vec3 color) {\nreturn dot(color, vec3(0.299, 0.587, 0.114));\n}\nvec3 linear_from_srgb_L2(vec3 rgb) {\nreturn pow(max(rgb, vec3(0.0)), vec3(2.2));\n}\nvec3 srgb_from_linear_L2(vec3 lin) {\nreturn pow(max(lin, vec3(0.0)), vec3(1.0/2.2));\n}\nvec3 safeCbrt_L2(vec3 v) {\nreturn sign(v) * pow(abs(v), vec3(1.0/3.0));\n}\nvec3 oklab_mix_L2(vec3 lin1, vec3 lin2, float a) {\nconst mat3 kCONEtoLMS = mat3(\n0.4121656120, 0.2118591070, 0.0883097947,\n0.5362752080, 0.6807189584, 0.2818474174,\n0.0514575653, 0.1074065790, 0.6302613616);\nconst mat3 kLMStoCONE = mat3(\n4.0767245293, -1.2681437731, -0.0041119885,\n-3.3072168827, 2.6093323231, -0.7034763098,\n0.2307590544, -0.3411344290, 1.7068625689);\nvec3 lms1 = safeCbrt_L2(kCONEtoLMS*lin1);\nvec3 lms2 = safeCbrt_L2(kCONEtoLMS*lin2);\nvec3 lms = mix(lms1, lms2, a);\nlms *= 1.0 + 0.02 * a * (1.0 - a);\nreturn kLMStoCONE*(lms*lms*lms);\n}\nvec3 getGradientColor_L2(float position) {\nposition = clamp(position, 0.0, 1.0);\nint count = 6 - 1;\nfor (int i = 0;\ni < count;\ni++) {\nfloat colorPosition = getStop_L2(i);\nfloat nextColorPosition = getStop_L2(i + 1);\nif (position <= nextColorPosition) {\nfloat stopDelta = nextColorPosition - colorPosition;\nfloat mixFactor = clamp(stopDelta > 0.0001 ? (position - colorPosition) / stopDelta : 0.0, 0.0, 1.0);\nvec3 linStart = linear_from_srgb_L2(getColor_L2(i));\nvec3 linEnd = linear_from_srgb_L2(getColor_L2(i + 1));\nvec3 mixedLin = oklab_mix_L2(linStart, linEnd, mixFactor);\nreturn srgb_from_linear_L2(mixedLin);\n}\n}\nreturn getColor_L2(count);\n}\n\nvec4 computeLayer_L0(vec2 uv) {\nvec4 bg = texture(uBgTexture, uv);\nif(0.9000 <= 0.01) {\nvec4 color = bg;\nreturn color;\n}\nvec4 rays = godRays_L0(uv);\nrays.rgb *= vec3(1, 1, 1);\nvec4 color = vec4(bg.rgb + rays.rgb, bg.a + rays.r);\nreturn color;\n}\nvec4 computeLayer_L1(vec2 uv, vec4 prevLayerColor) {\nfloat delta = floor(uL1_Time);\nvec4 color = prevLayerColor;\ncolor.rgb = mix(color.rgb, dither_L1(color.rgb, vTextureCoord), 0.5000);\nreturn color;\n}\nvec4 computeLayer_L2(vec2 uv, vec4 prevLayerColor, float sharedDither) {\nvec4 color = prevLayerColor;\nif(color.a > 0.001) {\nfloat position = smoothstep(0., 1., luma_L2(color.rgb)) * (0.4000 * 2.);\nfloat posOffset = (dot(vec2(0.5, 0.5).x, vec2(0.5, 0.5).y) + 0.2600 + 0.0001) * 2.;\nposition -= (uL2_Time*0.01 + posOffset);\nfloat cycle = floor(position);\nbool reverse = 1.0000 > 0.5 && int(cycle) % 2 == 0;\nfloat animatedPos = reverse ? fract(-position) : fract(position);\nanimatedPos = reverse ? fract(-position) : fract(position);\nanimatedPos = clamp(animatedPos, 0.0, 1.0);\nvec3 gradientColor = getGradientColor_L2(animatedPos);\nfloat dither = sharedDither;\ngradientColor += dither;\nvec3 mixedColor = mix(color.rgb, gradientColor, 1.0000);\ncolor.rgb = mixedColor;\n}\nreturn color;\n;\n}\n\nvoid main() {\nvec2 uv = vTextureCoord;\nfloat sharedDither = deband_L2();\nvec4 result = vec4(0.0);\nvec4 c0 = computeLayer_L0(uv);\nc0 *= uL0_ElemOpacity;\nresult = c0 + result * (1.0 - c0.a);\nvec4 c1 = computeLayer_L1(uv, result);\nc1 *= uL1_ElemOpacity;\nresult = c1 + result * (1.0 - c1.a);\nvec4 c2 = computeLayer_L2(uv, result, sharedDither);\nc2 *= uL2_ElemOpacity;\nresult = c2 + result * (1.0 - c2.a);\nfragColor = result;\n}"],"compiledVertexShaders":["#version 300 es\nprecision highp float;\nin vec3 aVertexPosition;\nin vec2 aTextureCoord;\nuniform mat4 uMVMatrix;\nuniform mat4 uPMatrix;\nout vec2 vTextureCoord;\nout vec3 vVertexPosition;\nvoid main() {\ngl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);\nvVertexPosition = aVertexPosition;\nvTextureCoord = aTextureCoord;\n}"],"sublayers":[{"id":"god_rays","layerType":"effect","type":"godrays","sublayerIndex":0,"opacity":1,"animating":false},{"id":"dither","layerType":"effect","type":"dither","sublayerIndex":1,"opacity":1,"animating":false,"texture":{"src":"/assets/unicorn/blue_noise_med.png","sampler":"uBlueNoise"}},{"id":"gradient_map","layerType":"effect","type":"gradientMap","sublayerIndex":2,"opacity":1,"animating":false}],"data":{"uniforms":{"resolution":{"name":"uResolution","type":"2f","value":{"type":"Vec2","_x":1080,"_y":1080}},"mousePos":{"name":"uMousePos","type":"2f","value":{"type":"Vec2","_x":0.5,"_y":0.5}},"L0_elemOpacity":{"name":"uL0_ElemOpacity","type":"1f","value":1},"L1_time":{"name":"uL1_Time","type":"1f","value":0},"L1_elemOpacity":{"name":"uL1_ElemOpacity","type":"1f","value":1},"L2_time":{"name":"uL2_Time","type":"1f","value":0},"L2_elemOpacity":{"name":"uL2_ElemOpacity","type":"1f","value":1}},"textures":[{"sampler":"uBlueNoise","type":"media","src":"/assets/unicorn/blue_noise_med.png","sublayerIndex":1}],"timeUniforms":[],"mouseUniforms":[],"hasMouseTracking":false,"hasVideoSublayers":false,"estimatedSublayerWorkRaw":307.2855543593206,"occlusion":{"candidateLayers":0}},"states":{"appear":[],"scroll":[],"hover":[],"mousemove":[]},"breakpoints":[],"userDownsample":1,"visible":true}],"options":{"name":"Tech Background (Remix)","fps":60,"dpi":1.5,"scale":1,"includeLogo":false,"isProduction":false,"flatten":true},"version":"2.1.9","id":"aDpJZMqzaBWmprii7Fk3"}