ship: bake pipeline — correlator as a tested module + viewer prefers captured table
Promote the F10 ship-capture correlator from an example into a reusable, unit- tested library module (ship_capture): parse_capture (log -> per-draw rigid WorldView from the c0..c2 WVP constants), correlate (match parts to draws by vertex count, express each in the reference part's frame), and a checked-in placement-table format (serialize_table/parse_table, embedded via embedded_placement from data/ship_placements.txt). build_ship_model now prefers a ship's captured placement over the static assemble_ship when a table entry exists (empty table -> unchanged fallback). correlate_capture example refactored onto the module + gains --emit to print a table block. Doc updated: bake plumbing done; remaining is running real F10 captures to populate the table (needs the emulator). 5 new ship_capture tests (parse/normalize/correlate/table round-trip); 76 formats-lib tests + viewer build green. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -1,7 +1,9 @@
|
||||
# Capital-ship part placement — runtime capture (ground truth)
|
||||
|
||||
**Status:** pipeline working end-to-end for one ship (`e106` ADAN Destroyer);
|
||||
correlator recovers exact ship-relative transforms. Not yet baked into the viewer.
|
||||
correlator recovers exact ship-relative transforms. **Bake plumbing landed** — the
|
||||
correlator is now a tested library module and the viewer prefers a captured table;
|
||||
only real capture data still needs baking in (needs the emulator + F10).
|
||||
|
||||
## Problem
|
||||
|
||||
@@ -56,16 +58,30 @@ Branch **`capture-ship-placement`** in the `xenia-canary-native` worktree (off t
|
||||
- Run: `run-canary-native.sh` (HW Vulkan, interactive). Play into the mission,
|
||||
frame the ship side-on, press F10.
|
||||
|
||||
## Correlator
|
||||
## Correlator (now a library module)
|
||||
|
||||
`sylpheed-formats/examples/correlate_capture.rs`:
|
||||
The correlation math lives in **`sylpheed-formats::ship_capture`** (unit-tested with
|
||||
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.
|
||||
|
||||
`examples/correlate_capture.rs` is the CLI wrapper:
|
||||
```
|
||||
SYLPHEED_ISO=… cargo run --release --example correlate_capture -- \
|
||||
<capture.log> <Stage_SNN> <ship_id> [ref_part_substr]
|
||||
<capture.log> <Stage_SNN> <ship_id> [ref_part_substr] [--emit]
|
||||
```
|
||||
Parses the log, decodes the ship's base parts, matches each part to a draw by
|
||||
**vertex count** (unique per part), recovers WorldView from `c0..c2`, and prints
|
||||
each part's ship-relative transform (reference-part frame) + assembled extent.
|
||||
Decodes the ship's base parts (for their vertex counts = the match key), correlates,
|
||||
prints each part's ship-relative transform, and with `--emit` prints the `ship …`
|
||||
block to paste into the placement table.
|
||||
|
||||
## Baked table + viewer preference
|
||||
|
||||
`crates/sylpheed-formats/data/ship_placements.txt` is the checked-in placement
|
||||
table (embedded via `ship_capture::embedded_placement`). The viewer's
|
||||
`build_ship_model` uses a ship's captured entry when present, else falls back to
|
||||
the static `assemble_ship` (`external` toggle). **The table is currently empty** —
|
||||
a real F10 capture log is needed to bake in `e106` (and others); paste the
|
||||
`--emit` block into that file and rebuild.
|
||||
|
||||
## Validated result — `e106` ADAN Destroyer (Mission 1 / Stage_S01, side view)
|
||||
|
||||
@@ -95,11 +111,13 @@ angle (0 draws) — needs a second capture framing the superstructure.
|
||||
|
||||
## Next steps
|
||||
|
||||
1. **Bridge:** re-capture with the bridge visible → fills `brg_01`.
|
||||
2. **Bake:** promote the correlator to a module; emit a per-ship placement table
|
||||
(`ship_id → [(part, R, T)]`) as a checked-in data file; have the viewer's
|
||||
`build_ship_model` prefer the captured table over `assemble_ship` when present.
|
||||
3. **Other ships:** same capture for the cruiser (`e105`, Stage_S02), ACROPOLIS
|
||||
(`f101`), TCAF cruiser/destroyer (`f105`/`f106`). One side-on F10 each.
|
||||
1. ~~**Bake:** promote the correlator to a module + checked-in table + viewer
|
||||
preference.~~ **DONE** (`ship_capture` module, `data/ship_placements.txt`,
|
||||
`build_ship_model` prefers it). Remaining: run the captures below and paste the
|
||||
`--emit` blocks in — needs the emulator (F10), can't be done offline.
|
||||
2. **e106 + bridge:** re-capture `e106` (Stage_S01) framing the superstructure so
|
||||
`brg_01` (culled last time) is included, then `--emit` → bake.
|
||||
3. **Other ships:** one side-on F10 capture each for the cruiser (`e105`,
|
||||
Stage_S02), ACROPOLIS (`f101`), TCAF cruiser/destroyer (`f105`/`f106`).
|
||||
4. **Turrets:** the shared `e3NN`/`e4NN` gun models appear as their own draws in the
|
||||
capture too — correlate them to place turrets (static never resolved these).
|
||||
|
||||
Reference in New Issue
Block a user