{
  "name": "Nether Vortex Orb",
  "dimension": "3d",
  "slot": "action_bar",
  "width": 256,
  "height": 128,
  "textBaseline": 128,
  "placement": {
    "x": 0,
    "y": 0
  },
  "shapes": [],
  "texts": [],
  "heads": [],
  "images": [],
  "bars": [],
  "triggers": [],
  "world": {
    "glsl": "vec4 object(vec3 ro, vec3 rd, float t0, float t1, float time, vec3 light, inout float depth) {\n    float b=dot(ro,rd);\n    float h=b*b-dot(ro,ro)+0.7396;\n    if(h<0.0) return vec4(0.0);\n    h=sqrt(h);\n    float start=max(t0,-b-h);\n    float end=min(t1,-b+h);\n    if(end<=start) return vec4(0.0);\n    vec3 p=ro+rd*start;\n    vec3 normal=normalize(p);\n    vec3 q=p;\n    q.xz=rpw_rot(time*0.48+p.y*3.4)*q.xz;\n    float n=rpw_noise(q*7.0+vec3(0.0,-time*0.35,0.0));\n    float angle=atan(q.z,q.x);\n    float wave=sin(angle*2.0+p.y*10.0+n*2.7-time*0.85);\n    float ribbon=pow(max(0.0,wave),7.0);\n    float fine=pow(max(0.0,sin(angle*4.0+p.y*20.0+n*5.4-time*1.7)),18.0);\n    float rim=pow(1.0-abs(dot(normal,rd)),2.5);\n    float alpha=clamp(0.12+0.48*ribbon+0.5*rim,0.0,0.9);\n    vec3 col=alpha*(vec3(0.14,0.008,0.32)+ribbon*vec3(0.88,0.10,1.25)+fine*vec3(0.28,0.055,0.38)+rim*vec3(0.4,0.025,0.85));\n    depth=start;\n    bool found=alpha>0.3;\n    float dt=(end-start)/12.0;\n    for(int i=0;i<12;i++) {\n        float t=start+(float(i)+0.5)*dt;\n        p=ro+rd*t;\n        float r=length(p);\n        q=p;\n        q.xz=rpw_rot(time*0.48+p.y*3.4+2.0*r)*q.xz;\n        n=rpw_noise(q*7.0+vec3(0.0,-time*0.35,0.0));\n        angle=atan(q.z,q.x);\n        wave=sin(angle*3.0+p.y*13.0-r*12.0+n*5.0-time*0.85);\n        ribbon=pow(max(0.0,wave),6.0);\n        float shell=exp(-abs(r-0.72)*19.0);\n        float density=(1.0-smoothstep(0.67,0.86,r))*(3.5+2.0*n)+shell*ribbon*8.0;\n        float a=1.0-exp(-density*dt);\n        vec3 c=mix(vec3(0.055,0.002,0.14),vec3(0.3,0.009,0.61),n*n);\n        c+=ribbon*shell*vec3(0.65,0.055,1.12);\n        col+=(1.0-alpha)*a*c;\n        alpha+=(1.0-alpha)*a;\n        if(!found && alpha>0.3) {depth=t;found=true;}\n        if(alpha>0.985) break;\n    }\n    return vec4(col/max(alpha,0.0001),alpha);\n}",
    "prompt": "a swirling purple nether-style portal orb",
    "size": 4,
    "summary": "A dark purple portal orb with smoothly rotating violet-magenta energy ribbons, swirling inner fog, and a luminous rim."
  }
}