+1 draw / +894 tris with the bird on screen, +0 with it off — measured same page, same frame, by toggling the InstancedMesh count. ?noassets keeps the 182-tri procedural bird (+1 / +182), so this is furniture.js's use-if-ready SECOND path, not a substitution. state.asset reports which bird is bound. THREE THINGS MEASURED BEFORE THIS WAS SAFE, AND ALL THREE WOULD HAVE SHIPPED WRONG: · E's bird faces +Z and this file flies -Z (Matrix4.lookAt's -Z column is the travel direction). Sliced the GLB's 894 tris along Z in ten bins: +Z end mean y 0.31, half-width 0.009 (head + bill); -Z end mean y 0.028 (tail). Without rotateY(PI) the magpie swoops TAIL-FIRST. This is the FIFTH -Z/+Z instance and the first caught BEFORE it shipped — because R39's lineage table said to point a measurement at it. Verified in pictures: perched head-leading, and a swoop frame taken head-on. · Its origin is at the FEET (GLB law minY=0) while PERCH_Y is a body-centre height: dropped 0.20 m so it stands on the lamp arm (4.12) instead of hovering. `folded` is 1 for the GLB — it IS the perch. · THE FETCH IS ARMED BY createMagpie(), NOT BY THE IMPORT. index.html imports this module unconditionally and gates only the CONSTRUCTION, so a module-scope loadGLB (furniture.js's shape) would have put a brand-new GLB request on the ?classic=1 boot — a fetch delta on the one boot that is not allowed one. Asserted on the network log, not on the code: default 1 request (asset 'glb', 894 tris) · ?classic=1 0 · ?magpie=0 0 · ?noassets=1 0 (asset 'primitive', 182). AND ONE MY EDIT INTRODUCED INTO ANOTHER LANE'S TOOL: a module-scope loadGLB also fires GLTFLoader's fetch path under node, so Lane E's pipeline/dump_bird.mjs (which imports this module unmodified) died with "ProgressEvent is not defined". Gated on IN_BROWSER as well as ?noassets; E's tool then ran against my edit and reported 182 triangles / 216 verts — the placement fixes are exactly +0 tris. THE FALLBACK, FIXED AND THEN MEASURED — a half-win, stated as one. E is right that the white bars sat 3 mm ABOVE horizontal wing planes, so from below (the player is always below: perch 4.32 m, EYE 1.62) the black wing occluded its own flash: bar y 0.048 -> 0.042. Same class of fix, my own arithmetic, for the other two marks: the nape was BURIED IN THE HEAD (head-sphere surface at z=-0.10 is y 0.0728, the box topped out at 0.067) so it moved behind the head to z -0.07; nape and rump thickened 0.014->0.030 and 0.02->0.034, because from the flank a 14 mm slab on a 166 mm bird is 1.3 px at 64 px. All +0 tris. Measured in the same crop of the same pose: pale area 180 -> 399 px, dark 3,017 -> 2,755 — but TRUE white 33 -> 28, because a downward-facing surface gets no sun. E's GLB reads 755. The fallback cannot be made pied with primitives at zero cost; the problem is photometric as well as geometric. Stale comments corrected: magpie.js:9 and :123 said 154 triangles; it is 182 (E's ask 1). FILED, NOT FIXED: the arcade's awning posts land +/-0.50 m from the centreline — two rows 1.00 m apart, 34 posts down a 5.00 m lane (my own measurement from the plan, confirming E's). AWNING_DEPTH 2.2 is tuned for a 9 m footpath. One clamp fixes it, but it changes default-boot geometry for a district whose whole treatment is a scheduled item, and the post line should be designed with the roof. Lane E's transmission recall checked, not assumed: longbench, streetlight and magpie as staged in web/assets/models/ carry no KHR_materials_transmission. My lane wires neither of the first two today. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| before | ||
| laneA | ||
| laneB | ||
| laneB_r4 | ||
| laneB_r37_kerb | ||
| laneB_r38 | ||
| laneB_r39 | ||
| laneC | ||
| laneD | ||
| laneE | ||
| laneF | ||
| references | ||
| release_v3 | ||
| release_v3_1 | ||
| release_v4 | ||
| release_v5 | ||
| v1_tour | ||
| v2_tour | ||
| v4_alpha | ||
| v4_beta | ||
| v7_alpha | ||
| v7_beta | ||
| v7_tour | ||
| contact.html | ||
| README.md | ||
| v2_contact.html | ||
docs/shots — visual regression + devlog reference tree
Owned by Lane F (each lane also drops its own acceptance screenshots here).
docs/shots/
laneA/ … laneE/ … per-lane acceptance screenshots (each lane owns its dir)
v1_tour/ … F: the v1 beauty shots (tools/shots.py) — frozen devlog set
v2_tour/ … F: the v2 tour (tools/v2_tour.py) — the CURRENT canonical set (see below)
before/ … F: last known-good capture, for side-by-side regression
references/ … real-world reference photos named per shot
v2_contact.html … generated contact sheet for the v2 tour
v2 tour — stable filenames (do not rename; the v3 site links these)
cd web && python3 -m http.server 8130 then tools/.venv/bin/python tools/v2_tour.py
→ 1280×720 PNGs in v2_tour/ + docs/shots/v2_contact.html.
| file | what it documents |
|---|---|
street_noon.png |
main strip at midday |
crossroads_busy.png |
busiest intersection, peds about |
shopfront_detail.png |
verandah + sign + window up close |
patronage_door.png |
streamed peds at an open shop's door (Lane D patronage) |
rain_verandah.png |
rain outside a lit ?winmap video-shop window |
rain_street.png |
wet strip, rain down the street |
tram_stop.png |
the v2 tram paused at a shelter (?tram=1) |
night_crowd.png |
VIDEO REGAL glowing amid CLOSED neighbours at night — the §3.5 hours story (clean-night boot). NB: no visible street crowd — see the note below. |
browsers.png |
an occupied shop's interior life — a browser at the rack + the keeper at the counter, both human-sized (R10 giant-rig fix). figures human-sized vs door/fittings: yes. |
dig_real.png |
riffling a real-cover record bin (?dig=1&stock=real) |
katoomba_main.png |
plan-agnostic main strip (?plansrc=osm&town=katoomba) |
Note on night_crowd (Lane F, R10)
Re-framed to the tighter, readable "one lit shop in a closed town" composition. It does not show a
standing street crowd, and that is not a framing bug: Lane D's night patronage parks ducked-in patrons
hidden inside the shop (they become the interior browsers seen in browsers.png), and seed 20261990's
video shop sits on a low-traffic corner, so none gather visibly outside (tested: 0 patronage / 0 visible
at night). The town's night life is the interior presence + the neon-vs-CLOSED mood. A visible outdoor
night queue would need a new Lane-D mechanic (loiter-outside-the-openLate-shop) — parked for v3. The
~20 fps in night captures is a headless-chromium software-GL artifact (the scene is light, ~128
draws / 65k tris); on real hardware the night scene is not a perf concern.
Regression workflow
Before a risky change, snapshot the good state into before/, then re-run v2_tour.py and eyeball
v2_contact.html. Process rule (R10): any shot containing a humanoid gets an explicit
"figures human-sized relative to doors/fittings: yes" line in the progress note — actually look.