Carrom: 3D asset contract
Tournament-size carrom board (74 cm playing surface, cut pockets), 9 white + 9 black coins, the red queen and a striker.
The game code positions every prop from these numbers (also in shared/props.lua). Change sizes, origins, names or face mappings only together with the scripts in blender/ and a re-export.
| Asset | Name (model + file) | Size | Origin | Notes |
|---|---|---|---|---|
| Board | lumo_carrom_board | 0.86 × 0.86 × 0.030 m; playing surface 0.74 m at z = 0.012, rails 18 mm above it | centre of the bottom | Face lumo_carrom_face covers the 0.74 m surface, UV 0..1. Textures in lumo_carrom_board.ytd (not embedded, for a DUI). Pockets r 22.5 mm at (±0.346, ±0.346), floor z 0.003. Box collision. |
| Coins | lumo_carrom_coin_white, _coin_black, lumo_carrom_queen | Ø 30.2 mm × 8 mm | centre of the bottom | Embedded textures. No collision. |
| Striker | lumo_carrom_striker | Ø 41.3 mm × 8 mm | centre of the bottom | Embedded. |
| Ytyp | lumo_carrom.ytyp | — | — | One archetype per model |
Markings: baselines 10.15 cm from each rail (two lines 3.18 cm apart, red end circles at x = ±0.2191), centre circle r 8.5 cm, pocket arrows. Numbers in shared/props.lua. Physics is up to the game code (the board's collision is only a box so peds don't walk through it).
Face textures: UV v up = +Y in Blender; Sollumz flips V on export, so in game v = 0.5 − y / size (v = 0 is the +Y edge) and the PNG's top row is the +Y edge.
Rebuild
Needs Blender 5.2 LTS, Sollumz 2.9 and texconv.exe (Microsoft DirectXTex) on PATH or in %USERPROFILE%\.local\bin (the lumo-ludo pipeline).
- Only if the art changed:
python blender/make_textures.py(Python 3 + Pillow + numpy). - Blender → Scripting → Text → Open
blender/build_all.py→ Run Script (orblender --background --python blender/build_all.py). It empties the open scene, rebuilds every prop, exports tostream/and savesblender/lumo_carrom.blend. - Never hand-edit the files in
stream/; change the scripts and run again.
Blender MCP prompt: "Run blender/build_all.py in Blender with __file__ set to its path, show me the report and the files it wrote, then screenshot the props in Material Preview."