{"layers": [{"breakpoints": [], "visible": true, "aspectRatio": 1, "userDownsample": 1, "layerType": "effect", "type": "gradient", "usesPingPong": false, "texture": false, "animating": false, "mouseMomentum": 0, "mouseSpring": 0, "isMask": 0, "compiledFragmentShaders": ["#version 300 es\n// Copyright (c) Unicorn Studio. Licensed under the Unicorn Studio Commercial License.\n// Unauthorized copying, redistribution, or use in competing products is prohibited.\nprecision highp float;in vec2 vTextureCoord;uniform vec2 uMousePos;const float PI = 3.14159265359;vec2 rotate(vec2 coord, float angle) {\nfloat s = sin(angle);\nfloat c = cos(angle);\nreturn vec2(\ncoord.x * c - coord.y * s,\ncoord.x * s + coord.y * c\n);\n}out vec4 fragColor;vec3 getBgColor(vec2 uv) {return vec3(0.027450980392156862, 0.03137254901960784, 0.03137254901960784);\n}void main() {vec2 uv = vTextureCoord;\nvec2 pos = vec2(0.5, 0.5) + mix(vec2(0), (uMousePos-0.5), 0.0000);\nuv -= pos;\nuv /= max(0.5000*2., 1e-5);\nuv = rotate(uv, (0.0000 - 0.5) * 2. * PI);\nvec4 color = vec4(getBgColor(uv), 1.0) * 1.0000;\nfragColor = color;\n}"], "compiledVertexShaders": ["#version 300 es\n// Copyright (c) Unicorn Studio. Licensed under the Unicorn Studio Commercial License.\n// Unauthorized copying, redistribution, or use in competing products is prohibited.\nprecision mediump float;in vec3 aVertexPosition;\nin vec2 aTextureCoord;uniform mat4 uMVMatrix;\nuniform mat4 uPMatrix;out vec2 vTextureCoord;\nout vec3 vVertexPosition;void main() {\ngl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);\nvTextureCoord = aTextureCoord;\n}"], "speed": 0.25, "trackMouse": 0, "trackAxes": "xy", "data": {"downSample": 0.5, "depth": false, "uniforms": {}, "isBackground": true}, "id": "8b2bb8dc-5c04-4a1e-bf9a-e1d94f1457eb", "publicId": "gradient"}, {"breakpoints": [], "aspectRatio": 1.7916666666666667, "userDownsample": 1, "states": {"appear": [], "scroll": [], "hover": [], "mousemove": []}, "effects": [], "anchorPoint": 8, "mask": 0, "maskInvert": 0, "maskDepth": 0, "maskDepthLayer": 0, "layerType": "image", "width": 1.0494241316270567, "widthMode": 0, "height": 1.26, "heightMode": 0, "left": 0.5120138888888889, "top": 0.5, "src": "https://assets.unicorn.studio/images/h9qVTpa8SSUTciu2CoNHtQybZxR2/paste_1778181214898.png", "imageNaturalSize": {"type": "Vec2", "_x": 1848, "_y": 1641}, "compiledFragmentShaders": ["#version 300 es\n// Copyright (c) Unicorn Studio. Licensed under the Unicorn Studio Commercial License.\n// Unauthorized copying, redistribution, or use in competing products is prohibited.\nprecision highp float;in vec2 vTextureCoord;\nin vec3 vVertexPosition;uniform sampler2D uSourceImage;uniform vec2 uArtboardResolution;\nuniform vec2 uMousePos;\nuniform sampler2D uBgTexture;const float TAU = 6.28318530718;\nconst float PI = 3.14159265359;out vec4 fragColor;vec2 rotate2D(vec2 p, float angle) {\nfloat s = sin(angle);\nfloat c = cos(angle);\nreturn vec2(p.x * c - p.y * s, p.x * s + p.y * c);\n}vec2 getAnchorOffsets() {\nreturn vec2(0.5, 0.5);\n}vec4 sampleImage(vec2 canvasUV, vec2 mouseOffset, vec2 mouseRotOffset) {\nvec2 canvasPos = vec2(canvasUV.x * uArtboardResolution.x, (1.0 - canvasUV.y) * uArtboardResolution.y);\nvec2 imageUV;float absWidth = 1.0494 * uArtboardResolution.x;\nfloat absHeight = 1.2600 * uArtboardResolution.y;\nabsWidth = absWidth;\nabsHeight = (0 != 2 && 0 == 2) ? absWidth / 1.3326 : absHeight;vec2 elementSizePx = vec2(absWidth, absHeight);\nvec2 elementPosPx = vec2(0.5120, 0.5000) * uArtboardResolution - getAnchorOffsets() * elementSizePx;vec2 centerPos = elementPosPx + (elementSizePx * 0.5);\nvec2 relPos = canvasPos - centerPos + mouseOffset;\nvec2 unrotatedRelPos = rotate2D(relPos, 0.0000 * -TAU);\nvec2 elementPos = unrotatedRelPos + (elementSizePx * 0.5);\nimageUV = elementPos / elementSizePx;\nvec2 flippedUV = vec2(imageUV.x, 1.0 - imageUV.y);\nvec4 color = textureLod(uSourceImage, flippedUV, 0.0);\nif (imageUV.x >= 0.0 && imageUV.x <= 1.0 && imageUV.y >= 0.0 && imageUV.y <= 1.0) {\nreturn color;\n} else {\nreturn vec4(0.0);\n}\n}vec4 getNormalOutput(vec4 color, vec4 background) {\nreturn mix(background, color + background * (1.0 - color.a), 1.0000);\n}vec4 getOutputByMode(vec4 color, vec4 background) {\nreturn getNormalOutput(color, background);\n}vec4 applyImageAdjustments(vec4 color) {color.rgb = clamp(color.rgb, 0.0, 1.0);\ncolor.rgb *= color.a;\nreturn color;\n}vec4 getCompositeOutput(vec2 uv, vec2 mouseOffsetPx, vec2 mouseRotOffset) {\nvec4 background = vec4(0);background = texture(uBgTexture, vTextureCoord);\nvec4 color = sampleImage(uv, mouseOffsetPx, mouseRotOffset);\ncolor = applyImageAdjustments(color);return getOutputByMode(color, background);\n}void main() {\nvec2 uv = vTextureCoord;\nvec2 mouseOffsetUV = (uMousePos - 0.5) * 0.0000;\nvec2 mouseOffsetPx = mouseOffsetUV;\nvec2 mouseRotOffset = (uMousePos - 0.5) * 0.0000 * PI * 0.5;\nuv -= mouseOffsetUV;\nfragColor = getCompositeOutput(uv, mouseOffsetPx, mouseRotOffset);\n}"], "compiledVertexShaders": ["#version 300 es\n// Copyright (c) Unicorn Studio. Licensed under the Unicorn Studio Commercial License.\n// Unauthorized copying, redistribution, or use in competing products is prohibited.\nprecision highp float;in vec3 aVertexPosition;\nin vec2 aTextureCoord;uniform mat4 uMVMatrix;\nuniform mat4 uPMatrix;\nuniform vec2 uMousePos;out vec2 vTextureCoord;\nout vec3 vVertexPosition;void main() {\nfloat angleX = uMousePos.y * 0.5 - 0.25;\nfloat angleY = (1.-uMousePos.x) * 0.5 - 0.25;mat4 rotateX = mat4(1.0, 0.0, 0.0, 0.0,\n0.0, cos(angleX), -sin(angleX), 0.0,\n0.0, sin(angleX), cos(angleX), 0.0,\n0.0, 0.0, 0.0, 1.0);\nmat4 rotateY = mat4(cos(angleY), 0.0, sin(angleY), 0.0,\n0.0, 1.0, 0.0, 0.0,\n-sin(angleY), 0.0, cos(angleY), 0.0,\n0.0, 0.0, 0.0, 1.0);mat4 rotationMatrix = rotateX * rotateY;\ngl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);\nvVertexPosition = (rotationMatrix * vec4(aVertexPosition, 1.0)).xyz;\nvTextureCoord = (vec4(aTextureCoord, 0.0, 1.0)).xy;\n}"], "data": {"uniforms": {"artboardResolution": {"name": "uArtboardResolution", "type": "2f", "value": {"type": "Vec2", "_x": 1600, "_y": 900}}, "aspectRatio": {"name": "uAspectRatio", "type": "1f", "value": 1.3326020719073737}}, "elementOpacity": 1}, "id": "f2fac8e3-3a9d-47aa-8159-eef914f8f981", "publicId": "image"}, {"breakpoints": [], "visible": true, "aspectRatio": 1, "userDownsample": 1, "layerType": "effect", "type": "projection", "usesPingPong": false, "texture": false, "animating": true, "mouseMomentum": 0, "mouseSpring": 0, "isMask": 0, "compiledFragmentShaders": ["#version 300 es\n// Copyright (c) Unicorn Studio. Licensed under the Unicorn Studio Commercial License.\n// Unauthorized copying, redistribution, or use in competing products is prohibited.\nprecision highp float;in vec3 vVertexPosition;\nin vec2 vTextureCoord;uniform sampler2D uTexture;\nuniform float uTime;uniform vec2 uMousePos;const float PI = 3.14159265359;vec3 getRayDirection(vec2 uv, vec2 mousePos, float aspect) {\nvec2 screenPos = (uv - 0.5) * 2.0;\nscreenPos.x *= aspect;\nscreenPos.y *= -1.0;\nfloat minFOV = radians(20.0);\nfloat maxFOV = radians(120.0);\nfloat fov = mix(minFOV, maxFOV, 0.0000);\nvec3 rayDir = normalize(vec3(screenPos.x * tan(fov/2.0),\nscreenPos.y * tan(fov/2.0),\n-1.0));\nfloat rotX = (mousePos.y - 0.5) * PI;\nfloat rotY = (mousePos.x - 0.5) * PI * 2.0;\nmat3 rotateY = mat3(\ncos(rotY), 0.0, -sin(rotY),\n0.0, 1.0, 0.0,\nsin(rotY), 0.0, cos(rotY)\n);\nmat3 rotateX = mat3(\n1.0, 0.0, 0.0,\n0.0, cos(rotX), sin(rotX),\n0.0, -sin(rotX), cos(rotX)\n);\nreturn normalize(rotateX * rotateY * rayDir);\n}vec2 directionToUVHorizontal(vec3 dir) {\nfloat longitude = atan(dir.z, dir.x);\nfloat latitude = acos(dir.y);\nvec2 uv;\nuv.x = longitude / (2.0 * PI) + 0.5;\nuv.y = latitude / PI;\nuv.x += 0.25;\nreturn uv;\n}vec2 directionToUVVertical(vec3 dir) {\nfloat longitude = atan(dir.z, dir.y);\nfloat latitude = acos(dir.x);\nvec2 uv;\nuv.y = longitude / PI * -1.;\nuv.x = (latitude / (2.0 * PI) + 0.5) * -1.;\nuv.x = fract(uv.x + 0.25);\nreturn uv;\n}out vec4 fragColor;vec2 applyRepeat(vec2 uv) {\nreturn vec2(fract(uv.x), uv.y);\n}vec2 distortUV(vec2 uv) {\nfloat aspect = 2.;\nvec2 mPos = vec2(0.5, 0.5) + mix(vec2(0), (uMousePos-0.5), 0.0000 * 0.5);\nvec3 rayDir = getRayDirection(uv, mPos, aspect);\nvec2 uvHorizontal = directionToUVHorizontal(rayDir);\nvec2 uvVertical = directionToUVVertical(rayDir);\nvec2 sphereUV = mix(uvHorizontal, uvVertical, 0.3700);\nfloat minFOV = radians(20.0);\nfloat maxFOV = radians(120.0);\nfloat currentFOV = mix(minFOV, maxFOV, 0.0000);\nfloat fovCompensation = tan(currentFOV/2.0);\nfloat compensatedScale = (mix(-0.1, 0.4, 0.1400) * 12.0 + 2.0) * (1.0/fovCompensation);\nsphereUV = (sphereUV - 0.5) * compensatedScale + 0.5;sphereUV += vec2(0.18, 0) * uTime * 0.005;return applyRepeat(sphereUV);\n}void main() {\nvec2 uv = vTextureCoord;\nuv = distortUV(uv);\nvec4 col = texture(uTexture, uv);\nfragColor = col;}"], "compiledVertexShaders": ["#version 300 es\n// Copyright (c) Unicorn Studio. Licensed under the Unicorn Studio Commercial License.\n// Unauthorized copying, redistribution, or use in competing products is prohibited.\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": "9b3115bc-8dd6-4147-950e-ed65cdc09fb3", "publicId": "projection"}, {"breakpoints": [], "visible": true, "aspectRatio": 1, "userDownsample": 1, "layerType": "effect", "type": "mouse", "usesPingPong": true, "texture": false, "animating": false, "mouseMomentum": 0, "mouseSpring": 0, "isMask": 0, "compiledFragmentShaders": ["#version 300 es\n// Copyright (c) Unicorn Studio. Licensed under the Unicorn Studio Commercial License.\n// Unauthorized copying, redistribution, or use in competing products is prohibited.\nprecision highp float;in vec2 vTextureCoord;\nin vec3 vVertexPosition;uniform sampler2D uTexture;\nuniform sampler2D uPingPongTexture;\nuniform vec2 uResolution;const float PI = 3.14159265359;\nconst float ITERATIONS = 24.0;float getGaussianWeight(int index) {\nswitch(index) {\ncase 0: return 0.7978845608028654;\ncase 1: return 0.795118932516684;\ncase 2: return 0.7868794322038799;\ncase 3: return 0.7733362336056986;\ncase 4: return 0.7547664553859864;\ncase 5: return 0.7315447328280048;\ncase 6: return 0.704130653528599;\ncase 7: return 0.6730536454899063;\ncase 8: return 0.6388960110447045;\ncase 9: return 0.6022748643096089;\ncase 10: return 0.5638237508206051;\ncase 11: return 0.5241747061566029;\ncase 12: return 0.48394144903828673;\ncase 13: return 0.443704309411472;\ncase 14: return 0.40399737110811773;\ncase 15: return 0.36529817077804383;\ncase 16: return 0.3280201493519873;\ncase 17: return 0.29250790855907144;\ncase 18: return 0.2590351913317835;\ncase 19: return 0.2278053882403838;\ncase 20: return 0.19895427758549736;\ncase 21: return 0.17255463765302306;\ncase 22: return 0.1486223271179862;\ncase 23: return 0.12712341303392466;\ndefault: return 0.0;\n}\n}out vec4 fragColor;vec3 decodeTrailField(vec4 color) {\nfloat density = color.b;\nif (density <= 0.0001) {\nreturn vec3(0.0);\n}\nreturn vec3(color.rg * 2.0 - 1.0, density);\n}vec3 chromatic_aberration(vec3 color, vec2 uv, vec2 offset) {\nvec4 left = texture(uTexture, uv - offset);\nvec4 right = texture(uTexture, uv + offset);color.r = left.r;\ncolor.b = right.b;return color;\n}vec4 blurTrail(vec2 uv, vec2 mouseDir) {\nif (dot(mouseDir, mouseDir) <= 1e-8) {\nreturn texture(uTexture, uv);\n}\nvec2 distorted = mouseDir * 0.4;\nfloat total_weight = 0.0;\nvec4 color = vec4(0);\nfloat scale = 0.0001 + 0.5000 * 0.5;for (int i = 0; i <= 9; i++) {\nfloat weight = getGaussianWeight(i);\nvec2 offset = distorted * (1.5 + scale) * mix(1.0, float(i) / ITERATIONS, scale);\nvec2 st = uv - offset;\nvec4 samp = texture(uTexture, st);\nsamp.rgb = chromatic_aberration(samp.rgb, st, offset * 0.2500 * 0.12);\ncolor += weight * samp;\ntotal_weight += weight;\n}return color / total_weight;\n}vec4 getTrailColor(vec2 uv, vec2 mouseDir, float strength, float aspectRatio) {\nvec4 color = vec4(0);return blurTrail(uv, mouseDir);\n}void main() {\nvec2 uv = vTextureCoord;\nvec2 pingpongUv = uv;\nfloat aspectRatio = uResolution.x / uResolution.y;vec3 mouseTrail = decodeTrailField(texture(uPingPongTexture, pingpongUv));\nfloat strength = mouseTrail.z * (0.5000 * 1.5);\nvec2 direction = length(mouseTrail.xy) > 0.0001 ? normalize(mouseTrail.xy) : vec2(0.0);\nvec2 mouseDir = direction * strength;vec4 color = getTrailColor(uv, mouseDir, strength, aspectRatio);\nfragColor = color;\n}", "#version 300 es\n// Copyright (c) Unicorn Studio. Licensed under the Unicorn Studio Commercial License.\n// Unauthorized copying, redistribution, or use in competing products is prohibited.\nprecision highp float;in vec3 vVertexPosition;\nin vec2 vTextureCoord;uniform sampler2D uPingPongTexture;\nuniform vec2 uPreviousMousePos;uniform vec2 uMousePos;\nuniform vec2 uResolution;const float PI = 3.14159265359;out vec4 fragColor;vec3 decodeTrailField(vec4 color) {\nfloat density = color.b;\nif (density <= 0.0001) {\nreturn vec3(0.0);\n}\nreturn vec3(color.rg * 2.0 - 1.0, density);\n}vec4 encodeTrailField(vec2 vector, float density) {\ndensity = clamp(density, 0.0, 1.0);\nif (density <= 0.0001) {\nreturn vec4(0.5, 0.5, 0.0, 1.0);\n}\nvec2 packedVector = clamp(vector, vec2(-1.0), vec2(1.0)) * 0.5 + 0.5;\nreturn vec4(packedVector, density, 1.0);\n}vec3 crossBlurTrailField(sampler2D tex, vec2 uv, float radius) {\nvec3 field = decodeTrailField(texture(tex, uv)) * 0.4;\nfield += decodeTrailField(texture(tex, uv + vec2(radius, 0.0))) * 0.15;\nfield += decodeTrailField(texture(tex, uv + vec2(-radius, 0.0))) * 0.15;\nfield += decodeTrailField(texture(tex, uv + vec2(0.0, radius))) * 0.15;\nfield += decodeTrailField(texture(tex, uv + vec2(0.0, -radius))) * 0.15;\nreturn field;\n}void main() {\nfloat aspectRatio = uResolution.x / uResolution.y;\nvec2 aspectVec = vec2(aspectRatio, 1.0);\nvec2 uv = vTextureCoord;\nvec2 correctedUv = uv * aspectVec;vec2 dir = (uMousePos - uPreviousMousePos) * aspectVec;\nfloat dist = length(dir);\nif (dist > 0.0) {\ndir = dir / dist;\n} else {\ndir = vec2(1.0, 0.0);\n}float rad = 0.2100 * 0.6 * mix(aspectRatio, 1.0, 0.5);\nvec3 lastField = vec3(0.0);float t = dist > 0.0 ? clamp(dot(correctedUv - uPreviousMousePos * aspectVec, dir) / dist, 0.0, 1.0) : 0.0;\nvec2 closestPoint = mix(uPreviousMousePos, uMousePos, t) * aspectVec;\nfloat distanceToLine = distance(correctedUv, closestPoint);float shrink = mix(0.5, 1.0, clamp(dist * 20.0, 0.0, 1.0));\nrad *= shrink;float s = 1.0 - smoothstep(rad * 0.0000, rad, distanceToLine);s = s * s;vec2 sampleUv = mix(uv, uv / (1.0 + 0.0000 * 0.03) + 0.0000 * 0.015, 0.0000);lastField = crossBlurTrailField(uPingPongTexture, sampleUv, 0.003);\nfloat decay = pow(0.6700, 0.1);\nvec2 decayedVector = lastField.xy * decay;\nfloat decayedDensity = lastField.z * decay;\nfloat currentDensity = clamp(min(1.0, dist * 10.0) * s, 0.0, 1.0);\nvec2 currentVector = dir * currentDensity;vec2 drawVector = decayedVector + currentVector;\nfloat drawDensity = max(decayedDensity, currentDensity);fragColor = encodeTrailField(drawVector, drawDensity);\n}"], "compiledVertexShaders": ["#version 300 es\n// Copyright (c) Unicorn Studio. Licensed under the Unicorn Studio Commercial License.\n// Unauthorized copying, redistribution, or use in competing products is prohibited.\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}", "#version 300 es\n// Copyright (c) Unicorn Studio. Licensed under the Unicorn Studio Commercial License.\n// Unauthorized copying, redistribution, or use in competing products is prohibited.\nprecision mediump float;in vec3 aVertexPosition;\nin vec2 aTextureCoord;uniform mat4 uMVMatrix;\nuniform mat4 uPMatrix;out vec2 vTextureCoord;\nout vec3 vVertexPosition;void main() {\ngl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);\nvTextureCoord = aTextureCoord;\n}"], "data": {"depth": false, "uniforms": {}, "isBackground": false}, "id": "f7b55304-69bb-4b3f-9d8b-57a52ce79bf1", "publicId": "mouse_trail"}, {"breakpoints": [], "visible": true, "aspectRatio": 1, "userDownsample": 1, "layerType": "effect", "type": "glyphDither", "usesPingPong": false, "texture": {"src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAAoCAYAAAA16j4lAAAFL0lEQVR4AeybTSi1WxTH1/O+vr+SIp8ThVAmyIARSgkpxRAxoJgoURIDwshIBsiImZIJykfKwIAUJUaSjxHlO4R77/+5d+22N8/r3Ofs43nu2bfeddbay7bXb6//65zn6/wgoj/+N//tAQT+S1///9fS0kJnZ2f09PREz8/PlhYREeGzZgQGBtLDw4NlbbCBEayqILQQuKmpicbHxykpKYmCg4MpKCjI0n788F1LQkNDKSwszLI22MAIVjCrENl3u1FBp2iN3t5eRSt93zKqmLUQODY2VigzMzNDqamplnZ7eyvmqg6w9u9qg41rysycs+O1EFh+20WTj4+PycrsNPHf/I5VXeTBxmvJzJyz47UQWG6MqsbJa6qKfcGmhcBvb29Cg6ysLBG7LZDZZGZvOLUQ+ObmRvQoIyMDsStNZpOZvYHVQuDDw0PRo7i4OMrJyRFjtwRgAhvzyMycs+O1EHhwcPBDb5aWlj6M3TD4lWlgYEAJlhYCr62t0c7OjmhYQkICjY2NibHTAVjAxBxgXV9f56FXXguB0aGSkhK6v79HaFprayvl5eWZsZMvYAALM4ARrDz21msjMA5aKioqRL8Mw6Cenh4xdioAg2EYojwYwSoSXgbaCIw+bWxs0O7uLkLTioqKTO/ki8wANjCq5NFKYDQOd2zgYVFRUXCOWmRkpKgvs4mkl4FWAhcXF1N+fr5o2cXFhYidCmSGgoICAqNKll8EVrn096+FS32FhYXEVlZWRrjtNjw8TAcHB7SyskIBAQECDJ9/YuBQ0NnZKSqDH4xgBTPYsQfeT3p6upjraeBXAuNm/ebmJrHh3HJycpK6urooMzOTDOPvg5m7uztqbm6m2dlZT/vks3lzc3PU1tZGLy8vZg3DMExWMIMde+D9HB0dUUhIiDnP0xe/EtiTTeOJCjwxMTU15cn0b5mD8+DKykrzaY+vCuJhha/myD/3K4FfX1/Nc12cS8Jw0PL+/i7vl8LDwwn3Xbe3tz/knRrgbXlra4uWl5dNNpkD7NgD9sKGPcpzvor9SuDHx0fCUSkbHpH5+fOnmevo6KDLy0vRj9zcXJqYmBBjpwK8DePgiuuDEazYA9ixB8Rs2CPP9cT7lcBWG8b//tHRUUpJSaHr62sxraqqSsROBdXV1aI02JKTkwmsYBY/8CLQQmDuD97ucJ2Xx9HR0Rw65vGRwcXBhic+eazCayUwGpadnQ1n2snJiemdfJEZZDZVTFoJPDQ0RPHx8aJ3i4uL/8TOOZkBbGBUSaONwLhChHNLbh4OVtxwoQMMYGEuMIKVx956LQTG0ej8/Ly40IGm1dTUmKdUiJ00HEyBhRkMwyCwgplz3ngtBG5vbzdPlbhRCwsLhCtEPHbagwVMzIFTIjDz2BuvhcCNjY2iR7hQUFtbK8ZuCerq6ghszCMzc86O10LgxMRE0ZvT01Pzy18i4ZIAp3BgYxyZmXN2vBYC4yYEN2dvb49D1/n9/X3BJDOLpI1AC4Hlvsj3X+W8G+Lz83PlGNoJrLyDLl/w9wK7HN5TPL7Xivk4mJmenqbPrL+/H1N8ZvgC+Gd1OVdaWipqy8wiaSPQQmD5WwIxMTHU0NDwqfX19ZEvn9PCnaEGi9rIp6WlCQllZpG0EWghcH19vXhiwkaPvv1X8NcLZhWFtRAYfw047RgZGSFc+11dXSUrU303RxYJa1vVRR5sYAQrmOXftRtrITCac3V1Rd3d3VReXk74rLMyiID5vjCsbVUXebCBEayq6msjsKqG/dfW+RMAAP//boEgigAAAAZJREFUAwBJHc/3KzvgxAAAAABJRU5ErkJggg==", "sampler": "uCustomTexture"}, "animating": false, "mouseMomentum": 0, "mouseSpring": 0, "isMask": 0, "compiledFragmentShaders": ["#version 300 es\n// Copyright (c) Unicorn Studio. Licensed under the Unicorn Studio Commercial License.\n// Unauthorized copying, redistribution, or use in competing products is prohibited.\nprecision highp float;in vec3 vVertexPosition;\nin vec2 vTextureCoord;\nuniform sampler2D uTexture;\nuniform sampler2D uSprite;\nuniform sampler2D uCustomTexture;uniform vec2 uMousePos;\nuniform vec2 uResolution;vec4 applyLayerMixAlpha(vec4 color, vec4 bg, float amount) {\nreturn mix(bg, color, amount);\n}out vec4 fragColor;const vec3 LUMA = vec3(0.2126, 0.7152, 0.0722);float getLuminance(vec3 color) {\nreturn dot(color, LUMA);\n}float getGridSize() {\nreturn mix(0.05, 0.005, 0.9400);\n}vec2 getCellSize(float gridSize, float aspectRatio, float aspectCorrection) {\nfloat baseGrid = 1.0 / gridSize;\nreturn vec2(1.0 / (baseGrid * aspectRatio), 1.0 / baseGrid) * aspectCorrection;\n}vec2 getPixelatedCoord(vec2 uv, vec2 pos, vec2 cellSize) {\nvec2 offsetUv = uv - pos;\nvec2 cell = floor(offsetUv / cellSize);\nvec2 cellCenter = (cell + 0.5) * cellSize;\nreturn cellCenter + pos;\n}ivec2 getGlyphTextureSize() {\nivec2 glyphTextureSize = textureSize(uSprite, 0);glyphTextureSize = textureSize(uCustomTexture, 0);return glyphTextureSize;\n}float getGlyphHeight(ivec2 glyphTextureSize) {\nreturn float(glyphTextureSize.y);\n}float getGlyphCount(ivec2 glyphTextureSize) {\nfloat glyphHeight = getGlyphHeight(glyphTextureSize);\nreturn max(1.0, float(glyphTextureSize.x) / glyphHeight);\n}float getGlyphSelection(float luminance, float glyphCount) {\nreturn clamp(floor(luminance * glyphCount), 0.0, glyphCount - 1.0);\n}float getPhasedGlyphSelection(float luminance, float glyphCount, float gamma) {\nfloat glyphSelection = clamp(floor(luminance * glyphCount * gamma), 0.0, glyphCount - 1.0);\nfloat phaseOffset = floor(0.0000 * glyphCount + 0.5);\nreturn mod(glyphSelection + phaseOffset, glyphCount);\n}vec2 getGlyphSheetUv(vec2 uv, vec2 pos, float aspectRatio, float aspectCorrection, float gridSize, float glyphHeight, float glyphSelection, float glyphCount) {\nfloat normalizedSpriteSizeX = 1.0 / glyphCount;\nfloat normalizedSpriteSizeY = 1.0;\nvec2 spriteSize = vec2(glyphHeight / aspectRatio, glyphHeight) * (gridSize / glyphHeight) * aspectCorrection;\nvec2 localOffset = mod(uv - pos, spriteSize) / spriteSize;\nfloat inset = 0.5 / glyphHeight;\nlocalOffset = clamp(localOffset, inset, 1.0 - inset);return vec2(\nglyphSelection * normalizedSpriteSizeX + localOffset.x * normalizedSpriteSizeX,\nlocalOffset.y * normalizedSpriteSizeY\n);\n}vec4 sampleGlyphColor(vec2 glyphUv) {\nvec4 glyphColor = vec4(0.0);glyphColor = texture(uCustomTexture, glyphUv);return glyphColor;\n}void main() {\nvec2 uv = vTextureCoord;\nvec2 pos = vec2(0.5, 0.5) + mix(vec2(0), (uMousePos-0.5), 0.0000);\nfloat aspectRatio = uResolution.x / uResolution.y;\nfloat aspectCorrection = mix(aspectRatio, 1./aspectRatio, 0.5);\nfloat gridSize = getGridSize();\nvec2 cellSize = getCellSize(gridSize, aspectRatio, aspectCorrection);\nvec2 pixelatedCoord = getPixelatedCoord(uv, pos, cellSize);\nvec4 bg = texture(uTexture, vTextureCoord);\nvec4 color = texture(uTexture, pixelatedCoord);float luminance = getLuminance(color.rgb);\nluminance = mix(luminance, 1.0 - luminance, float(0));\nfloat gamma = pow(mix(0.2, 2.2, 0.5600), 2.2);\nivec2 glyphTextureSize = getGlyphTextureSize();\nfloat glyphHeight = getGlyphHeight(glyphTextureSize);\nfloat glyphCount = getGlyphCount(glyphTextureSize);\nfloat glyphSelection = getGlyphSelection(luminance, glyphCount);\nfloat phasedGlyphSelection = getPhasedGlyphSelection(luminance, glyphCount, gamma);\nvec2 spriteSheetUV = getGlyphSheetUv(uv, pos, aspectRatio, aspectCorrection, gridSize, glyphHeight, phasedGlyphSelection, glyphCount);\nvec4 spriteColor = sampleGlyphColor(spriteSheetUV);\nfloat alpha = smoothstep(0.0, 1.0, spriteColor.r);vec3 cc = (color.rgb - glyphSelection * 0.04) * 1.4;\nvec3 col = cc;vec3 result = mix(mix(vec3(0.0), vec3(1.0), float(0)), col, alpha);\ncolor.rgb = result;\ncolor.a = alpha;\ncolor = applyLayerMixAlpha(color, bg, 1.0000);\nfragColor = color;}"], "compiledVertexShaders": ["#version 300 es\n// Copyright (c) Unicorn Studio. Licensed under the Unicorn Studio Commercial License.\n// Unauthorized copying, redistribution, or use in competing products is prohibited.\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, "texture": {"sampler": "uCustomTexture", "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAAoCAYAAAA16j4lAAAFL0lEQVR4AeybTSi1WxTH1/O+vr+SIp8ThVAmyIARSgkpxRAxoJgoURIDwshIBsiImZIJykfKwIAUJUaSjxHlO4R77/+5d+22N8/r3Ofs43nu2bfeddbay7bXb6//65zn6/wgoj/+N//tAQT+S1///9fS0kJnZ2f09PREz8/PlhYREeGzZgQGBtLDw4NlbbCBEayqILQQuKmpicbHxykpKYmCg4MpKCjI0n788F1LQkNDKSwszLI22MAIVjCrENl3u1FBp2iN3t5eRSt93zKqmLUQODY2VigzMzNDqamplnZ7eyvmqg6w9u9qg41rysycs+O1EFh+20WTj4+PycrsNPHf/I5VXeTBxmvJzJyz47UQWG6MqsbJa6qKfcGmhcBvb29Cg6ysLBG7LZDZZGZvOLUQ+ObmRvQoIyMDsStNZpOZvYHVQuDDw0PRo7i4OMrJyRFjtwRgAhvzyMycs+O1EHhwcPBDb5aWlj6M3TD4lWlgYEAJlhYCr62t0c7OjmhYQkICjY2NibHTAVjAxBxgXV9f56FXXguB0aGSkhK6v79HaFprayvl5eWZsZMvYAALM4ARrDz21msjMA5aKioqRL8Mw6Cenh4xdioAg2EYojwYwSoSXgbaCIw+bWxs0O7uLkLTioqKTO/ki8wANjCq5NFKYDQOd2zgYVFRUXCOWmRkpKgvs4mkl4FWAhcXF1N+fr5o2cXFhYidCmSGgoICAqNKll8EVrn096+FS32FhYXEVlZWRrjtNjw8TAcHB7SyskIBAQECDJ9/YuBQ0NnZKSqDH4xgBTPYsQfeT3p6upjraeBXAuNm/ebmJrHh3HJycpK6urooMzOTDOPvg5m7uztqbm6m2dlZT/vks3lzc3PU1tZGLy8vZg3DMExWMIMde+D9HB0dUUhIiDnP0xe/EtiTTeOJCjwxMTU15cn0b5mD8+DKykrzaY+vCuJhha/myD/3K4FfX1/Nc12cS8Jw0PL+/i7vl8LDwwn3Xbe3tz/knRrgbXlra4uWl5dNNpkD7NgD9sKGPcpzvor9SuDHx0fCUSkbHpH5+fOnmevo6KDLy0vRj9zcXJqYmBBjpwK8DePgiuuDEazYA9ixB8Rs2CPP9cT7lcBWG8b//tHRUUpJSaHr62sxraqqSsROBdXV1aI02JKTkwmsYBY/8CLQQmDuD97ucJ2Xx9HR0Rw65vGRwcXBhic+eazCayUwGpadnQ1n2snJiemdfJEZZDZVTFoJPDQ0RPHx8aJ3i4uL/8TOOZkBbGBUSaONwLhChHNLbh4OVtxwoQMMYGEuMIKVx956LQTG0ej8/Ly40IGm1dTUmKdUiJ00HEyBhRkMwyCwgplz3ngtBG5vbzdPlbhRCwsLhCtEPHbagwVMzIFTIjDz2BuvhcCNjY2iR7hQUFtbK8ZuCerq6ghszCMzc86O10LgxMRE0ZvT01Pzy18i4ZIAp3BgYxyZmXN2vBYC4yYEN2dvb49D1/n9/X3BJDOLpI1AC4Hlvsj3X+W8G+Lz83PlGNoJrLyDLl/w9wK7HN5TPL7Xivk4mJmenqbPrL+/H1N8ZvgC+Gd1OVdaWipqy8wiaSPQQmD5WwIxMTHU0NDwqfX19ZEvn9PCnaEGi9rIp6WlCQllZpG0EWghcH19vXhiwkaPvv1X8NcLZhWFtRAYfw047RgZGSFc+11dXSUrU303RxYJa1vVRR5sYAQrmOXftRtrITCac3V1Rd3d3VReXk74rLMyiID5vjCsbVUXebCBEayq6msjsKqG/dfW+RMAAP//boEgigAAAAZJREFUAwBJHc/3KzvgxAAAAABJRU5ErkJggg==", "name": "Custom glyphs"}}, "id": "5a30ecf5-b2e6-4d32-8bbc-14ae6587f97b", "publicId": "glyph_dither"}], "options": {"name": "Copy of Garden (Remix)", "fps": 60, "dpi": 1.5, "scale": 1, "includeLogo": false, "isProduction": false, "flatten": false, "freePlan": false}, "version": "2.1.12", "id": "NZqlNS6kaJjAGRQHf9Or", "designName": "Copy of Garden (Remix)", "designId": "elikpI4HeRmpLvzBL8y5", "projectName": "Copy of Garden (Remix)", "sceneName": "Scene"}