formats: apply the keyframe fade alpha, and fix the resting rule it exposed
blit modulated by tint only, which is 0xffffffff on essentially every keyframe, so the fade word was decoded, stored and then discarded. Applying it as an ARGB modulate takes the title composite's edge correlation against the framebuffer capture of the running game from 0.4597 to 0.9538, both at zero shift. The white wordmark with its blue outline, the trademark, the copyright and the orange exploding planet all appear -- the planet because a full-screen blue effect that rests at alpha 0 had been painting over it at full opacity. ARGB is measured: across a fade-in the high byte walks 0x00 -> 0x80 -> 0xc0 -> 0xe0 -> 0xff while the low three stay ffffff, and the low 24 bits are 0xffffff on 5276 of the disc's 5453 resting keyframes. A modulate can only remove pixels, so the risk is a blank screen. Measured: no-op on 4060 of 5200 sprite elements, partial on 453, hides 687 -- transient HUD indicators that should not be lit at rest -- and NO build is left with nothing visible. A disc test asserts that, and that the no-op share stays high, which also guards the resting rule against drifting onto ramp frames. Both changes are in one commit because the second is invisible without the first. Applying fade erased the word PAUSE, which the running-game capture plainly shows: pgptitle.rat has three runs of two identical keyframes -- pre-roll, hold, exit -- and the 'later run wins' tie-break grabbed the exit. A group carries the screen's entry animation AND its exit, so a run ending on the last keyframe is now excluded unless it is the only one. The title correlation is unchanged.
This commit is contained in:
BIN
docs/re/captures/ui-layout/pause-composited-fade-applied.png
Normal file
BIN
docs/re/captures/ui-layout/pause-composited-fade-applied.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 140 KiB |
BIN
docs/re/captures/ui-layout/title-composited-fade-applied.png
Normal file
BIN
docs/re/captures/ui-layout/title-composited-fade-applied.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 702 KiB |
@@ -84,13 +84,65 @@ essentially every keyframe. The wrong keyframes were being chosen and then their
|
||||
one distinguishing field was ignored. That is worth stating as its own finding —
|
||||
see below.
|
||||
|
||||
## The `fade` alpha, applied (same day)
|
||||
|
||||
`blit` modulated by `tint` only — `0xffffffff` on essentially every keyframe — so
|
||||
the `fade` word was decoded, stored, and then thrown away. Applying it as an
|
||||
**ARGB** modulate on top of `tint` is what turns the resting pose from an
|
||||
academic result into a picture:
|
||||
|
||||
| composite | best correlation vs the capture | at shift |
|
||||
|---|---|---|
|
||||
| plateau rest, `fade` applied | **0.9538** | (0, 0) |
|
||||
| plateau rest, `fade` ignored | 0.4597 | (0, 0) |
|
||||
| longest-dwell rest | 0.1511 | (+3, +8) |
|
||||
|
||||
0.95 against a framebuffer capture of the running game.
|
||||
[The composite](../captures/ui-layout/title-composited-fade-applied.png) now has
|
||||
the white wordmark with its blue outline, the ™, the copyright, and the orange
|
||||
exploding planet — the last of which appeared because a full-screen blue effect
|
||||
that rests at alpha 0 had been painting over it at full opacity.
|
||||
|
||||
**ARGB is measured, not assumed.** Across a fade-in the *high* byte walks
|
||||
`0x00 → 0x80 → 0xc0 → 0xe0 → 0xff` while the low three stay `ffffff`, and the low
|
||||
24 bits are `0xffffff` on 5 276 of the disc's 5 453 resting keyframes (with
|
||||
`0x000000` on 165 — the `.prm` blacks — and `0x5dc9ff` on 12).
|
||||
|
||||
Risk checked, because a modulate can only ever remove pixels: it is a **no-op on
|
||||
4 060 of 5 200** sprite elements, partial on 453, and hides 687 — which are
|
||||
transient HUD indicators (`pb_emergency`, `pb_refilling`, `pbcm1_arrow1`) that
|
||||
should not be lit on a resting screen. **No build is left with nothing visible**,
|
||||
and a disc test asserts it.
|
||||
|
||||
### And it caught a bug in the resting rule
|
||||
|
||||
With `fade` applied, the pause menu lost the word **PAUSE**, which the capture of
|
||||
the running game plainly shows
|
||||
([`pause-tutorial-real-vs-rebuilt.png`](../captures/ui-layout/pause-tutorial-real-vs-rebuilt.png)).
|
||||
|
||||
`pgptitle.rat` has **three** runs of two identical keyframes — invisible,
|
||||
visible, invisible:
|
||||
|
||||
```
|
||||
kf0 a=0x00 t=5 kf1 a=0x00 t=13 pre-roll
|
||||
kf2 a=0xff t=23 kf3 a=0xff t=28 the hold
|
||||
kf4 a=0x00 t=30 kf5 a=0x00 t=None the exit
|
||||
```
|
||||
|
||||
A group carries the screen's entry animation **and its exit**. The tie-break
|
||||
"later run wins" grabbed the exit. Fixed: a run ending on the last keyframe is
|
||||
excluded unless it is the only one. The title's correlation is unchanged at
|
||||
0.9538, and [PAUSE is back](../captures/ui-layout/pause-composited-fade-applied.png).
|
||||
|
||||
This is why the two changes landed together: the trailing-run defect is
|
||||
invisible — in the literal sense — until `fade` is applied.
|
||||
|
||||
## What is not settled
|
||||
|
||||
* ❔ **`compose` ignores the keyframe `fade` alpha entirely.** `blit` uses
|
||||
`tint`. Applying `fade` is the obvious next step and is what makes the resting
|
||||
pose visible rather than academic — but it changes every screen and needs its
|
||||
own A/B against the capture. It is also the prerequisite for drawing `.prm`
|
||||
quads, whose entire content is that alpha.
|
||||
* ❔ **Blend mode.** Everything above is straight alpha-over. The near-white
|
||||
flash quads and the coloured ones may well be additive, and nothing has been
|
||||
measured; the title capture cannot separate the two because its resting
|
||||
elements are all `0xffffff`.
|
||||
* 🟡 **The fallback.** Groups with no two adjacent keyframes alike still use
|
||||
longest-dwell. How many there are, and whether the correct answer for them is
|
||||
the *last* keyframe instead, is unmeasured.
|
||||
|
||||
Reference in New Issue
Block a user