{
  "name": "Mirrored Disco Ball",
  "dimension": "3d",
  "slot": "action_bar",
  "width": 256,
  "height": 128,
  "textBaseline": 128,
  "placement": {
    "x": 0,
    "y": 0
  },
  "shapes": [],
  "texts": [],
  "heads": [],
  "images": [],
  "bars": [],
  "triggers": [],
  "world": {
    "glsl": "vec3 discoNormal(vec3 n, float time) {\n    vec3 q=n;\n    q.xz=rpw_rot(time*0.38)*q.xz;\n    float lat=asin(clamp(q.y,-1.0,1.0));\n    float row=floor((lat+1.5707963)/0.1308997);\n    float mid=-1.5707963+(row+0.5)*0.1308997;\n    float count=max(6.0,floor(48.0*cos(mid)+0.5));\n    float lon=atan(q.z,q.x);\n    float a=(floor((lon+3.14159265)*count/6.2831853)+0.5)*6.2831853/count-3.14159265;\n    vec3 v=vec3(cos(mid)*cos(a),sin(mid),cos(mid)*sin(a));\n    v.xz=rpw_rot(-time*0.38)*v.xz;\n    return v;\n}\nvec4 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.84*0.84;\n    if(h<0.0) return vec4(0.0);\n    float t=-b-sqrt(h);\n    if(t<t0) t=-b+sqrt(h);\n    if(t<t0 || t>t1) return vec4(0.0);\n    depth=t;\n    vec3 n=normalize(ro+rd*t);\n    vec3 q=n;\n    q.xz=rpw_rot(time*0.38)*q.xz;\n    float lat=asin(clamp(q.y,-1.0,1.0));\n    float row=floor((lat+1.5707963)/0.1308997);\n    float mid=-1.5707963+(row+0.5)*0.1308997;\n    float count=max(6.0,floor(48.0*cos(mid)+0.5));\n    float u=(atan(q.z,q.x)+3.14159265)*count/6.2831853;\n    vec2 uv=vec2(fract(u),fract((lat+1.5707963)/0.1308997));\n    vec2 ed=min(uv,1.0-uv);\n    float tile=smoothstep(0.019,0.042,min(ed.x,ed.y));\n    vec3 fn=discoNormal(n,time);\n    vec3 r=reflect(rd,fn);\n    vec3 sky=rpw_sky(r);\n    float bands=0.5+0.5*sin(r.x*14.0+r.z*9.0);\n    sky*=0.48+0.52*smoothstep(0.3,0.7,bands);\n    float rnd=rpw_hash(vec3(floor(u),row,2.0));\n    vec3 col=sky*(0.78+0.30*rnd);\n    col+=vec3(0.13,0.15,0.19)*pow(1.0-abs(dot(fn,-rd)),4.0);\n    vec3 l1=normalize(vec3(-0.5,0.7,0.8));\n    vec3 l2=normalize(vec3(0.9,0.25,0.4));\n    vec3 l3=normalize(vec3(-0.7,-0.1,-0.6));\n    col+=vec3(1.0,0.93,0.74)*pow(max(dot(r,l1),0.0),100.0)*4.0;\n    col+=vec3(0.25,0.65,1.0)*pow(max(dot(r,l2),0.0),85.0)*2.8;\n    col+=vec3(1.0,0.2,0.55)*pow(max(dot(r,l3),0.0),85.0)*2.8;\n    float bevel=(1.0-smoothstep(0.042,0.072,min(ed.x,ed.y)))*tile;\n    col+=bevel*vec3(0.24,0.28,0.34)*(0.3+0.7*max(dot(fn,l1),0.0));\n    col*=light;\n    col=mix(vec3(0.025,0.033,0.044)*light,col,tile);\n    vec2 star=abs(uv-0.5);\n    float rays=exp(-star.x*95.0-star.y*7.0)+exp(-star.y*95.0-star.x*7.0);\n    float core=exp(-dot(star,star)*300.0);\n    float pulse=pow(max(0.0,sin(time*1.7+rnd*83.0+row*1.6)),10.0);\n    float sparkle=smoothstep(0.959,0.985,rnd)*pulse*smoothstep(0.15,0.7,dot(n,-rd));\n    col+=vec3(0.86,0.94,1.0)*(rays*2.0+core*4.0)*sparkle*tile;\n    return vec4(col,1.0);\n}",
    "prompt": "a spinning mirrored disco ball made of hundreds of little square tiles, each catching the light and sparkling",
    "size": 3,
    "summary": "A slowly spinning sphere clad in hundreds of square mirror tiles, with faceted reflections, silver edges, and sparkling white glints."
  }
}