Standalone/Tools/webviewer: stdlib Python server bound to 127.0.0.1 (mesh list API, .glb serving with path checks), .vfmesh (VFMSH001/002) -> GLB converter (Z-up -> Y-up, normals, tile/triangle metadata), and a three.js 0.160.0 page: WASD/mouse + touch flight, speed, fog, wireframe/normal colours, stats, mesh picker, A/B toggle. Three sample GLBs. Server smoke-tested on localhost (index, mesh list, GLB, traversal rejected); in-browser rendering not yet checked. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016dhxM43dnWvUu2B5Ph1iG1
1.5 KiB
W1 web viewer report
Implemented in Standalone/Tools/webviewer/: a localhost-only Python server, a standard-library VFMSH001/002 to GLB converter, a pinned Three.js viewer with desktop/touch flight, speed, lighting/fog, wireframe/normal colours, stats, mesh selection, and A/B switching. See the tool README for commands and use limits.
Converted three existing meshes (source bytes → GLB bytes; conversion time):
| Mesh | Bytes | Convert | Warm local read (5 reads, mean) |
|---|---|---|---|
capture-sw-far-v20-settled-surface |
62,304 → 63,548 | 1.995 ms | 0.010 ms |
fi-floor-v20-lod4-focus |
113,076 → 109,612 | 4.061 ms | 0.015 ms |
capture-fi-mouth |
63,932 → 62,100 | 2.102 ms | 0.017 ms |
Verified: all three GLB v2 headers/chunks, JSON, vertex/normal/index buffer lengths, finite vertex data, in-range indices, and expected tile/triangle metadata; Node syntax check passed for the inline viewer module. The local read timings are warm filesystem reads, not browser decode or network timings.
Not verified: server startup and visual mesh loading in a browser. Starting server.py --port 18765 reached socket bind and failed with PermissionError: [Errno 1] Operation not permitted in this execution sandbox; the attempt is logged in Saved/Linux/w1/webviewer-server.log. No headless browser was found. Thus GLB structure is validated, but visual rendering and in-browser load timing still need a run outside this sandbox. The server code binds explicitly to 127.0.0.1 and has no host override.