ship_capture: ingest the draw-logger format + quantify the static gaps
The correlator now accepts BOTH capture formats: the F10 ship-capture snapshot and the draw-logger format (mission_draws.log / xenia_re_draws.log) via parse_drawlog — group the ship shader's draws by vertex-buffer base, vcount = size_words/stride_words, keep the first c0..c2 WVP. So a capital ship seen in a normal instrumented run bakes without a dedicated F10 pass. correlate_capture auto-detects the format. Shared normalize_wvp between both parsers. Also add examples/ship_dump.rs (offline static-placement inspector) and record the measured static-assembler gaps for e106 in the doc: bdy_01/bdy_02 overlap (runtime port/starboard mirror at X=+-264), eng_02 and wep_02_01 never placed. These confirm exact placement is runtime-only — nothing more to squeeze statically; the capture-driven table is the only path. The draw logs present on this box are the player fighter, so no capital-ship table can be baked offline. 7 ship_capture tests (adds draw-log parse + correlate); 77 formats-lib green. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -65,6 +65,12 @@ synthetic captures): `parse_capture` → `CapturedDraw`s, `correlate(id, draws,
|
||||
parts, ref_sub)` → a `ShipPlacement` (each part in the reference frame), and
|
||||
`serialize_table`/`parse_table` for the checked-in text table.
|
||||
|
||||
Two capture formats are accepted (auto-detected): the F10 ship-capture snapshot
|
||||
([`parse_capture`]) and the **draw-logger** format `mission_draws.log`/
|
||||
`xenia_re_draws.log` (`parse_drawlog` — groups the ship shader `SHIP_VS_HASH`'s
|
||||
draws by vertex-buffer `base`, `vcount = size_words/stride_words`). So a capital
|
||||
ship seen in a normal instrumented run can be baked without a dedicated F10 pass.
|
||||
|
||||
`examples/correlate_capture.rs` is the CLI wrapper:
|
||||
```
|
||||
SYLPHEED_ISO=… cargo run --release --example correlate_capture -- \
|
||||
@@ -109,6 +115,28 @@ not the 1894-tall tower the static Y put out.
|
||||
**Missing:** `brg_01` (bridge, vcount 202) was **culled/occluded** at that camera
|
||||
angle (0 draws) — needs a second capture framing the superstructure.
|
||||
|
||||
## What the static assembler gets wrong (measured, `e106` in Stage_S01)
|
||||
|
||||
Decoding the real container (`examples/ship_dump.rs`) shows the static
|
||||
`assemble_ship` is **incomplete** — the capture is required to fix all of:
|
||||
|
||||
- **`bdy_01` / `bdy_02` overlap**: both get the *same* composite transform
|
||||
(T = (−116, 0, 857)); the real ship is a **port/starboard pair** at X = ∓264
|
||||
(the mirror is applied at runtime, like the DeltaSaber fins in `saber_measured`).
|
||||
- **`eng_02` and `wep_02_01` are never placed**: they aren't `rou_` hull nodes and
|
||||
aren't in the external category list, so they drop out entirely.
|
||||
- Only `brg_01` + `eng_01` get the approximate `GN_*`-frame treatment.
|
||||
|
||||
So even the *hull* tier is not fully correct, and no static signal supplies the
|
||||
missing offsets (verified: the part vertex buffers are pure local coords). The
|
||||
capture-driven table is the only path to correctness — there is nothing more to
|
||||
squeeze statically.
|
||||
|
||||
> Offline status: the draw logs on this box are the **player fighter**, not a
|
||||
> capital ship, so no capital-ship table can be baked here yet. Capture `e106`
|
||||
> (Stage_S01, side-on) on the emulator box — F10 **or** just save
|
||||
> `mission_draws.log` with the ship on screen — then `correlate_capture … --emit`.
|
||||
|
||||
## Next steps
|
||||
|
||||
1. ~~**Bake:** promote the correlator to a module + checked-in table + viewer
|
||||
|
||||
Reference in New Issue
Block a user