re(ui): size the rest() guess disc-wide, and refute my own proposed fix
Follows up the defect found last iteration: rest()'s dwell fallback is
guessing whenever it runs. Two things were open -- how big it is, and
whether "rest = the last keyframe" is the fix. Both are now answered, and
the second is answered no.
plateau_census.py walks the placement regions directly instead of going
through `screen info --geometry`, which decodes every texture and cannot
do a disc-wide pass in reasonable time. Its control reproduces GP_TITLE
build 7's three fallback elements and names ptlogo_eff3.t32 among them
before counting anything.
elements with a keyframe group 15 493
no plateau -> rest pose is guessed 3 807 (24.57 %)
... current rule returns invisible 1 711 (44.9 %)
... current rule returns scale=0 195 ( 5.1 %)
the two candidate rules agree 1 911 (50.2 %)
195 elements get a rest pose with scale 0%, which is not a pose. And
disc-wide the choice of rule is not cosmetic: the candidates agree half
the time.
But the port's exposure is one element. Across main menu, EXTRAS, title
and the developer splash, 14 elements are plateau-less and the two rules
agree on 13. The single disagreement is palogo_anima_eff.t32.
And "last keyframe" loses there, on a control that needed no new capture:
the splash carries three sibling glows with identical structure and
identical times --
palogo_gamearts_eff 15:a=0 30:a=255 45:a=255 -:a=0 plateau -> visible
palogo_seta_eff 15:a=0 30:a=255 45:a=255 -:a=0 plateau -> visible
palogo_anima_eff 15:a=0 30:a=255 45:a=212 -:a=0 no plateau
-- differing in one byte. "Last keyframe" makes anima alone invisible
while its two siblings stay lit. The capture agrees weakly: box-mean
ratios capture/render are gamearts 0.717, seta 0.723, anima 0.772, and a
glow we drew that the game does not would put anima below its siblings,
not above.
So the defect is measured and the fix is still undecided. Nothing in the
decoder changed.
This commit is contained in:
@@ -320,3 +320,67 @@ Any element whose keyframes contain **no two adjacent identical poses** has a
|
||||
built from it. That is a property a consumer can test for itself in one pass over
|
||||
the keyframes, and it is worth flagging in an export rather than silently
|
||||
inheriting our guess.
|
||||
|
||||
## The size of the defect, and why it does not block the menu port
|
||||
|
||||
[`tools/re-capture/plateau_census.py`](../../../tools/re-capture/plateau_census.py)
|
||||
walks every `GP_*.pak` placement region directly (the CLI route decodes every
|
||||
texture and is far too slow for a disc-wide pass). Its control reproduces
|
||||
`GP_TITLE` build 7's three fallback elements and names `ptlogo_eff3.t32` among
|
||||
them before it counts anything. Output: [`data/plateau-census.txt`](../data/plateau-census.txt).
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
| elements with a keyframe group, disc-wide | **15 493** |
|
||||
| no plateau → **rest pose is guessed** | **3 807 (24.57 %)** |
|
||||
| of those, current rule returns an **invisible** pose | 1 711 (44.9 %) |
|
||||
| of those, current rule returns a **zero-scale** pose | **195 (5.1 %)** |
|
||||
| the two candidate rules **agree** | 1 911 (50.2 %) |
|
||||
|
||||
A returned pose with `scale = 0 %` is not a pose at all, and 195 elements get
|
||||
one. Disc-wide the choice of rule is not cosmetic: the candidates agree only half
|
||||
the time.
|
||||
|
||||
### ✅ But on the five screens the port needs, the exposure is one element
|
||||
|
||||
| screen | plateau-less | rules differ |
|
||||
|---|---|---|
|
||||
| main menu (entry 5) | 5 / 16 | 0 |
|
||||
| `EXTRAS` (entry 6) | 5 / 18 | 0 |
|
||||
| title (entry 4) | 2 / 24 | 0 |
|
||||
| developer splash (entry 11) | 2 / 7 | **1** |
|
||||
|
||||
Thirteen of the fourteen affected elements get the same answer either way. The
|
||||
one disagreement is `palogo_anima_eff.t32`.
|
||||
|
||||
### 🔴 And "rest = last keyframe" is refuted on it
|
||||
|
||||
That was the alternative I named last iteration. The developer splash carries
|
||||
**three sibling glows**, identical in structure and in every time:
|
||||
|
||||
```
|
||||
palogo_gamearts_eff 15:a=0 30:a=255 45:a=255 -:a=0 → plateau → visible
|
||||
palogo_seta_eff 15:a=0 30:a=255 45:a=255 -:a=0 → plateau → visible
|
||||
palogo_anima_eff 15:a=0 30:a=255 45:a=212 -:a=0 → no plateau
|
||||
```
|
||||
|
||||
They differ in **one byte** — `212` where the others have `255`. Under "last
|
||||
keyframe", `anima_eff` alone goes invisible while its two siblings stay lit. A
|
||||
rule that makes one of three parallel elements behave differently because of a
|
||||
single alpha count is producing an artefact, not a decode.
|
||||
|
||||
The capture agrees weakly. Comparing box means in
|
||||
[`live-splash-developer.png`](../captures/title-builds/live-splash-developer.png)
|
||||
against our render (the screenshot is 1279×675, top-aligned, so only ratios are
|
||||
comparable): gamearts **0.717**, seta **0.723**, anima **0.772**. If our render
|
||||
were adding a glow the game does not draw, anima's ratio would sit *below* its
|
||||
siblings'. It sits above.
|
||||
|
||||
### 🟡 Where this leaves it
|
||||
|
||||
The **defect** is established and measured: `rest()` guesses for 24.57 % of
|
||||
elements disc-wide and returns a degenerate zero-scale pose for 195 of them.
|
||||
The **fix** is not decided — "last keyframe" is refuted, and the current rule
|
||||
survives on the only captured element that discriminates. ⚠️ For the menu port
|
||||
specifically this is **not a blocker**: one element on one screen, and our
|
||||
current answer for it is the defensible one.
|
||||
|
||||
Reference in New Issue
Block a user