{
  "name": "Pocket Saturn",
  "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 satLocal(vec3 p) {\n    p.xy = rpw_rot(0.30) * p.xy;\n    p.yz = rpw_rot(0.32) * p.yz;\n    return p;\n}\nvec4 object(vec3 ro, vec3 rd, float t0, float t1, float time, vec3 light, inout float depth) {\n    vec3 o = satLocal(ro);\n    vec3 d = satLocal(rd);\n    vec3 sun = normalize(satLocal(vec3(-0.5,0.8,0.7)));\n    float b = dot(o,d);\n    float c = dot(o,o)-0.425*0.425;\n    float h = b*b-c;\n    float tp = t1+1.0;\n    if(h>0.0) {\n        float nearT = -b-sqrt(h);\n        float farT = -b+sqrt(h);\n        if(nearT>=t0 && nearT<=t1) tp=nearT;\n        else if(farT>=t0 && farT<=t1) tp=farT;\n    }\n    vec3 pc=vec3(0.0);\n    if(tp<=t1) {\n        vec3 p=o+d*tp;\n        vec3 n=p/0.425;\n        vec3 q=p;\n        q.xz=rpw_rot(time*0.13)*q.xz;\n        float turbulence=rpw_noise(q*24.0+vec3(0.0,time*0.025,0.0));\n        float band=sin(n.y*42.0+2.0*turbulence)+0.34*sin(n.y*94.0+turbulence*3.0);\n        vec3 base=mix(vec3(0.57,0.35,0.16),vec3(0.96,0.78,0.47),smoothstep(-1.15,1.0,band));\n        base=mix(base,vec3(0.96,0.87,0.67),0.22+0.13*sin(n.y*15.0));\n        float diffuse=max(dot(n,sun),0.0);\n        float shadow=1.0;\n        float ts=-p.y/sun.y;\n        if(ts>0.0) {\n            float r=length((p+sun*ts).xz);\n            shadow=1.0-0.54*smoothstep(0.52,0.54,r)*(1.0-smoothstep(0.87,0.9,r));\n            shadow+=0.38*exp(-pow((r-0.733)/0.012,2.0));\n            shadow=min(shadow,1.0);\n        }\n        pc=base*(vec3(0.27,0.28,0.32)+diffuse*shadow*vec3(0.85,0.79,0.66))*light;\n        float rim=pow(1.0-max(dot(n,-d),0.0),3.0);\n        pc+=vec3(0.39,0.28,0.12)*rim*(0.3+0.7*diffuse)*light;\n    }\n    float tr=t1+1.0;\n    float ra=0.0;\n    vec3 rc=vec3(0.0);\n    if(abs(d.y)>0.0001) {\n        tr=-o.y/d.y;\n        if(tr>=t0 && tr<=t1) {\n            vec3 p=o+d*tr;\n            float r=length(p.xz);\n            float edge=smoothstep(0.51,0.535,r)*(1.0-smoothstep(0.89,0.925,r));\n            float gap=1.0-0.93*exp(-pow((r-0.735)/0.010,4.0));\n            float grooves=0.79+0.08*sin(r*360.0)+0.045*sin(r*720.0)+0.025*sin(r*1100.0);\n            float broad=0.63+0.37*smoothstep(0.54,0.65,r);\n            ra=edge*gap*clamp(grooves*broad,0.0,1.0);\n            rc=mix(vec3(0.45,0.29,0.14),vec3(0.94,0.81,0.58),smoothstep(0.54,0.68,r));\n            rc*=0.78+0.22*sin(r*205.0);\n            float along=dot(p,sun);\n            float closest=length(p-sun*along);\n            float shade=along<0.0 ? smoothstep(0.407,0.446,closest) : 1.0;\n            rc*=mix(vec3(0.20,0.23,0.29),vec3(1.0,0.94,0.81),shade)*light;\n        }\n    }\n    if(tp<=t1) {\n        depth=tp;\n        if(tr<tp && ra>0.0) {\n            if(ra>0.3) depth=tr;\n            return vec4(mix(pc,rc,ra),1.0);\n        }\n        return vec4(pc,1.0);\n    }\n    if(ra>0.001) { depth=tr; return vec4(rc,ra); }\n    return vec4(0.0);\n}",
    "prompt": "a tiny planet with rings, like Saturn",
    "size": 2,
    "summary": "A tiny golden gas giant with slowly rotating cloud bands, tilted dusty rings, a dark ring gap, and soft mutual shadows."
  }
}