diff --git a/docs/port/HANDOFF.md b/docs/port/HANDOFF.md index 910be97a..d5bda1cb 100644 --- a/docs/port/HANDOFF.md +++ b/docs/port/HANDOFF.md @@ -109,6 +109,14 @@ authored version can be deleted. test is to blend bit-`0x02` sprites additively and re-correlate the title against the capture. Note `ptlogo_back2eff` is `0x8830` despite its name, so this is a field and not a naming pattern. ❔ Not diagnosed. + ❔ **Classified: undecodable from the disc, with reach.** Seven candidates + eliminated — pivot (inert at scale 100 *and* no measured displacement), `fade`, + `tint`, texture colour, additive blend via `+0x04` bit `0x02`, and + capture-not-settled (the band is identical from t = 4.0 s to t = 21.5 s). The + residual is stable and modest: band mean **+1.83**, edge-corr **0.70** vs ≈ 0.92 + frame-wide. A next attempt should use a **per-draw GPU capture** of the running + guest, which reads the actual blend state instead of inferring it — not another + field. ✅ And the plate-free capture is sound; use it. 🔴 **Refuted:** it is *not* that our dim covers the whole frame instead of sitting beneath the UI — the logo reads +2.36 against a background of −0.74, so the paint order is being honoured. diff --git a/docs/re/REFUTED.md b/docs/re/REFUTED.md index de58af1a..494cd01f 100644 --- a/docs/re/REFUTED.md +++ b/docs/re/REFUTED.md @@ -35,6 +35,12 @@ neighbourhood, not just the line. ## Screens, classes and RTTI +* "the plate-free title capture (t ≈ 4.0 s) may be too early to be settled" → + **mine, and refuted.** The swoosh band correlates 0.7342 at t = 4.0 s and + 0.7353 at t = 21.5 s — identical to 0.001 over 17.5 s. +* "`T8aD +0x04` bit `0x02` selects an additive blend" → **mine, and refuted.** + Blending those sprites additively worsens every measure against the capture. + [`ui-title-build-map.md`](ui-title-build-map.md) * "the title logo elements' wrong pivots (off by up to 59 px, authored against the other language's sprite) explain the swoosh rendering too thick" → **mine, and refuted.** `blit` sizes from the texture and applies the pivot only as diff --git a/docs/re/ui-title-build-map.md b/docs/re/ui-title-build-map.md index 5345b236..9012ccf9 100644 --- a/docs/re/ui-title-build-map.md +++ b/docs/re/ui-title-build-map.md @@ -532,12 +532,49 @@ additive blending: it is a shape difference in one band, and it is **not diagnosed**. Six candidates eliminated: pivot (twice — inert at scale 100, and no measured displacement), `fade`, `tint`, texture colour, additive blend. -### ⚠️ A caveat on the plate-free capture +### 🔴 The capture IS settled — my own caveat, tested and withdrawn -It was taken at **t ≈ 4.0 s**, about **2.9 s** (≈ 174 keyframe units) after the -screen begins. Several title elements have keyframes running to **t = 600** -(10 s) — the `ptloop` sweeps among them. "Settled" was judged from mean -luminance, which cannot see a thin sprite still in motion. The capture is settled -for the bulk of the screen; it is **not proven settled for every element**, and -that is a live alternative explanation for a structural difference in exactly the -band those sweeps cross. +The previous version of this section worried that the plate-free capture, at +t ≈ 4.0 s, might be too early: elements have keyframes to t = 600 (10 s), and +"settled" had been judged from mean luminance, which cannot see a thin sprite +still moving. + +The plate sits at y ≈ 550–600, **disjoint** from the swoosh band at y 112–225, so +a *late* capture works even with the plate present. Correlating the render's band +against the same band at several ages of the screen: + +| capture | band edge-corr | band mean | +|---|---|---| +| t = 4.0 s (plate-free) | **0.7342** | 126.63 | +| t = 6.0 s | 0.7351 | 126.97 | +| t = 12.0 s | 0.7352 | 126.98 | +| t = 18.0 s | 0.7353 | 126.98 | +| t = 21.5 s | 0.7353 | 126.98 | + +Identical to within 0.001 over 17.5 s. **The band is settled by t = 4.0 s**, the +capture handed to the port agent is sound, and the caveat is withdrawn. It also +corroborates that the groups **hold**: nothing crosses that band in 22 s. + +## ❔ The swoosh: undecodable from the disc, with reach + +Seven candidates eliminated, none confirmed: + +| candidate | verdict | +|---|---| +| element **pivot** (off by 59 px, authored for the other language) | inert — `blit` sizes from the texture and applies the pivot only when scale ≠ 100; all seven elements are scale `(100,100)` | +| **displacement** | none — shifting ±80 × ±8 px peaks sharply at (0,0), 0.734 → 0.22 at ±24 px | +| **`fade`** | `0x??ffffff` on every keyframe: white RGB, alpha only | +| **`tint`** | `0xffffffff` throughout | +| **texture colour** | blue-leaning (175,174,198); the glow warm — neither pink | +| **additive blend** via `T8aD +0x04` bit `0x02` | refuted: every measure worsens | +| **capture not settled** | refuted above | + +The residual is stable and modest: band mean **+1.83**, band edge-correlation +**0.6971–0.735** against ≈ 0.92 frame-wide. Real, persistent, and **not located in +any field this project can read from the disc**. + +**Where a next attempt should start, and it is not another field.** A per-draw GPU +capture of the running guest (`--log_ui_draws`, the route that produced +[`ui-title-paint-order-capture.md`](ui-title-paint-order-capture.md)) reads the +*actual* blend state, vertex colours and draw order the game submits for that +band, instead of inferring them from the file. That is where static RE stops here.