port: the 11.5 px was the fit's resolution -- and the lesson inverts
The Decoder closed it by ADDING OBSERVABLES, not by tuning. The vertex buffer carries positions and colours at the same instant, so all four quantities must agree on one t: quad A x solves to 357.88 and quad B x to 357.58, both +/-0.12 units, against 355.75 +/-1.54 and 354.09 +/-1.89 from the alphas. Alpha moves only 0.27-0.33 levels per unit, so one byte of quantisation is worth 1.5-1.9 units -- 6-8 px of sweep at 4 px/unit. That is the whole of the 11.5 px. At t=357.7 the centres land within 0.70 px and both alphas inside one level. THE LESSON IS THE EARLIER ONE INVERTED AND IT IS THE HALF WORTH KEEPING. Checking a wrong rule against alpha made it look confirmed; here the same insensitivity MANUFACTURED a residual that did not exist. An insensitive quantity does not merely fail to falsify -- it invents error. Solve on the fastest-moving field, check the slow one, never the reverse. I was already looking for a pivot rule to explain 11.5 px when they wrote; there was nothing to find. REFUTATION ATTEMPT, survived with a nuance: they state the leaf pivot is (200,90) on a 399x180 sprite, "the pivot is the centre, so rotation displaces it by nothing". Checked against my export -- pivot [200,90], sprite 399x180, true centre 199.5,90. It survives, but the sprite is ODD-WIDTH so the pivot is the centre to within half a pixel rather than exactly. No consequence against their 0.70 px agreement; worth stating because "displaces it by nothing" is the kind of sentence that later gets leaned on for a sub-pixel claim. verify-capture now poses the title at t=357.7 rather than 355: RMSE 21.07 -> 20.92, differing 1.82% -> 1.81%. Marginal, and it is the right pose for a stated reason rather than a better number. AND ptlogo_eff2 IS WITHHELD FOR A BETTER REASON THAN MINE. I had it on caution about untested generalisation; the Decoder points out it is on title_jp and MISSION section 7 scopes out "localisation beyond English", so it is not a question this port has to answer and the parked Japanese capture does not need reviving for it. authored/rendering.json now gives scope first and undecidability second. Widening scope to close a residual would have been the wrong trade. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF
This commit is contained in:
@@ -52,18 +52,29 @@ CAPS=docs/re/captures/title-builds
|
||||
MAP=(
|
||||
"main_menu:$CAPS/live-main-menu.png:menu"
|
||||
"extras:$CAPS/live-extras.png:menu"
|
||||
# ⚠️ THE TITLE IS POSED AT t=355 UNITS, NOT AT ITS SETTLE, and the time is
|
||||
# ⚠️ THE TITLE IS POSED AT t=357.7 UNITS, NOT AT ITS SETTLE, and the time is
|
||||
# MEASURED rather than chosen. The two `ptloop` sweeps are a continuous
|
||||
# animation whose leaf group ends at t=600 with the quads parked off-screen at
|
||||
# x=1521, so posing at the settle compares a still frame against a capture
|
||||
# taken mid-sweep and simply omits them. The Decoder fitted t=355 from the
|
||||
# game's own composed alpha -- per-draw vertex colours 195 and 182 against the
|
||||
# two leaf ramps -- and the same t then predicted the quad centres to ~11 px.
|
||||
# taken mid-sweep and simply omits them.
|
||||
#
|
||||
# t=357.7 is the Decoder's REFINED fit, and the refinement is worth knowing.
|
||||
# Its first value, 355, came from the two per-draw alpha bytes alone and left
|
||||
# an 11.5 px residual that looked like a pivot problem. Solving the same
|
||||
# instant on the vertex POSITIONS instead gives t=357.88 and 357.58 to
|
||||
# +/-0.12 units, against +/-1.54 and +/-1.89 from the alphas -- alpha moves
|
||||
# only 0.27-0.33 levels per unit, so one byte of quantisation is worth 6-8 px
|
||||
# of sweep. At 357.7 the centres land within 0.70 px and both alphas inside one
|
||||
# level. THE 11.5 px WAS THE FIT'S RESOLUTION, NOT GEOMETRY.
|
||||
#
|
||||
# ⚠️ And there is no pivot correction: the leaf pivot is (200, 90) on a 399x180
|
||||
# sprite, so it is the centre to within half a pixel -- checked here against
|
||||
# the export rather than taken.
|
||||
#
|
||||
# ⚠️ It is NOT the time that minimises the difference: t=390 measures 1.65 %
|
||||
# against 1.82 % here. Picking that one would be fitting the pose to the
|
||||
# score, which is the thing this harness exists not to do.
|
||||
"title:$CAPS/live-title-build4-no-plate.png:t355"
|
||||
"title:$CAPS/live-title-build4-no-plate.png:t357"
|
||||
"publisher_logo:$CAPS/live-splash-publisher.png:screen"
|
||||
"developer_logos:$CAPS/live-splash-developer.png:screen"
|
||||
)
|
||||
@@ -83,8 +94,8 @@ for row in "${MAP[@]}"; do
|
||||
godot --path port --resolution 1280x720 -- "--menu=$name" --script=wait \
|
||||
"--shots=$OUT/$name" >"$OUT/$name.log" 2>&1 || true
|
||||
[ -f "$OUT/${name}_00_start.png" ] && cp "$OUT/${name}_00_start.png" "$OUT/$name.render.png"
|
||||
elif [ "$pose" = t355 ]; then
|
||||
godot --path port --resolution 1280x720 -- "--screen=$name" --time=5.9167 \
|
||||
elif [ "$pose" = t357 ]; then
|
||||
godot --path port --resolution 1280x720 -- "--screen=$name" --time=5.9617 \
|
||||
"--capture=$OUT/$name.render.png" >"$OUT/$name.log" 2>&1 || true
|
||||
else
|
||||
godot --path port --resolution 1280x720 -- "--screen=$name" --time=99 \
|
||||
@@ -98,7 +109,7 @@ for row in "${MAP[@]}"; do
|
||||
note=""
|
||||
case "$name" in
|
||||
main_menu|extras) note="rendered with authored initial focus" ;;
|
||||
title) note="posed at t=355, the Decoder's fitted sweep time" ;;
|
||||
title) note="posed at t=357.7, the Decoder's refined sweep fit" ;;
|
||||
esac
|
||||
# Where the difference lives. This comes FIRST because it is what the gamma
|
||||
# sweep has to be protected from.
|
||||
|
||||
Reference in New Issue
Block a user