{
  "name": "Floating Jack",
  "dimension": "3d",
  "slot": "action_bar",
  "width": 256,
  "height": 128,
  "textBaseline": 128,
  "placement": {
    "x": 0,
    "y": 0
  },
  "shapes": [],
  "texts": [],
  "heads": [],
  "images": [],
  "bars": [],
  "triggers": [],
  "world": {
    "glsl": "const int STATE_IDLE = 0;\n\nfloat pumpkinBody(vec3 p) {\n    float r = length(p.xz);\n    float a = atan(p.x, p.z);\n    float ribs = 0.028 * cos(a * 10.0) + 0.007 * cos(a * 20.0);\n    float radius = 0.695 + ribs * smoothstep(0.08, 0.4, r) - 0.058 * exp(-r * 12.0);\n    return (length(vec3(p.x, p.y * 1.19, p.z)) - radius) * 0.84;\n}\n\nfloat pumpkinFace(vec2 p) {\n    vec2 e = vec2(abs(p.x), p.y);\n    float eyes = max(max(dot(e-vec2(0.13,0.145),vec2(0.124,-0.992)),dot(e-vec2(0.49,0.19),vec2(0.677,0.736))),dot(e-vec2(0.30,0.365),vec2(-0.791,0.611)));\n    float nose = max(-p.y-0.075,dot(vec2(abs(p.x)-0.085,p.y+0.075),vec2(0.8944,0.4472)));\n    float x = p.x;\n    float curve = (x/0.49)*(x/0.49);\n    float upper = -0.185 + 0.165 * curve;\n    float lower = -0.405 + 0.34 * curve;\n    float mouth = max(max(p.y-upper, lower-p.y), abs(x)-0.5);\n    float toothTop = max(abs(abs(x)-0.205)-0.045, -0.238-p.y);\n    float toothBottom = max(abs(abs(x)-0.34)-0.036, p.y+0.225);\n    mouth = max(mouth, -min(toothTop,toothBottom));\n    return min(min(eyes,nose),mouth);\n}\n\nfloat pumpkinStem(vec3 p) {\n    float h = clamp((p.y-0.51)/0.30,0.0,1.0);\n    vec3 q = p;\n    q.x -= 0.085*h*h;\n    q.z -= 0.028*h;\n    float r = 0.057-0.017*h;\n    float d = length(vec3(q.x,max(max(0.53-p.y,p.y-0.79),0.0),q.z))-r;\n    return d * 0.8;\n}\n\nfloat pumpkinMap(vec3 p) {\n    float outer = pumpkinBody(p);\n    float inner = (length(vec3(p.x,p.y*1.20,p.z))-0.597)*0.83;\n    float shell = max(outer,-inner);\n    float holes = max(pumpkinFace(p.xy),0.24-p.z);\n    shell = max(shell,-holes);\n    return min(shell,pumpkinStem(p));\n}\n\nvec4 object(vec3 ro, vec3 rd, float t0, float t1, float time, vec3 light, inout float depth) {\n    float seed = rpw_seed * 1.731;\n    float bob = 0.065*sin(time*0.95+seed);\n    float turning = 0.085*sin(time*0.48+seed);\n    ro.y -= bob;\n    ro.xz = rpw_rot(turning)*ro.xz;\n    rd.xz = rpw_rot(turning)*rd.xz;\n    float t = t0;\n    bool hit = false;\n    for (int i=0; i<88; i++) {\n        vec3 p = ro+rd*t;\n        float d = pumpkinMap(p);\n        if(d<0.0012) { hit=true; break; }\n        t += max(d*0.88,0.0008);\n        if(t>t1) break;\n    }\n    if(!hit) return vec4(0.0);\n    depth = clamp(t,t0,t1);\n    vec3 p=ro+rd*t;\n    vec2 e=vec2(0.0015,0.0);\n    vec3 n=normalize(vec3(pumpkinMap(p+e.xyy)-pumpkinMap(p-e.xyy),pumpkinMap(p+e.yxy)-pumpkinMap(p-e.yxy),pumpkinMap(p+e.yyx)-pumpkinMap(p-e.yyx)));\n    vec3 key=normalize(vec3(-0.45,0.8,0.65));\n    float diff=max(dot(n,key),0.0);\n    float angle=atan(p.x,p.z);\n    float grooves=pow(0.5-0.5*cos(angle*10.0),5.0)*smoothstep(0.12,0.48,length(p.xz));\n    float grain=rpw_noise(p*42.0+vec3(seed));\n    float mottled=rpw_noise(p*13.0+vec3(seed));\n    vec3 skin=mix(vec3(0.93,0.23,0.016),vec3(0.50,0.083,0.006),grooves*0.73);\n    skin*=0.87+0.22*mottled+0.08*grain;\n    skin*=1.0-0.20*smoothstep(0.35,0.57,abs(p.y));\n    float flicker=0.89+0.075*sin(time*8.1+seed)+0.055*sin(time*13.7+1.8+seed)+0.035*sin(time*21.2+seed);\n    vec3 fire=vec3(1.0,0.43,0.026);\n    vec3 col;\n    if(pumpkinStem(p)<0.003 && p.y>0.49) {\n        float lines=0.5+0.5*sin(atan(p.z,p.x-0.05)*9.0+p.y*8.0);\n        vec3 stem=mix(vec3(0.14,0.18,0.036),vec3(0.31,0.27,0.066),lines);\n        col=stem*(0.35+0.82*diff)*light;\n    } else {\n        float outer=pumpkinBody(p);\n        float flesh=1.0-smoothstep(-0.04,-0.005,outer);\n        vec3 fleshColor=vec3(1.0,0.50,0.065);\n        vec3 material=mix(skin,fleshColor,flesh);\n        float ambient=0.30+0.15*max(n.y,0.0);\n        col=material*(ambient+0.95*diff)*light;\n        float spec=pow(max(dot(reflect(-key,n),-rd),0.0),30.0);\n        col+=vec3(1.0,0.66,0.26)*spec*0.19*light;\n        float interior = smoothstep(0.25,0.7,dot(n,-normalize(p+vec3(0.0,0.02,0.0))));\n        float glow = max(flesh*0.42,interior);\n        vec2 fireCenter=vec2(0.025*sin(time*3.1+seed),0.14+0.018*sin(time*4.7));\n        float hot=pow(max(0.0,1.0-length(p.xy*vec2(1.0,1.35)+fireCenter)/0.76),2.0);\n        float dancing=rpw_noise(p*9.0+vec3(time*0.65,-time*1.5,seed));\n        col+=fire*glow*flicker*(1.23+hot*1.5+dancing*0.22);\n        float faceDist=max(pumpkinFace(p.xy),0.0);\n        float halo=exp(-faceDist*36.0)*smoothstep(0.32,0.55,p.z)*(1.0-flesh);\n        col+=fire*halo*0.17*flicker;\n    }\n    return vec4(col,1.0);\n}",
    "prompt": "a floating jack-o-lantern head that bobs slowly up and down with a flickering glowing face",
    "size": 3
  }
}