{
  "name": "Little Sky Island",
  "dimension": "3d",
  "slot": "action_bar",
  "width": 256,
  "height": 128,
  "textBaseline": 128,
  "placement": {
    "x": 0,
    "y": 0
  },
  "shapes": [],
  "texts": [],
  "heads": [],
  "images": [],
  "bars": [],
  "triggers": [],
  "world": {
    "glsl": "float seg(vec3 p, vec3 a, vec3 b, float r1, float r2) {\n vec3 v=b-a; float h=clamp(dot(p-a,v)/dot(v,v),0.0,1.0); return length(p-a-v*h)-mix(r1,r2,h);\n}\nfloat rock(vec3 p) {\n float y=clamp((p.y+0.53)/0.61,0.0,1.0);\n float r=0.075+0.47*pow(y,0.68);\n float q=max(max(abs(p.x)*0.94,abs(p.z)*1.06),max(abs(p.x*0.72+p.z*0.72),abs(p.x*0.79-p.z*0.61)));\n float d=max((q-r)*0.70,max(p.y-0.08,-0.53-p.y));\n d=min(d,seg(p,vec3(-0.30,-0.13,0.04),vec3(-0.23,-0.63,0.10),0.13,0.012));\n d=min(d,seg(p,vec3(0.23,-0.10,-0.20),vec3(0.32,-0.49,-0.18),0.14,0.01));\n return d;\n}\nvec2 scene(vec3 p,float time) {\n vec2 h=vec2(rock(p),1.0);\n float radial=length(p.xz*vec2(1.0,1.09));\n float g=max(radial-0.54,max(p.y-(0.17-0.085*radial*radial),0.06-p.y));\n if(g<h.x) h=vec2(g,2.0);\n vec3 q=p; q.x+=0.013*sin(time*1.1+p.y*4.0)*smoothstep(0.2,0.8,p.y);\n float tr=seg(q,vec3(-0.14,0.13,-0.055),vec3(-0.16,0.61,-0.055),0.047,0.024);\n if(q.y>0.28) {\n tr=min(tr,seg(q,vec3(-0.15,0.38,-0.055),vec3(-0.30,0.59,-0.025),0.026,0.012));\n tr=min(tr,seg(q,vec3(-0.15,0.44,-0.055),vec3(0.02,0.65,-0.07),0.025,0.012));\n }\n if(tr<h.x) h=vec2(tr,3.0);\n float leaves=0.43-q.y;\n if(q.y>0.38) {\n leaves=length((q-vec3(-0.17,0.69,-0.065))*vec3(1.0,1.10,1.0))-0.207;\n leaves=min(leaves,length(q-vec3(-0.32,0.62,-0.015))-0.155);\n leaves=min(leaves,length(q-vec3(0.015,0.67,-0.065))-0.162);\n leaves=min(leaves,length(q-vec3(-0.16,0.62,0.10))-0.164);\n leaves=min(leaves,length(q-vec3(-0.23,0.67,-0.20))-0.15);\n leaves+=0.010*sin(q.x*61.0)*sin(q.y*52.0)*sin(q.z*59.0);\n }\n if(leaves<h.x) h=vec2(leaves,4.0);\n float water=abs(p.x-0.51)-0.11;\n if(water<h.x+0.02) {\n float yy=clamp((0.10-p.y)/0.79,0.0,1.0);\n float wx=0.475+0.10*(1.0-exp(-yy*7.0));\n float wz=0.12+0.008*sin(yy*16.0-time*2.5);\n water=max(abs(p.x-wx)-0.019,max(abs(p.z-wz)-(0.078-yy*0.035),max(p.y-0.105,-0.69-p.y)));\n water=max(water,(0.45-length(p.xz))*0.6);\n for(int i=0;i<3;i++) {\n float f=fract(time*0.48+float(i)*0.333333);\n vec3 c=vec3(0.575+0.014*sin(float(i)*3.0),-0.65-f*0.06,0.12+0.038*sin(float(i)*8.0));\n float drop=(length((p-c)*vec3(1.0,0.6,1.0))-0.018*(1.0-f*0.5))*0.8;\n water=min(water,drop);\n }\n }\n float stream=seg(p,vec3(0.10,0.163,0.12),vec3(0.47,0.137,0.12),0.028,0.071);\n water=min(water,stream);\n if(water<h.x)h=vec2(water,5.0);\n return h;\n}\nvec4 object(vec3 ro, vec3 rd, float t0, float t1, float time, vec3 light, inout float depth) {\n float t=t0; vec2 hit=vec2(0.0); bool found=false;\n for(int i=0;i<80;i++) {\n vec3 p=ro+rd*t; hit=scene(p,time);\n if(hit.x<0.0012) {found=true;break;}\n t+=max(hit.x*0.9,0.0007); if(t>t1)break;\n }\n if(!found)return vec4(0.0);\n depth=t;vec3 p=ro+rd*t;\n vec2 e=vec2(0.0015,-0.0015);\n vec3 n=normalize(e.xyy*scene(p+e.xyy,time).x+e.yyx*scene(p+e.yyx,time).x+e.yxy*scene(p+e.yxy,time).x+e.xxx*scene(p+e.xxx,time).x);\n float grain=rpw_noise(p*38.0);vec3 base;\n if(hit.y<1.5) {\n float mottling=rpw_noise(p*13.0);base=mix(vec3(0.32,0.33,0.34),vec3(0.58,0.51,0.41),mottling);\n float strata=smoothstep(0.05,0.14,abs(sin(p.y*48.0+p.x*8.0+p.z*3.0)));base*=0.8+0.2*strata;\n base*=0.8+0.3*grain;\n if(p.y>0.015)base=mix(base,vec3(0.30,0.19,0.085),0.7);\n } else if(hit.y<2.5) {\n base=mix(vec3(0.13,0.34,0.035),vec3(0.43,0.68,0.10),grain);\n } else if(hit.y<3.5) {\n base=mix(vec3(0.17,0.07,0.023),vec3(0.39,0.22,0.07),grain);base*=0.75+0.25*sin(atan(p.z+0.055,p.x+0.15)*13.0+p.y*9.0);\n } else if(hit.y<4.5) {\n base=mix(vec3(0.055,0.23,0.028),vec3(0.30,0.57,0.055),smoothstep(0.25,0.75,grain));\n } else {\n float streak=pow(0.5+0.5*sin(p.z*230.0+sin(p.y*20.0-time*4.0)*1.6),6.0);\n float flow=0.5+0.5*sin(p.y*55.0+time*6.0+p.z*75.0);\n base=mix(vec3(0.055,0.48,0.71),vec3(0.72,0.95,1.0),streak*0.75+flow*0.12);\n float spec=pow(max(dot(reflect(rd,n),normalize(vec3(0.4,0.8,0.3))),0.0),22.0);\n return vec4(base*(0.8+0.2*max(n.y,0.0))+spec*0.6,0.88);\n }\n float diff=max(dot(n,normalize(vec3(-0.4,0.8,0.5))),0.0);\n vec3 shading=vec3(0.40,0.44,0.50)+diff*vec3(0.85,0.78,0.62);\n float ao=1.0;\n if(hit.y>1.5&&hit.y<2.5)ao=0.64+0.36*smoothstep(0.05,0.26,length(p.xz-vec2(-0.14,-0.055)));\n return vec4(base*shading*ao*light,1.0);\n}",
    "prompt": "a tiny floating island: a grassy top with one tree, rocky roots hanging underneath, and a little waterfall pouring off the edge into nothing",
    "size": 4,
    "summary": "A tiny grassy island with hanging rocky roots, one gently swaying tree, and a shimmering waterfall spilling into vanishing droplets."
  }
}