{
  "name": "Sculk Soul Heart",
  "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 shSmooth(float a,float b,float k) {\n float h=clamp(0.5+0.5*(b-a)/k,0.0,1.0); return mix(b,a,h)-k*h*(1.0-h);\n}\nfloat shBeat(float time) {return 0.5+0.5*sin(time*3.6+0.35*sin(time*3.6));}\nfloat shShape(vec3 p,float beat) {\n p/=1.0+0.065*beat; p.y+=0.17;\n float a=length((p-vec3(-0.225,0.18,0.0))/vec3(0.32,0.32,0.31))-1.0;\n float b=length((p-vec3(0.225,0.18,0.0))/vec3(0.32,0.32,0.31))-1.0;\n float d=shSmooth(a*0.30,b*0.30,0.12);\n float taper=clamp(0.37+0.40*p.y,0.15,0.43);\n float body=(length(vec3(p.x/taper,(p.y+0.10)/0.47,p.z/(taper*0.82)))-1.0)*0.19;\n d=shSmooth(d,body,0.13);\n d+=0.006*sin(p.x*25.0+sin(p.z*18.0))*sin(p.y*22.0+p.z*9.0);\n return d*0.92;\n}\nvec3 shNormal(vec3 p,float beat) {\n vec2 e=vec2(0.002,-0.002);\n return normalize(e.xyy*shShape(p+e.xyy,beat)+e.yyx*shShape(p+e.yyx,beat)+e.yxy*shShape(p+e.yxy,beat)+e.xxx*shShape(p+e.xxx,beat));\n}\nvec4 object(vec3 ro,vec3 rd,float t0,float t1,float time,vec3 light,inout float depth) {\n float beat=shBeat(time); float t=t0; bool hit=false;\n for(int i=0;i<48;i++) {\n  float d=shShape(ro+rd*t,beat);\n  if(d<0.0012) {hit=true;break;}\n  t+=max(d,0.0008); if(t>t1) break;\n }\n vec3 col=vec3(0.0); float alpha=0.0; float limit=t1;\n if(hit) {\n  vec3 p=ro+rd*t; vec3 n=shNormal(p,beat);\n  vec3 q=p/(1.0+0.065*beat);\n  vec3 warp=vec3(rpw_noise(q*6.0),rpw_noise(q*6.0+11.3),rpw_noise(q*6.0+27.4));\n  float v=rpw_noise(q*7.5+warp*1.2);\n  float delta=abs(v-0.51);\n  float vein=1.0-smoothstep(0.014,0.038,delta);\n  float glow=exp(-delta*delta*180.0);\n  float mottling=rpw_noise(q*30.0);\n  vec3 base=mix(vec3(0.009,0.044,0.051),vec3(0.027,0.15,0.15),mottling);\n  float diff=max(dot(n,normalize(vec3(0.4,0.8,0.3))),0.0);\n  float fres=pow(1.0-max(dot(n,-rd),0.0),3.0);\n  float spec=pow(max(dot(reflect(rd,n),normalize(vec3(0.4,0.8,0.3))),0.0),24.0);\n  col=(base*(0.5+1.3*diff)+vec3(0.10,0.25,0.26)*spec+vec3(0.01,0.08,0.09)*fres)*light;\n  float pulse=0.60+0.7*shBeat(time-0.7*q.y);\n  col+=vein*vec3(0.045,0.84,0.97)*pulse+glow*vec3(0.0,0.08,0.085)*pulse;\n  float fleck=smoothstep(0.80,0.87,mottling)*(1.0-vein);\n  col+=fleck*vec3(0.08,0.48,0.52);\n  alpha=1.0; depth=t; limit=t;\n }\n vec3 particles=vec3(0.0); float pa=0.0; float nearest=t1;\n for(int j=0;j<12;j++) {\n  float id=float(j); float h=rpw_hash(vec3(id,7.0,2.0));\n  float age=fract(time*(0.10+0.025*h)+id*0.618034);\n  float ang=id*2.39996+time*0.22;\n  float rad=0.18+0.28*rpw_hash(vec3(id,4.0,8.0));\n  vec3 c=vec3(cos(ang)*rad,0.16+age*0.65,sin(ang)*rad);\n  c.x+=0.045*sin(time*1.1+id+age*4.0);\n  float fade=smoothstep(0.0,0.15,age)*(1.0-smoothstep(0.72,1.0,age));\n  vec3 sz=vec3(0.020+0.008*h,0.039+0.025*h,0.020+0.008*h);\n  vec3 o=(ro-c)/sz; vec3 r=rd/sz;\n  float tc=clamp(-dot(o,r)/dot(r,r),t0,limit);\n  float ds=dot(o+r*tc,o+r*tc);\n  float a=exp(-ds*1.4)*fade*0.85;\n  float halo=exp(-ds*0.18)*fade*0.10;\n  if(tc>=limit-0.0001) {a=0.0;halo=0.0;}\n  particles+=vec3(0.20,1.0,1.2)*a+vec3(0.0,0.35,0.5)*halo;\n  pa+=a+halo;\n  if(a>0.12) nearest=min(nearest,tc);\n }\n float palpha=clamp(pa,0.0,0.94);\n col=col*(1.0-palpha)+particles;\n float outa=alpha+(1.0-alpha)*palpha;\n if(!hit && palpha>0.01) depth=nearest<t1?nearest:clamp(-dot(ro,rd),t0,t1);\n return vec4(col/max(outa,0.0001),outa);\n}",
    "prompt": "a pulsing heart of sculk: a dark teal organic mass with glowing cyan veins and soul particles drifting up off it",
    "size": 4,
    "summary": "A dark-teal organic heart beats with glowing cyan veins while luminous soul wisps drift upward from its surface."
  }
}