{
  "name": "Black Hole",
  "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 int STATE_IDLE = 0;\nconst float BH_RS = 0.145;\n\nvec3 diskRadiance(vec3 p, vec3 view, float time) {\n    float r = length(p.xz);\n    float a = atan(p.z, p.x);\n    float spin = time * 0.38 + rpw_seed * 0.73;\n    float shear = a - spin / max(pow(r, 1.5), 0.13);\n    float grain = rpw_noise(vec3(cos(shear) * 9.0, sin(shear) * 9.0, r * 63.0));\n    float bands = 0.66 + 0.19 * sin(r * 156.0 + 2.5 * sin(shear * 3.0 + r * 18.0)) + 0.15 * grain;\n    float arc = 0.5 + 0.5 * sin(shear * 2.0 + r * 14.0 + grain * 1.6);\n    float spiral = (0.38 + 0.72 * arc) * (0.86 + 0.14 * sin(shear * 5.0 + r * 38.0 + grain * 3.0));\n    float hot = 1.0 - smoothstep(0.34, 0.86, r);\n    vec3 c = mix(vec3(1.0, 0.14, 0.018), vec3(1.0, 0.78, 0.35), hot);\n    c = mix(c, vec3(1.0, 0.96, 0.80), pow(hot, 5.0) * 0.72);\n    vec3 tangent = normalize(vec3(-p.z, 0.0, p.x));\n    float doppler = pow(clamp(1.0 + 0.40 * dot(tangent, -view), 0.60, 1.40), 2.0);\n    return c * bands * spiral * (1.1 + hot * 2.1) * doppler;\n}\n\nvec4 object(vec3 ro, vec3 rd, float t0, float t1, float time, vec3 light, inout float depth) {\n    vec3 o = ro;\n    vec3 d = rd;\n    o.xy = rpw_rot(0.13) * o.xy;\n    d.xy = rpw_rot(0.13) * d.xy;\n    vec3 p = o + d * (t0 + 0.001);\n    vec3 v = d;\n    vec3 angular = cross(p, v);\n    float h2 = dot(angular, angular);\n    vec3 color = vec3(0.0);\n    float alpha = 0.0;\n    bool hasDepth = false;\n    for (int i = 0; i < 96; i++) {\n        float r = length(p);\n        if (r < BH_RS * 1.025) {\n            if (!hasDepth) {\n                depth = clamp(dot(p - o, d), t0, t1);\n                hasDepth = true;\n            }\n            alpha = 1.0;\n            break;\n        }\n        if (r > 0.975 && dot(p, v) > 0.0) break;\n        float ds = clamp(r * 0.12, 0.015, 0.065);\n        vec3 acc = -1.5 * BH_RS * h2 * p / max(r * r * r * r * r, 0.00003);\n        vec3 nextP = p + v * ds + 0.5 * acc * ds * ds;\n        float rn = length(nextP);\n        vec3 accN = -1.5 * BH_RS * h2 * nextP / max(rn * rn * rn * rn * rn, 0.00003);\n        vec3 nextV = v + 0.5 * (acc + accN) * ds;\n        if (p.y * nextP.y <= 0.0) {\n            float f = clamp(p.y / (p.y - nextP.y + 0.000001), 0.0, 1.0);\n            vec3 q = mix(p, nextP, f);\n            float dr = length(q.xz);\n            if (dr > 0.325 && dr < 0.91) {\n                float edge = smoothstep(0.325, 0.37, dr) * (1.0 - smoothstep(0.79, 0.91, dr));\n                float a = edge * 0.93;\n                vec3 c = diskRadiance(q, normalize(v), time);\n                color += (1.0 - alpha) * c * a;\n                alpha += (1.0 - alpha) * a;\n                if (!hasDepth && alpha > 0.28) {\n                    depth = clamp(dot(q - o, d), t0, t1);\n                    hasDepth = true;\n                }\n            }\n        }\n        float cylindrical = length(p.xz);\n        float radialWindow = smoothstep(0.31, 0.38, cylindrical) * (1.0 - smoothstep(0.79, 0.93, cylindrical));\n        float fog = exp(-abs(p.y) * 48.0) * radialWindow;\n        float fa = 1.0 - exp(-fog * ds * 3.0);\n        vec3 fc = mix(vec3(1.0, 0.12, 0.015), vec3(1.0, 0.56, 0.12), 1.0 - smoothstep(0.35, 0.9, cylindrical));\n        color += (1.0 - alpha) * fc * 1.7 * fa;\n        alpha += (1.0 - alpha) * fa;\n        if (!hasDepth && alpha > 0.28) {\n            depth = clamp(dot(p - o, d), t0, t1);\n            hasDepth = true;\n        }\n        p = nextP;\n        v = nextV;\n        if (alpha > 0.995) break;\n    }\n    float b = length(cross(o, d));\n    float photon = exp(-abs(b - 0.377) * 280.0);\n    float aura = exp(-abs(b - 0.386) * 34.0) * 0.11;\n    float ring = photon * 0.72 + aura;\n    if (b < 0.56) {\n        color += vec3(1.0, 0.51, 0.12) * ring * (0.55 + 0.45 * (1.0 - alpha));\n        alpha = max(alpha, ring * 0.72);\n    }\n    if (!hasDepth && alpha > 0.01) depth = clamp(-dot(o, d), t0, t1);\n    vec3 result = color / max(alpha, 0.0001);\n    float peak = max(result.r, max(result.g, result.b));\n    result *= (1.0 - exp(-peak * 1.55)) / max(peak, 0.0001);\n    return vec4(result, alpha);\n}",
    "prompt": "Black hole with a glowing accretion disk",
    "size": 12,
    "summary": "A pitch-black core surrounded by a swirling gold-orange accretion disk, whose curved light forms luminous arcs and a fine photon ring."
  }
}