{
  "name": "Violet Plasma Globe",
  "dimension": "3d",
  "slot": "action_bar",
  "width": 256,
  "height": 128,
  "textBaseline": 128,
  "placement": {
    "x": 0,
    "y": 0
  },
  "shapes": [],
  "texts": [],
  "heads": [],
  "images": [],
  "bars": [],
  "triggers": [],
  "world": {
    "glsl": "vec2 pbSphere(vec3 ro, vec3 rd, float r) {\n float b=dot(ro,rd); float h=b*b-dot(ro,ro)+r*r;\n if(h<0.0) return vec2(-1.0);\n return vec2(-b-sqrt(h),-b+sqrt(h));\n}\nvec2 pbSegment(vec3 ro, vec3 rd, vec3 a, vec3 b, float lo, float hi) {\n vec3 v=b-a; vec3 w=a-ro;\n float dv=dot(rd,v); float dw=dot(rd,w);\n float s=clamp((dv*dw-dot(v,w))/max(dot(v,v)-dv*dv,0.000001),0.0,1.0);\n float t=clamp(dw+s*dv,lo,hi);\n return vec2(length(w+v*s-rd*t),t);\n}\nvec4 object(vec3 ro, vec3 rd, float t0, float t1, float time, vec3 light, inout float depth) {\n vec2 shell=pbSphere(ro,rd,0.86);\n if(shell.y<t0 || shell.x>t1) return vec4(0.0);\n float front=max(t0,shell.x); float back=min(t1,shell.y);\n float limit=back; vec3 col=vec3(0.0); float alpha=0.0;\n vec2 hub=pbSphere(ro,rd,0.125);\n if(hub.y>front && hub.x<back) {\n  limit=max(front,hub.x);\n  vec3 n=normalize(ro+rd*limit);\n  float fres=pow(1.0-abs(dot(n,rd)),3.0);\n  float bands=pow(0.5+0.5*sin(n.y*45.0+3.0*sin(atan(n.z,n.x)*5.0+time)),8.0);\n  col=vec3(0.65,0.10,0.45)+vec3(1.0,0.30,0.72)*(0.5+1.5*fres+0.5*bands);\n  col+=vec3(1.0,0.75,0.9)*pow(max(dot(reflect(rd,n),normalize(vec3(0.4,0.8,0.3))),0.0),35.0);\n  alpha=1.0;\n }\n vec2 stem=pbSegment(ro,rd,vec3(0.0,-0.81,0.0),vec3(0.0,-0.09,0.0),front,limit);\n if(stem.x<0.025) {\n  float edge=sqrt(max(0.0,1.0-stem.x*stem.x/0.000625));\n  col=vec3(0.12,0.065,0.19)*light+vec3(0.18,0.04,0.35)*edge;\n  alpha=1.0; limit=stem.y;\n }\n vec3 emission=vec3(0.0); float energy=0.0;\n for(int i=0;i<8;i++) {\n  float id=float(i); float phase=id*2.399963;\n  float yy=-0.90+1.8*(id+0.5)/8.0;\n  float az=phase+0.25*sin(time*0.63+id*1.8);\n  yy+=0.09*sin(time*0.77+id*2.1);\n  vec3 dir=vec3(sqrt(1.0-yy*yy)*cos(az),yy,sqrt(1.0-yy*yy)*sin(az));\n  vec3 u=normalize(cross(dir,vec3(0.0,1.0,0.0))); vec3 v=cross(dir,u);\n  vec3 prev=dir*0.115; vec3 fork=prev;\n  float md=10.0;\n  float pulse=0.50+0.50*pow(0.5+0.5*sin(time*8.0+id*4.7+sin(time*3.1+id)),3.0);\n  for(int j=1;j<6;j++) {\n   float f=float(j)/5.0;\n   float wave=sin(f*3.141593);\n   float x=sin(f*21.0+id*7.0+time*2.5);\n   float y=sin(f*27.0-id*3.0-time*2.1);\n   vec3 p=dir*(0.115+0.727*f)+(u*x+v*y)*0.078*wave;\n   md=min(md,pbSegment(ro,rd,prev,p,front,limit).x);\n   if(j==3) fork=p;\n   prev=p;\n  }\n  float core=exp(-md*md/0.000014);\n  float hot=exp(-md*md/0.00014);\n  float haze=exp(-md*md/0.0012);\n  emission+=pulse*(vec3(1.9,1.3,2.3)*core+vec3(1.0,0.055,1.25)*hot+vec3(0.20,0.012,0.40)*haze);\n  energy+=pulse*(core+hot*0.7+haze*0.14);\n  if(i<4) {\n   vec3 tip=normalize(dir+u*0.21+v*0.1*sin(time+id))*0.838;\n   vec3 mid=mix(fork,tip,0.55)+v*0.05;\n   float bd=min(pbSegment(ro,rd,fork,mid,front,limit).x,pbSegment(ro,rd,mid,tip,front,limit).x);\n   float branch=exp(-bd*bd/0.000032)*pulse;\n   emission+=vec3(0.68,0.17,1.0)*branch;\n   energy+=branch*0.7;\n  }\n  vec3 end=dir*0.842;\n  float te=clamp(dot(end-ro,rd),front,limit);\n  float de=length(ro+rd*te-end);\n  float spark=exp(-de*de/0.00040)*pulse;\n  emission+=vec3(1.0,0.12,0.7)*spark;\n  energy+=spark*0.5;\n }\n float tc=clamp(-dot(ro,rd),front,limit);\n float dc=length(ro+rd*tc);\n float aura=exp(-max(dc-0.125,0.0)*20.0)*0.3;\n emission+=vec3(0.65,0.04,0.9)*aura;\n energy+=aura;\n float ea=1.0-exp(-energy*1.8);\n col=col*(1.0-ea*0.75)+emission;\n alpha=alpha+(1.0-alpha)*ea;\n vec3 n=normalize(ro+rd*front);\n float facing=abs(dot(n,rd));\n float fres=pow(1.0-facing,4.0);\n vec3 refl=rpw_sky(reflect(rd,n));\n float spec=pow(max(dot(reflect(rd,n),normalize(vec3(-0.35,0.8,0.48))),0.0),180.0);\n float glassAlpha=0.055+fres*0.65;\n vec3 glassCol=refl*light*0.8+vec3(0.05,0.018,0.10);\n col=col*(1.0-glassAlpha)+glassCol*glassAlpha+vec3(1.0,0.91,1.0)*spec*0.9;\n alpha=alpha+(1.0-alpha)*glassAlpha;\n alpha=max(alpha,spec*0.8);\n depth=front;\n return vec4(col/max(alpha,0.0001),clamp(alpha,0.0,1.0));\n}",
    "prompt": "a plasma ball: a glass globe with a glowing electrode in the middle and purple-pink lightning tendrils crackling out to the glass, flickering and wandering",
    "size": 4,
    "summary": "A transparent glass globe surrounds a glowing pink electrode, with branching purple-pink lightning that flickers, writhes, and wanders across the inner glass."
  }
}