from pathlib import Path
from PIL import Image,ImageDraw,ImageFont
import json
P=Path('/opt/creature-lib-20261017');files=[P/'renders'/(g.stem+'-hero.png') for g in sorted((P/'glb').glob('*.glb'))]
font=ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf',17)
w=320;h=350;cols=5;out=Image.new('RGB',(cols*w,((len(files)+cols-1)//cols)*h),'#17212c');d=ImageDraw.Draw(out)
for i,p in enumerate(files):
 im=Image.open(p).convert('RGB');im.thumbnail((w,w));x=(i%cols)*w;y=(i//cols)*h;out.paste(im,(x,y));d.text((x+8,y+w+5),p.name.replace('enemy-','').replace('-hero.png',''),font=font,fill='white')
out.save(P/'contact_sheet.png')
for i in range(0,len(files),4):
 out=Image.new('RGB',(1040,1506),'#17212c')
 for j,p in enumerate(files[i:i+4]):
  im=Image.open(str(p).replace('-hero.png','-clips.png')).convert('RGB');im=im.resize((520,753));out.paste(im,((j%2)*520,(j//2)*753))
 out.save(P/'renders'/f'review-clips-{i//4+1}.jpg',quality=95)
print('sheets',len(files))
for p in sorted((P/'evidence').glob('*-runtime.json')):
 r=json.loads(p.read_text())
 if not (P/'glb'/(r['id']+'.glb')).exists():continue
 print(r['id'],'bytes',(P/'glb'/(r['id']+'.glb')).stat().st_size,'ground',round(r['ground'],5),'feet',[(k,[(b['bone'],round(b['speed'] or 0,3),round(b.get('velocity_p10') or 0,3),round(b.get('velocity_p90') or 0,3)) for b in s.get('feet',[])]) for k,s in r['speeds'].items()])
