{"history":[{"layerType":"flattened","id":"flat_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;\nin vec2 vTextureCoord;\nin vec3 vVertexPosition;\n\nuniform float uL1100_Opacity;\nuniform vec2 uMousePos;\nuniform vec2 uResolution;\nuniform sampler2D uL0_Thumbnail;\nuniform sampler2D uL0_VideoTexture;\nuniform float uL0_ElemOpacity;\nuniform float uL1_Thickness;\nuniform float uL1_Time;\nuniform float uL1_ElemOpacity;\nuniform sampler2D uL300_SourceImage;\nuniform vec2 uArtboardResolution;\nuniform vec2 uL300_MousePos;\nuniform float uL301_ElemOpacity;\nuniform vec2 uL302_MousePos;\nuniform float uL302_ElemOpacity;\nuniform float uL2_ElemOpacity;\nuniform float uL3_Time;\nuniform vec2 uL3_MousePos;\nuniform float uL3_ElemOpacity;\n\nconst float PI = 3.14159265359;\nconst float TAU = 6.28318530718;\nconst float TWO_PI_L1 = 2.0 * PI;\n\nout vec4 fragColor;\n\nvec3 getColor_L1100(int index) {\nswitch(index) {\ncase 0: return vec3(0, 0, 0);\ndefault: return vec3(0.0);\n}\n}\nvec2 rotate_L1100(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}\nvec3 getColor_L1100(vec2 uv) {\nreturn vec3(0, 0, 0);\n}\nvec4 applyAdjustments_L0(vec4 color) {\ncolor.rgb = clamp(color.rgb, 0.0, 1.0);\nreturn color;\n}\nvec3 blend (int blendMode, vec3 src, vec3 dst) {\nreturn src + dst;\n}\nuvec2 pcg2d_L1(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_L1(vec2 p) {\nuvec2 v = floatBitsToUint(p);\nv = pcg2d_L1(v);\nuint r = v.x ^ v.y;\nreturn float(r) / float(0xffffffffu);\n}\nfloat deband_L1() {\nreturn (randFibo_L1(gl_FragCoord.xy) - 0.5) / 255.0;\n}\nvec3 Tonemap_tanh_L1(vec3 x) {\nx = clamp(x, -40.0, 40.0);\nreturn (exp(x) - exp(-x)) / (exp(x) + exp(-x));\n}\nfloat luma(vec3 color) {\nreturn dot(color, vec3(0.299, 0.587, 0.114));\n}\nfloat drawLine_L1(vec2 uv, vec2 center, float scale, float angle, float time, float phaseVal, float thickness) {\nfloat radAngle = -angle * TWO_PI_L1;\nfloat phase = fract(time * 0.01 + phaseVal) * (3. * max(1., scale)) - (1.5 * max(1., scale));\nvec2 direction = vec2(cos(radAngle), sin(radAngle));\nvec2 centerToPoint = uv - center;\nfloat projection = dot(centerToPoint, direction);\nfloat distToLine = length(centerToPoint - projection * direction);\nfloat lineRadius = thickness * 0.25;\nfloat brightness = lineRadius / max(0.0001, 1. - smoothstep(0.4, 0., distToLine + 0.02));\nfloat glowRadius = scale;\nfloat glow = smoothstep(glowRadius, 0.0, abs(projection - phase));\nreturn brightness * (1.-distToLine)*(1.-distToLine) * glow;\n}\nfloat getBeam_L1(vec2 uv, vec2 pos, float radius, float angleVal, float skewVal, float thickness, float time, float phaseVal, vec2 resolution) {\nreturn drawLine_L1(uv, pos, radius, angleVal, time, phaseVal, thickness);\n}\nvec2 rotate2D_L300(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}\nvec2 apply3DRotation_L300(vec2 uv, vec2 elementCenter, vec2 elementSize, float rotX, float rotY, float fov, vec2 mouseRotOffset) {\nfloat angleX = rotX * TAU + mouseRotOffset.y;\nfloat angleY = rotY * TAU + mouseRotOffset.x;\nif (abs(angleX) < 0.001 && abs(angleY) < 0.001) {\nreturn uv;\n}\nvec2 pos = uv - 0.5;\nfloat aspect = elementSize.x / elementSize.y;\npos.x *= aspect;\nfloat focalLength = mix(0.5, 4.0, fov);\nfloat cosX = cos(angleX);\nfloat sinX = sin(angleX);\nfloat cosY = cos(angleY);\nfloat sinY = sin(angleY);\nvec3 rayDir = normalize(vec3(pos.x, pos.y, focalLength));\nvec3 r1;\nr1.x = rayDir.x * cosY - rayDir.z * sinY;\nr1.y = rayDir.y;\nr1.z = rayDir.x * sinY + rayDir.z * cosY;\nvec3 r2;\nr2.x = r1.x;\nr2.y = r1.y * cosX + r1.z * sinX;\nr2.z = -r1.y * sinX + r1.z * cosX;\nvec3 camPos = vec3(0.0, 0.0, -focalLength);\nvec3 c1;\nc1.x = camPos.x * cosY - camPos.z * sinY;\nc1.y = camPos.y;\nc1.z = camPos.x * sinY + camPos.z * cosY;\nvec3 c2;\nc2.x = c1.x;\nc2.y = c1.y * cosX + c1.z * sinX;\nc2.z = -c1.y * sinX + c1.z * cosX;\nif (abs(r2.z) < 0.01) {\nreturn vec2(-1.0);\n}\nfloat t = -c2.z / r2.z;\nif (t < 0.0 || t > 50.0) {\nreturn vec2(-1.0);\n}\nvec2 intersection = vec2(c2.x + t * r2.x, c2.y + t * r2.y);\nif (abs(intersection.x) > 2.0 || abs(intersection.y) > 2.0) {\nreturn vec2(-1.0);\n}\nintersection.x /= aspect;\nreturn intersection + 0.5;\n}\nvec2 getAnchorOffsets_L300() {\nreturn vec2(0.5, 0.5);\n}\nvec4 sampleImage_L300(vec2 canvasUV, vec2 mouseOffset, vec2 mouseRotOffset) {\nvec2 canvasPos = vec2(canvasUV.x * uArtboardResolution.x, (1.0 - canvasUV.y) * uArtboardResolution.y);\nvec2 imageUV;\nfloat absWidth = 0.7300 * uArtboardResolution.x;\nfloat absHeight = 0.7657 * uArtboardResolution.y;\nabsWidth = absWidth;\nabsHeight = (0 != 2 && 2 == 2) ? absWidth / 1.6948 : absHeight;\nvec2 elementSizePx = vec2(absWidth, absHeight);\nvec2 elementPosPx = vec2(0.5000, 0.7166) * uArtboardResolution - getAnchorOffsets_L300() * elementSizePx;\nvec2 centerPos = elementPosPx + (elementSizePx * 0.5);\nvec2 relPos = canvasPos - centerPos + mouseOffset;\nvec2 unrotatedRelPos = rotate2D_L300(relPos, 0.0000 * -TAU);\nvec2 elementPos = unrotatedRelPos + (elementSizePx * 0.5);\nimageUV = elementPos / elementSizePx;\nimageUV = apply3DRotation_L300(imageUV, vec2(0.5), vec2(1566, 924), 0.0000, 0.0000, 0.2200, mouseRotOffset);\nvec2 flippedUV = vec2(imageUV.x, 1.0 - imageUV.y);\nvec4 color = textureLod(uL300_SourceImage, flippedUV, 0.0);\nif (imageUV.x >= 0.0 && imageUV.x <= 1.0 && imageUV.y >= 0.0 && imageUV.y <= 1.0) {\nreturn color;\n}\nelse {\nreturn vec4(0.0);\n}\n}\nvec4 applyImageAdjustments_L300(vec4 color) {\ncolor.rgb = clamp(color.rgb, 0.0, 1.0);\ncolor.rgb *= color.a;\nreturn color;\n}\nvec4 computeParentSrc_L2(vec2 uv) {\nvec2 mouseOffsetUV = (uL300_MousePos - 0.5) * 0.0220;\nvec2 mouseOffsetPx = mouseOffsetUV;\nvec2 mouseRotOffset = (uL300_MousePos - 0.5) * 0.6900 * PI * 0.5;\nuv -= mouseOffsetUV;\nvec4 imgColor = sampleImage_L300(uv, mouseOffsetPx, mouseRotOffset);\nimgColor = applyImageAdjustments_L300(imgColor);\nreturn imgColor;\n}\nvec4 computeLayer_L301(vec2 uv, vec4 prevLayerColor) {\nvec4 bg = prevLayerColor;\nvec4 color = bg;\nif(bg.a > 0.001) {\nfloat gray = dot(color.rgb, vec3(0.299, 0.587, 0.114));\nvec3 duotoneColor = mix(vec3(0, 0, 0), vec3(0.6784313725490196, 0.5294117647058824, 0.12941176470588237), gray);\ncolor = vec4(duotoneColor, 1.0) * 1.0000;\n}\nreturn color;\n}\nmat2 rot(float a) {\nreturn mat2(cos(a),-sin(a),sin(a),cos(a));\n}\nvec4 computeLayer_L302(vec2 uv, vec4 prevLayerColor) {\nvec4 color = prevLayerColor;\nfloat displacement = 0.0;\nvec2 aspectRatio = vec2(uResolution.x/uResolution.y, 1.0);\nvec2 skew = vec2(0.5000, 1.0 - 0.5000);\nfloat halfRadius = 0.3300 * 0.5;\nfloat innerEdge = halfRadius - 1.0000 * halfRadius * 0.5;\nfloat outerEdge = halfRadius + 1.0000 * halfRadius * 0.5;\nvec2 pos = vec2(0.5, 0.5);\npos += (uL302_MousePos - 0.5) * 1.0000;\nvec2 scaledUV = uv * aspectRatio * rot(0.0000 * TAU) * skew;\nvec2 scaledPos = pos * aspectRatio * rot(0.0000 * TAU) * skew;\nfloat radius = distance(scaledUV, scaledPos);\nfloat falloff = smoothstep(innerEdge + displacement, outerEdge + displacement, radius);\nvec4 vignetteColor;\nvignetteColor = vec4(vec3(0, 0, 0), 1.0) * falloff * 1.0000;\nvec4 col = mix(color * (1.-falloff), vec4(vignetteColor.rgb, vignetteColor.a), 1.0000);\nreturn col;\n}\nvec2 hash_L3(vec2 p) {\np = vec2(dot(p, vec2(127.1, 311.7)), dot(p, vec2(269.5, 183.3)));\nreturn -1.0 + 2.0 * fract(sin(p) * 43758.5453123);\n}\nfloat getAttractionFalloff_L3(float startFalloff, float endFalloff, float attractionRange) {\nfloat rangeT = attractionRange * 1.5;\nfloat startRadius = 1.0 / max(startFalloff, 0.0001);\nfloat endRadius = 1.0 / max(endFalloff, 0.0001);\nfloat attractionRadius = mix(startRadius, endRadius, rangeT);\nreturn 1.0 / max(attractionRadius, 0.0001);\n}\nfloat starCross_L3(vec2 diff, float radius) {\nvec2 ad = abs(diff);\nfloat width = mix(0.012, 0.035, clamp(radius, 0.0, 1.0));\nfloat length = mix(0.25, 1.35, 0.0000);\nfloat axisDist = min(ad.x, ad.y);\nfloat armDist = max(ad.x, ad.y);\nfloat axis = 1.0 - smoothstep(width, width * 3.0, axisDist);\nfloat fade = 1.0 - smoothstep(0.05, length, armDist);\nreturn axis * fade * radius * 0.0000 * 3.0;\n}\nfloat voronoi_additive_L3(vec2 st, float radius, vec2 mouse_pos, float scale, float wanderVal, float time, float attraction, float attractionRange, float shimmerVal, float glowVal) {\nvec2 i_st = floor(st);\nfloat wander = wanderVal * time * 0.2;\nfloat total_contribution = 0.0;\nfloat minDistSq = max(radius * radius * 0.01, 0.0001);\nfloat attractionFalloff = getAttractionFalloff_L3(0.5 + scale * 2.0, 0.5, attractionRange);\nfloat attractionFalloffSq = attractionFalloff * attractionFalloff;\nfloat timePhase = time * 0.12;\nbool useAttraction = attraction != 0.0;\nbool useShimmer = shimmerVal > 0.0;\nbool useCross = 0.0000 > 0.0;\nfor (int y = -1;\ny <= 1;\ny++) {\nfor (int x = -1;\nx <= 1;\nx++) {\nvec2 neighbor = vec2(float(x), float(y));\nvec2 cell_id = i_st + neighbor;\nvec2 hashValue = hash_L3(cell_id);\nvec2 point = 0.5 + 0.5 * sin(5.0 + wander + 6.2831 * hashValue);\nvec2 starAbsPos = cell_id + point;\nif (useAttraction) {\nvec2 dirToMouse = mouse_pos - starAbsPos;\nfloat distToMouseSq = dot(dirToMouse, dirToMouse);\nfloat attractStrength = attraction * 2.0 / (1.0 + distToMouseSq * attractionFalloffSq * 8.0);\nstarAbsPos += dirToMouse * attractStrength;\n}\nvec2 diff = starAbsPos - st;\nfloat distSq = dot(diff, diff);\nfloat contribution = radius * inversesqrt(max(distSq, minDistSq));\ncontribution *= 1.0 - smoothstep(2.25, 5.76, distSq);\nif (useCross) {\ncontribution += starCross_L3(diff, radius);\n}\nif (useShimmer) {\nfloat shimmerPhase = point.x + point.y + hashValue.x * 0.5 + timePhase;\nfloat shimmer = 1.0 - abs(fract(shimmerPhase) * 2.0 - 1.0);\nshimmer = mix(1.0, 0.75 + shimmer, shimmerVal);\ncontribution *= shimmer;\n}\ntotal_contribution += mix(contribution*contribution, contribution * 2., glowVal);\n}\n}\nreturn total_contribution;\n}\nvec4 randomStyle_L3(vec4 bg, vec2 uv) {\nvec4 color = vec4(0.0);\nvec2 aspectRatio = vec2(uResolution.x / uResolution.y, 1.0);\nfloat angle = 0.5000 * 2.0 * PI;\nmat2 rotation = rot(angle);\nfloat baseScale = 40.0 * 4.5600;\nvec2 skewScale = vec2(1.0, 1.0 - 0.9700);\nfloat movementY = uL3_Time * 0.3600 * -0.05;\nvec2 movementOffset = vec2(0.0, movementY);\nvec2 mPos = mix(vec2(0.0), (uL3_MousePos - 0.5), 0.0000);\nuv -= vec2(0.5, 0.5);\nuv *= aspectRatio;\nuv *= rotation;\nuv *= baseScale;\nuv *= skewScale;\nuv /= aspectRatio;\nmPos *= rotation;\nvec2 mouseGrid = uL3_MousePos;\nmouseGrid -= vec2(0.5, 0.5);\nmouseGrid *= aspectRatio;\nmouseGrid *= rotation;\nmouseGrid *= baseScale;\nmouseGrid *= skewScale;\nmouseGrid /= aspectRatio;\nfloat passScale1 = 38.0 * 4.5600;\nfloat passScale2 = 48.0 * 4.5600;\nvec2 mouseGrid1 = mouseGrid - (mPos * passScale1) + movementOffset;\nvec2 mouseGrid2 = mouseGrid - (mPos * passScale2) + movementOffset;\nvec2 st1 = uv - (mPos * passScale1);\nvec2 st2 = uv - (mPos * passScale2);\nvec2 mouse1 = st1 + movementOffset;\nvec2 mouse2 = st2 + movementOffset;\nfloat radius1 = 0.5 * 0.5400;\nfloat radius2 = 0.5 * 0.5400;\nfloat pass1 = voronoi_additive_L3(mouse1 * aspectRatio, radius1, mouseGrid1 * aspectRatio, passScale1, 0.1100, uL3_Time, 0.0000, 0.5000, 0.4400, 0.2500);\nfloat secondPassWeight = smoothstep(0.18, 0.4, 4.5600);\nfloat pass2 = 0.0;\nif (secondPassWeight > 0.0) {\npass2 = voronoi_additive_L3(mouse2 * aspectRatio + vec2(10.0), radius2, mouseGrid2 * aspectRatio + vec2(10.0), passScale2, 0.1100, uL3_Time, 0.0000, 0.5000, 0.4400, 0.2500);\n}\npass1 *= 0.02;\npass2 *= 0.04 * secondPassWeight;\ncolor.rgb = (pass1 + pass2) * vec3(0.7529411764705882, 0.9098039215686274, 0.9529411764705882) * mix(1.0, bg.r, 1.1500);\ncolor.rgb = clamp(color.rgb, 0.0, 1.0);\ncolor.rgb = blend(1, bg.rgb, color.rgb);\ncolor = vec4(color.rgb, max(bg.a, luma(color.rgb)));\nreturn color;\n}\n\nvec4 computeLayer_L1100(vec2 uv, vec4 prevLayerColor) {\nvec2 res = uResolution;\nvec2 pos = vec2(0.5, 0.5) + mix(vec2(0), (uMousePos-0.5), 0.0000);\nuv -= pos;\nuv /= (0.5000*2.);\nuv = rotate_L1100(uv, (0.0000 - 0.5) * 2. * 3.14159265);\nvec4 color = vec4(getColor_L1100(uv), 1);\nvec4 bg = prevLayerColor;\ncolor = color * uL1100_Opacity;\nreturn color;\n}\nvec4 computeLayer_L0(vec2 uv, vec4 prevLayerColor) {\nvec4 bg = prevLayerColor;\nivec2 videoTexSize = textureSize(uL0_VideoTexture, 0);\nbool videoReady = videoTexSize.x > 16 && videoTexSize.y > 16;\nivec2 texSize = videoReady ? videoTexSize : textureSize(uL0_Thumbnail, 0);\nfloat texWidth = float(texSize.x);\nfloat texHeight = float(texSize.y);\nfloat videoAspect = texWidth / max(texHeight, 0.0001);\nfloat screenAspect = (uResolution.x / uResolution.y);\nvec2 centeredUV = uv;\ncenteredUV = screenAspect < videoAspect ? vec2( (uv.x - 0.5) * (screenAspect / videoAspect), uv.y - 0.5) + 0.5 : vec2( uv.x - 0.5, (uv.y - 0.5) * (videoAspect / screenAspect) ) + 0.5;\ncenteredUV += (bg.rg * 2.0 - 1.0) * 0.0000;\nvec4 color;\nif (videoReady) {\ncolor = texture(uL0_VideoTexture, centeredUV);\n}\nelse {\ncolor = texture(uL0_Thumbnail, centeredUV);\n}\ncolor.rgb = color.rgb / max(color.a, 0.0001);\ncolor = applyAdjustments_L0(color);\nfloat videoAlpha = color.a * 1.0000;\ncolor = color * videoAlpha;\nreturn color;\n}\nvec4 computeLayer_L1(vec2 uv, vec4 prevLayerColor, float sharedDither) {\nvec4 bg = prevLayerColor;\nvec2 pos = vec2(0.54, 0) + mix(vec2(0), (uMousePos-0.5), 0.0000);\nfloat beam = getBeam_L1(uv, pos, 2.0000, 0.2500, 0.5700, uL1_Thickness, uL1_Time, 0.5300, uResolution);\nvec3 beamColor = beam * vec3(0.7529411764705882, 0.9098039215686274, 0.9529411764705882);\nfloat ssBeam = beam / (beam + 1.0);\nbeamColor = mix(beamColor, vec3(0.7529411764705882, 0.9098039215686274, 0.9529411764705882), mix(1.0, ssBeam, 0.0000)) * beam;\nfloat dither = sharedDither;\nvec3 result = Tonemap_tanh_L1(beamColor);\nfloat lum = luma(beamColor);\nresult += dither;\nfloat layerMix = 0.3300;\nvec4 color;\nvec3 blended = blend(1, result, bg.rgb);\ncolor = vec4(blended, 1.0) * layerMix;\nreturn color;\n}\nvec4 computeLayer_L2(vec2 uv) {\nvec4 stackResult = computeParentSrc_L2(uv);\nif (stackResult.a < 0.001) return vec4(0.0);\nvec4 sc0 = computeLayer_L301(uv, stackResult);\nsc0 *= uL301_ElemOpacity;\nstackResult = sc0 + stackResult * (1.0 - sc0.a);\nvec4 sc1 = computeLayer_L302(uv, stackResult);\nsc1 *= uL302_ElemOpacity;\nstackResult = sc1 + stackResult * (1.0 - sc1.a);\nreturn stackResult;\n}\nvec4 computeLayer_L3(vec2 uv, vec4 prevLayerColor) {\nvec4 bg = prevLayerColor;\nvec4 color;\ncolor = randomStyle_L3(bg, uv);\nreturn color;\n}\n\nvoid main() {\nvec2 uv = vTextureCoord;\nfloat sharedDither = deband_L1();\nvec4 _xGroupOcc = computeLayer_L1100(uv, vec4(0.0));\nif (_xGroupOcc.a >= 0.9999) { fragColor = vec4(0.0); return; }\nvec4 result = vec4(0.0);\nvec4 c0 = computeLayer_L0(uv, result);\nc0 *= uL0_ElemOpacity;\nresult = c0 + result * (1.0 - c0.a);\nvec4 c1 = computeLayer_L1(uv, clamp(result, 0.0, 1.0), sharedDither);\nc1 *= uL1_ElemOpacity;\nresult = c1 + result * (1.0 - c1.a);\nvec4 c2 = computeLayer_L2(uv);\n{\nvec3 _s = c2.rgb / max(c2.a, 0.0001);\nvec3 _d = result.rgb;\nc2 = vec4(1. - (1. - _s) * (1. - _d), 1.0) * (c2.a * uL2_ElemOpacity);\n}\nresult = c2 + result * (1.0 - c2.a);\nvec4 c3 = computeLayer_L3(uv, result);\nc3 *= uL3_ElemOpacity;\nresult = c3 + result * (1.0 - c3.a);\nfragColor = result;\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;\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":"b052b49d-c8e2-4f03-9df3-983eda70fdaf","publicId":"video","layerType":"effect","type":"video","sublayerIndex":0,"opacity":1,"animating":true,"texture":{"src":"https://firebasestorage.googleapis.com/v0/b/unicorn-studio.appspot.com/o/bpZlMeAw1lMwExyqHRdP0qhmzFz1%2Fhero_opt_max_%40thumbnail.jpg?alt=media&token=609168b3-2ee9-474e-892b-894e46293599","sampler":"uThumbnail"},"src":"https://firebasestorage.googleapis.com/v0/b/unicorn-studio.appspot.com/o/bpZlMeAw1lMwExyqHRdP0qhmzFz1%2Fhero_opt_max.webm?alt=media&token=48c6a1b5-10b3-4cc1-ab24-52935ec3a973","loop":true,"playbackRate":1},{"id":"f981d9c8-6e7e-421d-932b-ff8b88fcc6e1","publicId":"beam","layerType":"effect","type":"beam","sublayerIndex":1,"opacity":1,"animating":true,"thickness":0.16},{"id":"5d28f5dc-21ce-4b81-8ff4-d5fe6aa7ea58","publicId":"image","layerType":"image","sublayerIndex":300,"opacity":0.88,"blendMode":"SCREEN","animating":false,"src":"https://assets.unicorn.studio/images/bpZlMeAw1lMwExyqHRdP0qhmzFz1/Edge_Now_Slut_v1.png","imageNaturalSize":{"type":"Vec2","_x":1566,"_y":924},"width":0.73,"widthMode":0,"height":0.7657386121753937,"heightMode":2,"left":0.5,"top":0.7166370920790006,"anchorPoint":8,"aspectRatio":1.694805194805195},{"id":"7ff6f28b-4733-4fc7-bd14-013603853d15","publicId":"duotone","layerType":"effect","type":"duotone","sublayerIndex":301,"opacity":1,"animating":false},{"id":"b3e98ddb-b614-41e7-bd01-9bdd1166cd8f","publicId":"vignette","layerType":"effect","type":"vignette","sublayerIndex":302,"opacity":1,"animating":false},{"id":"b8f588f5-733b-425e-b3fb-370670b146a3","publicId":"wisps","layerType":"effect","type":"wisps","sublayerIndex":3,"opacity":1,"animating":true}],"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_thickness":{"name":"uL1_Thickness","type":"1f","value":0},"L1_time":{"name":"uL1_Time","type":"1f","value":0},"L1_elemOpacity":{"name":"uL1_ElemOpacity","type":"1f","value":1},"artboardResolution":{"name":"uArtboardResolution","type":"2f","value":{"type":"Vec2","_x":1600,"_y":900}},"L300_aspectRatio":{"name":"uAspectRatio","type":"1f","value":1.694805194805195},"L301_elemOpacity":{"name":"uL301_ElemOpacity","type":"1f","value":1},"L302_elemOpacity":{"name":"uL302_ElemOpacity","type":"1f","value":1},"L3_time":{"name":"uL3_Time","type":"1f","value":0},"L3_elemOpacity":{"name":"uL3_ElemOpacity","type":"1f","value":1},"L1100_opacity":{"name":"uL1100_Opacity","type":"1f","value":1},"L300_mousePos":{"name":"uL300_MousePos","type":"2f","value":{"type":"Vec2","_x":0.5,"_y":0.5}},"L302_mousePos":{"name":"uL302_MousePos","type":"2f","value":{"type":"Vec2","_x":0.5,"_y":0.5}},"L3_mousePos":{"name":"uL3_MousePos","type":"2f","value":{"type":"Vec2","_x":0.5,"_y":0.5}},"L2_elemOpacity":{"name":"uL2_ElemOpacity","type":"1f","value":0.88}},"textures":[{"sampler":"uL0_Thumbnail","type":"media","src":"https://firebasestorage.googleapis.com/v0/b/unicorn-studio.appspot.com/o/bpZlMeAw1lMwExyqHRdP0qhmzFz1%2Fhero_opt_max_%40thumbnail.jpg?alt=media&token=609168b3-2ee9-474e-892b-894e46293599","sublayerIndex":0},{"sampler":"uL0_VideoTexture","type":"video","sublayerIndex":0},{"sampler":"uL300_SourceImage","type":"image","src":"https://assets.unicorn.studio/images/bpZlMeAw1lMwExyqHRdP0qhmzFz1/Edge_Now_Slut_v1.png","sublayerIndex":300}],"timeUniforms":[{"key":"L1_time","speed":0.25,"animating":true},{"key":"L3_time","speed":0.5,"animating":true}],"mouseUniforms":[{"key":"L300_mousePos","momentum":0.69,"spring":0,"trackAxes":"xy"},{"key":"L302_mousePos","momentum":1,"spring":0,"trackAxes":"xy"},{"key":"L3_mousePos","momentum":1,"spring":0,"trackAxes":"xy"}],"hasMouseTracking":true,"hasVideoSublayers":true,"estimatedSublayerWorkRaw":504.16207341961706,"occlusion":{"candidateLayers":0}},"states":{"appear":[{"local":{"pendingChanges":{},"changeDebouncer":null,"dragSession":null},"type":"appear","id":"ef44b178-267e-480e-ab88-c6c5703037f5","prop":"L1_thickness","transition":{"ease":"easeInOutQuart","delay":0,"duration":1000},"complete":false,"progress":0,"value":0,"endValue":0.16,"initialized":false,"breakpoints":[],"loop":"none","loopDelay":0,"uniformData":{"type":"1f","name":"uL1_Thickness"},"sublayerIndex":1,"originalProp":"thickness"},{"local":{"pendingChanges":{},"changeDebouncer":null,"dragSession":null},"type":"appear","id":"cd1fbcc4-0b8d-4383-88bb-44e65aaf9b63","prop":"L1100_opacity","transition":{"ease":"easeOutCubic","delay":150,"duration":1000},"complete":false,"progress":0,"value":1,"endValue":0,"initialized":false,"breakpoints":[],"loop":"none","loopDelay":0,"uniformData":{"type":"1f","name":"uL1100_Opacity"},"sublayerIndex":1100,"originalProp":"opacity"}],"scroll":[],"hover":[],"mousemove":[]},"breakpoints":[],"userDownsample":1,"visible":true},{"layerType":"flattened","id":"flat_6","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;\nin vec2 vTextureCoord;\nin vec3 vVertexPosition;\n\nuniform sampler2D uBgTexture;\nuniform float uL0_Time;\nuniform vec2 uMousePos;\nuniform vec2 uResolution;\nuniform float uL0_ElemOpacity;\nuniform float uL1_Thickness;\nuniform float uL1_Time;\nuniform float uL1_ElemOpacity;\nuniform float uL2_Opacity;\n\nconst float PI = 3.14159265359;\nvec2 caLiquifiedUV_L0;\nvec2 caOriginalUV_L0;\nconst float TAU = 6.28318530718;\nconst float TWO_PI_L1 = 2.0 * PI;\n\nout vec4 fragColor;\n\nfloat ease_L0 (int easingFunc, float t) {\nreturn t;\n}\nmat2 rot_L0(float a) {\nreturn mat2(cos(a), -sin(a), sin(a), cos(a));\n}\nvec2 liquify_L0(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 * uL0_Time * 0.0125) * rot_L0(0.0528 * -2. * PI);\npos += drift;\nvec2 skew = mix(vec2(1), vec2(1, 0), 0.0000);\nst -= pos;\nst.x *= aspectRatio;\nst = st * rot_L0(0.0528 * 2. * PI);\nst *= skew;\nfloat freq = (5.0 * (0.0300 + 0.1));\nfloat t = uL0_Time * 0.025;\nfloat amplitude = 0.0200 * mix(0.2, 0.2/(0.0300 + 0.05), 0.25) * dist;\nfor (float i = 1.0;\ni <= 5.0;\ni++) {\nst = st * rot_L0(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}\nst /= skew;\nst = st * rot_L0(0.0528 * -2. * PI);\nst.x /= aspectRatio;\nst += pos;\nreturn st;\n}\nvec2 distortUV_L0(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_L0(0, max(0., 1. - distance(uv * vec2(aspectRatio, 1), mPos * vec2(aspectRatio, 1)) * 4. * (1. - 1.0000)));\nif (dist <= 0.001) return uv;\nif (0.0200 <= 0.001) return uv;\nif (0.5000 <= 0.001) return uv;\nvec2 liquifiedUV = liquify_L0(uv, dist);\ncaLiquifiedUV_L0 = liquifiedUV;\ncaOriginalUV_L0 = uv;\nreturn mix(uv, liquifiedUV, 0.5000);\n}\nvec3 blend_L1 (int blendMode, vec3 src, vec3 dst) {\nreturn src + dst;\n}\nuvec2 pcg2d_L1(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_L1(vec2 p) {\nuvec2 v = floatBitsToUint(p);\nv = pcg2d_L1(v);\nuint r = v.x ^ v.y;\nreturn float(r) / float(0xffffffffu);\n}\nfloat deband_L1() {\nreturn (randFibo_L1(gl_FragCoord.xy) - 0.5) / 255.0;\n}\nvec3 Tonemap_tanh_L1(vec3 x) {\nx = clamp(x, -40.0, 40.0);\nreturn (exp(x) - exp(-x)) / (exp(x) + exp(-x));\n}\nfloat luma_L1(vec3 color) {\nreturn dot(color, vec3(0.299, 0.587, 0.114));\n}\nfloat drawLine_L1(vec2 uv, vec2 center, float scale, float angle, float time, float phaseVal, float thickness) {\nfloat radAngle = -angle * TWO_PI_L1;\nfloat phase = fract(time * 0.01 + phaseVal) * (3. * max(1., scale)) - (1.5 * max(1., scale));\nvec2 direction = vec2(cos(radAngle), sin(radAngle));\nvec2 centerToPoint = uv - center;\nfloat projection = dot(centerToPoint, direction);\nfloat distToLine = length(centerToPoint - projection * direction);\nfloat lineRadius = thickness * 0.25;\nfloat brightness = lineRadius / max(0.0001, 1. - smoothstep(0.4, 0., distToLine + 0.02));\nfloat glowRadius = scale;\nfloat glow = smoothstep(glowRadius, 0.0, abs(projection - phase));\nreturn brightness * (1.-distToLine)*(1.-distToLine) * glow;\n}\nfloat getBeam_L1(vec2 uv, vec2 pos, float radius, float angleVal, float skewVal, float thickness, float time, float phaseVal, vec2 resolution) {\nreturn drawLine_L1(uv, pos, radius, angleVal, time, phaseVal, thickness);\n}\nvec3 getColor_L2(int index) {\nswitch(index) {\ncase 0: return vec3(0, 0, 0);\ndefault: return vec3(0.0);\n}\n}\nvec2 rotate_L2(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}\nvec3 getColor_L2(vec2 uv) {\nreturn vec3(0, 0, 0);\n}\n\nvec4 computeLayer_L0(vec2 uv) {\nvec2 distortedUV = distortUV_L0(uv);\nvec4 color = texture(uBgTexture, distortedUV);\nvec2 dir = caLiquifiedUV_L0 - caOriginalUV_L0;\nfloat distanceUv = length(dir);\nif (distanceUv > 0.001) {\nvec2 normalizedUv = dir / distanceUv;\nfloat chromAbb = 0.5500 * 0.5;\nvec2 offsetR = caLiquifiedUV_L0 + chromAbb * normalizedUv * distanceUv;\nvec2 offsetB = caLiquifiedUV_L0 - chromAbb * normalizedUv * distanceUv;\nvec4 colorR = texture(uBgTexture, mix(caOriginalUV_L0, offsetR, 0.5000));\nvec4 colorB = texture(uBgTexture, mix(caOriginalUV_L0, offsetB, 0.5000));\ncolor = vec4(colorR.r, color.g, colorB.b, colorR.a * color.a * colorB.a);\n}\nreturn color;\n}\nvec4 computeLayer_L1(vec2 uv, vec4 prevLayerColor, float sharedDither) {\nvec4 bg = prevLayerColor;\nvec2 pos = vec2(0.54, 0) + mix(vec2(0), (uMousePos-0.5), 0.0000);\nfloat beam = getBeam_L1(uv, pos, 0.3080, 0.0000, 0.5700, uL1_Thickness, uL1_Time, 0.5000, uResolution);\nvec3 beamColor = beam * vec3(0.7529411764705882, 0.9098039215686274, 0.9529411764705882);\nfloat ssBeam = beam / (beam + 1.0);\nbeamColor = mix(beamColor, vec3(0.7529411764705882, 0.9098039215686274, 0.9529411764705882), mix(1.0, ssBeam, 0.0000)) * beam;\nfloat dither = sharedDither;\nvec3 result = Tonemap_tanh_L1(beamColor);\nfloat lum = luma_L1(beamColor);\nresult += dither;\nfloat layerMix = 1.0000;\nvec4 color;\nvec3 blended = blend_L1(1, result, bg.rgb);\ncolor = vec4(blended, 1.0) * layerMix;\nreturn color;\n}\nvec4 computeLayer_L2(vec2 uv, vec4 prevLayerColor) {\nvec2 res = uResolution;\nvec2 pos = vec2(0.5, 0.5) + mix(vec2(0), (uMousePos-0.5), 0.0000);\nuv -= pos;\nuv /= (0.5000*2.);\nuv = rotate_L2(uv, (0.0000 - 0.5) * 2. * 3.14159265);\nvec4 color = vec4(getColor_L2(uv), 1);\nvec4 bg = prevLayerColor;\ncolor = color * uL2_Opacity;\nreturn color;\n}\n\nvoid main() {\nvec2 uv = vTextureCoord;\nfloat sharedDither = deband_L1();\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, clamp(result + texture(uBgTexture, uv) * (1.0 - clamp(result.a, 0.0, 1.0)), 0.0, 1.0), sharedDither);\nc1 *= uL1_ElemOpacity;\nresult = c1 + result * (1.0 - c1.a);\nvec4 c2 = computeLayer_L2(uv, result);\nresult = c2 + result * (1.0 - c2.a);\nfragColor = result;\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;\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":"06230b13-b31f-4a36-9f9f-4840e3d24da9","publicId":"liquify","layerType":"effect","type":"liquify","sublayerIndex":0,"opacity":1,"animating":true},{"id":"802cd281-f893-4f41-b265-b59e47d46566","publicId":"beam1","layerType":"effect","type":"beam","sublayerIndex":1,"opacity":1,"animating":true,"thickness":0.28},{"id":"83e7f940-19cd-449e-9333-5ca7ba20eda9","publicId":"fill_/_gradient","layerType":"effect","type":"gradientFill","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_time":{"name":"uL0_Time","type":"1f","value":0},"L0_elemOpacity":{"name":"uL0_ElemOpacity","type":"1f","value":1},"L1_thickness":{"name":"uL1_Thickness","type":"1f","value":0},"L1_time":{"name":"uL1_Time","type":"1f","value":0},"L1_elemOpacity":{"name":"uL1_ElemOpacity","type":"1f","value":1},"L2_opacity":{"name":"uL2_Opacity","type":"1f","value":1}},"textures":[],"timeUniforms":[{"key":"L0_time","speed":1,"animating":true},{"key":"L1_time","speed":0.25,"animating":true}],"mouseUniforms":[],"hasMouseTracking":false,"hasVideoSublayers":false,"estimatedSublayerWorkRaw":282,"occlusion":{"candidateLayers":1}},"states":{"appear":[{"local":{"pendingChanges":{},"changeDebouncer":null,"dragSession":null},"type":"appear","id":"ef44b178-267e-480e-ab88-c6c5703037f5","prop":"L1_thickness","transition":{"ease":"easeInOutQuart","delay":0,"duration":1000},"complete":false,"progress":0,"value":0,"endValue":0.28,"initialized":false,"breakpoints":[],"loop":"none","loopDelay":0,"uniformData":{"type":"1f","name":"uL1_Thickness"},"sublayerIndex":1,"originalProp":"thickness"},{"local":{"pendingChanges":{},"changeDebouncer":null,"dragSession":null},"type":"appear","id":"cd1fbcc4-0b8d-4383-88bb-44e65aaf9b63","prop":"L2_opacity","transition":{"ease":"easeOutCubic","delay":150,"duration":1000},"complete":false,"progress":0,"value":1,"endValue":0,"initialized":false,"breakpoints":[],"loop":"none","loopDelay":0,"uniformData":{"type":"1f","name":"uL2_Opacity"},"sublayerIndex":2,"originalProp":"opacity"}],"scroll":[],"hover":[],"mousemove":[]},"breakpoints":[],"userDownsample":1,"visible":true}],"options":{"name":"hero_edge","fps":60,"dpi":1,"scale":1,"includeLogo":false,"isProduction":true,"flatten":true},"version":"2.1.12","id":"PT3BGj33pwX7EjRoN5pR"}