{
  "name": "Luminous Drift Jellyfish",
  "dimension": "3d",
  "slot": "action_bar",
  "width": 256,
  "height": 128,
  "textBaseline": 128,
  "placement": {
    "x": 0,
    "y": 0
  },
  "shapes": [],
  "texts": [],
  "heads": [],
  "images": [],
  "bars": [],
  "triggers": [],
  "world": {
    "glsl": "const float JL_PI = 3.14159265;\n\nvec3 jlThreads(vec3 p, float tm) {\n    float u = max(0.0, 0.205 - p.y);\n    float twist = 0.18 * sin(u * 5.0 - tm * 0.8) + u * 0.25;\n    vec2 w = p.xz + twist * vec2(-p.z, p.x);\n    vec2 ab = abs(w);\n    vec2 q;\n    float sector;\n    if (ab.x > ab.y * 2.4142) {\n        q = ab;\n        sector = w.x > 0.0 ? 0.0 : 4.0;\n    } else if (ab.y > ab.x * 2.4142) {\n        q = ab.yx;\n        sector = w.y > 0.0 ? 2.0 : 6.0;\n    } else {\n        q = vec2((ab.x + ab.y) * 0.707107, abs(ab.x - ab.y) * 0.707107);\n        sector = w.x > 0.0 ? (w.y > 0.0 ? 1.0 : 7.0) : (w.y > 0.0 ? 3.0 : 5.0);\n    }\n    float phase = sector * 2.39996;\n    float rad = 0.386 - 0.065 * u + 0.085 * sin(u * 7.0 - tm * 1.1 + phase) * u;\n    float endY = -0.65 - 0.16 * fract(sector * 0.618 + 0.2);\n    float thick = 0.010 * (1.0 - 0.64 * clamp(u, 0.0, 1.0));\n    float strand = max(length(q - vec2(rad, 0.0)) - thick, max(p.y - 0.218, endY - p.y));\n    vec3 result = vec3(strand, 3.0, u);\n\n    vec2 iq = vec2(max(ab.x, ab.y), min(ab.x, ab.y));\n    float ip = ab.x > ab.y ? (w.x > 0.0 ? 0.0 : 3.6) : (w.y > 0.0 ? 1.8 : 5.4);\n    float ir = 0.135 + 0.045 * sin(u * 9.0 - tm * 1.2 + ip) * min(u * 5.0, 1.0);\n    float arm = length(vec2((iq.x - ir) * 0.65, iq.y)) - (0.017 + 0.007 * sin(u * 49.0 + ip - tm * 1.8)) * (1.0 - 0.55 * u);\n    arm = max(arm, max(p.y - 0.30, -0.51 - p.y));\n    if (arm < result.x) result = vec3(arm, 4.0, u + ip);\n\n    float rr = length(p.xz);\n    if (p.y > 0.10 && p.y < 0.31) {\n        float c4 = 1.0 - 8.0 * p.x * p.x * p.z * p.z / max(rr * rr * rr * rr, 0.00001);\n        float scallop = 0.012 * (4.0 * c4 * c4 * c4 - 3.0 * c4);\n        float rim = length(vec2(rr - 0.487, p.y - 0.204 - scallop)) - 0.008;\n        if (rim < result.x) result = vec3(rim, 2.0, 0.0);\n    }\n    float heart = length(vec2(rr - 0.105, (p.y - 0.30) * 1.3)) - 0.027;\n    if (heart < result.x) result = vec3(heart, 4.0, 0.0);\n    return result;\n}\n\nvec4 jlBell(vec3 p, vec3 rd, float tm) {\n    float ang = atan(p.z, p.x);\n    if (p.y < 0.201 + 0.012 * cos(12.0 * ang)) return vec4(0.0);\n    vec3 n = normalize(vec3(p.x / 0.2401, (p.y - 0.24) / 0.119, p.z / 0.2401));\n    float facing = abs(dot(n, rd));\n    float fres = pow(1.0 - facing, 2.0);\n    float radial = length(p.xz);\n    float rib = pow(0.5 + 0.5 * cos(12.0 * ang + 0.18 * sin(p.y * 12.0 - tm)), 14.0) * smoothstep(0.02, 0.18, radial);\n    float pearl = pow(0.5 + 0.5 * cos(p.y * 36.0 + ang * 2.0 - tm * 0.6), 6.0);\n    float iridescence = 0.5 + 0.5 * sin(facing * 10.0 + p.y * 9.0 - tm * 0.45);\n    vec3 c = mix(vec3(0.055, 0.29, 0.72), vec3(0.42, 0.20, 0.75), iridescence * 0.65);\n    c += fres * vec3(0.06, 0.33, 0.42);\n    c += rib * vec3(0.14, 0.61, 0.83);\n    c += pearl * vec3(0.055, 0.070, 0.12);\n    vec3 ref = reflect(rd, n);\n    float shine = pow(max(dot(ref, normalize(vec3(-0.35, 0.8, -0.45))), 0.0), 40.0);\n    c += 0.08 * rpw_sky(ref) + shine * vec3(0.55, 0.70, 0.85);\n    float alpha = 0.35 + 0.25 * fres + 0.25 * rib + 0.10 * shine;\n    return vec4(c, alpha);\n}\n\nvec4 object(vec3 ro, vec3 rd, float t0, float t1, float time, vec3 light, inout float depth) {\n    vec3 drift = vec3(0.030 * sin(time * 0.38), 0.035 * sin(time * 0.65), 0.025 * cos(time * 0.43));\n    float pulse = sin(time * 1.65);\n    vec3 scale = vec3(1.0 / (1.0 + 0.075 * pulse), 1.0 / (1.0 - 0.045 * pulse), 1.0 / (1.0 + 0.075 * pulse));\n    vec3 oro = (ro - drift) * scale;\n    vec3 ord = rd * scale;\n    vec3 eo = (oro - vec3(0.0, 0.24, 0.0)) / vec3(0.49, 0.345, 0.49);\n    vec3 ed = ord / vec3(0.49, 0.345, 0.49);\n    float qa = dot(ed, ed);\n    float qb = dot(eo, ed);\n    float qc = dot(eo, eo) - 1.0;\n    float discr = qb * qb - qa * qc;\n    float nearT = -1.0;\n    float farT = -1.0;\n    vec4 nearC = vec4(0.0);\n    vec4 farC = vec4(0.0);\n    if (discr > 0.0) {\n        float root = sqrt(discr);\n        nearT = (-qb - root) / qa;\n        farT = (-qb + root) / qa;\n        if (nearT >= t0 && nearT <= t1) nearC = jlBell(oro + ord * nearT, rd, time);\n        if (farT >= t0 && farT <= t1) farC = jlBell(oro + ord * farT, rd, time);\n    }\n    float t = t0;\n    float alpha = 0.0;\n    vec3 col = vec3(0.0);\n    bool hasDepth = false;\n    for (int i = 0; i < 64; i++) {\n        if (t > t1 || alpha > 0.985) break;\n        vec3 p = oro + ord * t;\n        vec3 f = jlThreads(p, time);\n        float h = clamp(f.x * 0.78, 0.0065, 0.12);\n        if (f.x < 0.07) {\n            float density = 66.0;\n            vec3 c = vec3(0.12, 1.20, 1.65);\n            if (f.y > 3.5) {\n                c = mix(vec3(0.39, 0.32, 1.15), vec3(1.10, 0.42, 1.25), 0.5 + 0.5 * sin(f.z * 13.0 - time * 1.8));\n                density = 42.0;\n            } else if (f.y > 2.5) {\n                c = mix(vec3(0.11, 0.95, 1.45), vec3(0.60, 0.46, 1.40), clamp(f.z, 0.0, 1.0));\n                c += pow(0.5 + 0.5 * sin(f.z * 29.0 - time * 2.4), 8.0) * vec3(0.12, 0.28, 0.36);\n            }\n            float dd = max(f.x, 0.0);\n            float fog = density * exp(-dd * 215.0) + 1.1 * exp(-dd * 44.0);\n            float aa = 1.0 - exp(-fog * h);\n            col += (1.0 - alpha) * aa * c;\n            alpha += (1.0 - alpha) * aa;\n            if (!hasDepth && alpha > 0.25) { depth = t; hasDepth = true; }\n        }\n        if (nearT >= t && nearT < t + h) {\n            col += (1.0 - alpha) * nearC.a * nearC.rgb;\n            alpha += (1.0 - alpha) * nearC.a;\n            if (!hasDepth && alpha > 0.25) { depth = nearT; hasDepth = true; }\n        }\n        if (farT >= t && farT < t + h) {\n            col += (1.0 - alpha) * farC.a * farC.rgb;\n            alpha += (1.0 - alpha) * farC.a;\n            if (!hasDepth && alpha > 0.25) { depth = farT; hasDepth = true; }\n        }\n        t += h;\n    }\n    if (!hasDepth) depth = clamp(t, t0, t1);\n    return vec4(col / max(alpha, 0.0001), alpha);\n}",
    "prompt": "a glowing jellyfish made of light, drifting and pulsing",
    "size": 6,
    "summary": "A jellyfish made of cyan and violet light, with a translucent scalloped bell that gently pulses as its glowing tendrils sway and drift."
  }
}