Dims, tri counts and node names all pass on a bike leaning the wrong way and
a gutter that never fell. The Blender contact sheet is close but renders
through Blender's view transform — it showed this sprint's jacaranda as
near-white lavender when the material is #8C7FC0, so a colour call made there
is a call about Blender, not about the game.
Smallest thing that answers the question: the game's own vendored three.js,
daylight, a ground plane, and the 1.7 m ref capsule beside whatever you name.
/tools/assetcheck/look.html?a=swing_set_01,tree_jacaranda_01&cam=10,4.5,22
It caught two things this sprint the numbers could not: the lilac reads lilac
in the real renderer (the thumb was lying), and the swing set's wreck lands on
+Z with a 2.9 m reach against a 0.95 m standing footprint — which is now baked
as a placement extra and asserted.
Sized at draw time, every time: a tab that boots hidden reports 0x0 and you
get a correct scene rendered into nothing. That cost me the first screenshot
of this very page, so it is in the MANUAL gotcha list where it already was.
|
||
|---|---|---|
| .. | ||
| assets_in_three.html | ||
| look.html | ||
| README.md | ||
assets_in_three.html — verify the GLBs in the real consumer
build_yard_assets.py already re-imports every GLB into Blender and asserts
dims, tri budget, and node names. That is necessary but structurally cannot
catch an axis error: Blender exports Z-up→Y-up and imports Y-up→Z-up, so a
broken export_yup flips back on the way in and round-trips green. Only
something that reads glTF natively can prove the file is right.
This page is that check. It loads each GLB with three.js r175's GLTFLoader and
asserts:
- Y-up: a Blender asset measuring
(dx, dy, dz)must arrive as(dx, dz, dy). - node survival:
branch_anchor_*,fascia_anchor_*,plants_*etc. still exist after the export — glTF has no "empty", anchors arrive as bareObject3D, and exporters have been known to prune childless nodes. - anchors are usable:
branch_anchor_01resolves to a sane world position with height on +Y.
Expectations are read from tools/blender/asset_report.json, so this stays in
sync with the factory automatically.
Why it uses the default (non-precise) Box3
THREE.Box3.setFromObject(obj) expands each mesh's local bounding box by the
world matrix, so a node carrying a rotation reports an inflated box. That is the
same trap Blender's obj.bound_box sets, and it is what three uses for frustum
culling. join_group() therefore bakes rotation into the vertices so the local
box is axis-aligned and tight. Passing precise: true here would hide exactly
the regression this page exists to catch — so don't.
Before that fix, three reported tramp_01 as 3.29 × 1.27 m against a true
2.96 × 0.78 m.
Running it
Needs three.js on /world/vendor/ and the models on /models/. Once Lane A's
server.py lands, serve web/ and this can move next to selftest.html
(Lane A: happy to fold it in — see THREADS).
Until then, the standalone recipe:
D=$(mktemp -d) && mkdir -p "$D/world"
ln -s ~/Documents/90sDJsim/web/world/vendor "$D/world/vendor"
ln -s "$PWD/web/world/models" "$D/models"
ln -s "$PWD/tools/blender/asset_report.json" "$D/asset_report.json"
cp tools/assetcheck/assets_in_three.html "$D/index.html"
python3 -m http.server 8805 --directory "$D"
# open http://127.0.0.1:8805 — look for "SUMMARY: ALL PASS IN THREE.JS"