port: the title's sweeps loop, the black hold is 9 units, and one claim refuted
THREE THINGS FROM THE DECODER, one of which I am not taking. REFUTED: "the developer splash is one composited quad, the bounding box of the three logos". The observed quad is 525x259 at (378,155). The three logos' bounding box is 500x421 at (390,164) -- a 259-tall quad CANNOT contain them, and palogo_anima alone starts at y=449, thirty-five pixels below that quad's bottom edge. The observed quad matches the union of gamearts_eff and seta_eff, 521x261 at (379,154), to about four pixels in every dimension -- and both of those are TRANSIENTS my own census flagged, dark by t=45, so a frame containing that quad is a build-in frame rather than the settled screen. I cannot see their draw stream, so I sent the arithmetic rather than a verdict, and the port keeps drawing three: I will not stop drawing an element on a claim whose stated identification excludes that element from its own bounding box. THE BLACK HOLD IS 9 UNITS, NOT 12. I authored 12 from Q7's luminance plateau of 0.17-0.23 s, supported by the menus' transition quad. The Decoder counted SUBMITTED QUADS instead -- luminance cannot separate the outgoing fade's tail from true black. Four frames with no sprite quad at all, at 2.284 units/frame derived from the disc as its own clock, gives 9.1 units = 0.152 s (6.9-11.4). That overlaps the luminance figure only at the top, and the true black is SHORTER still since both boundary frames carry picture. My 12 was supported by analogy -- a different screen's quad on a different path -- and a number that fits by analogy loses to one measured in place. verify-dwell's bound moved with it; both screens still agree. THE TITLE'S SWEEPS LOOP. The oracle shows the quad oscillating over its whole x range and resetting hard, one reset in the first title dwell and two in the second. The loop-length field could NOT have settled it, correcting a hope I had stated: both records declare exactly their last keyframe time, slack zero, and "loops at 600" and "runs once for 600 and stops" write the identical header. Verified on the two sweeps' LCM, since their periods differ: 600 and 720 realign at 3600 units, mean diff 0, against 0.438 at half that. Scoped to the title. The menus declare the same lengths but the oracle measurement is of the title, and my own weak evidence points the other way there -- best match with the sweeps off-screen, three times worse mid-screen, against a 73% on-screen duty cycle if they looped. Two weak signals in opposite directions is a reason to scope, not to pick. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF
This commit is contained in:
@@ -205,6 +205,7 @@ func _ready() -> void:
|
||||
# Which decoded rules apply where. See `authored/rendering.json`.
|
||||
var rendering: Variant = export_tree.authored("rendering.json")
|
||||
_draw_leaf_for = [] if rendering == null else rendering.get("draw_leaf_for", [])
|
||||
_loop_leaf_screens = [] if rendering == null else rendering.get("loop_leaf_on_screens", [])
|
||||
# `--no-hold` plays a screen's groups PAST their rest instead of clamping each
|
||||
# element at its own `rest.t`. A diagnostic, not a mode: `rest.t` is the last
|
||||
# HOLD keyframe before the exit, not the settled state, and the only way to
|
||||
@@ -221,6 +222,7 @@ func _ready() -> void:
|
||||
|
||||
view.looping_focus = _looping_for(name)
|
||||
view.draw_leaf_for = _draw_leaf_for
|
||||
view.loop_leaf = _loop_leaf_screens.has(name)
|
||||
view.focused_id = _force_focus
|
||||
if not view.load_screen(export_tree, name):
|
||||
push_error(export_tree.error)
|
||||
@@ -287,6 +289,8 @@ var _pending: Variant = null
|
||||
var _looping: Dictionary = {}
|
||||
## `authored/rendering.json` `draw_leaf_for`.
|
||||
var _draw_leaf_for: Array = []
|
||||
## `authored/rendering.json` `loop_leaf_on_screens`.
|
||||
var _loop_leaf_screens: Array = []
|
||||
var _script: PackedStringArray = PackedStringArray()
|
||||
var _shots := ""
|
||||
## `--skip-at=SECONDS`: when to send a synthetic (A) during a movie, or 0.
|
||||
@@ -404,6 +408,7 @@ func _advance() -> void:
|
||||
view.time_units = 0.0
|
||||
view.looping_focus = _looping_for(name)
|
||||
view.draw_leaf_for = _draw_leaf_for
|
||||
view.loop_leaf = _loop_leaf_screens.has(name)
|
||||
if not view.load_screen(view.tree, name):
|
||||
push_error(view.tree.error)
|
||||
get_tree().quit(2)
|
||||
@@ -607,6 +612,7 @@ func _menu_arrive() -> void:
|
||||
view.time_units = 0.0
|
||||
view.looping_focus = _looping_for(name)
|
||||
view.draw_leaf_for = _draw_leaf_for
|
||||
view.loop_leaf = _loop_leaf_screens.has(name)
|
||||
if not view.load_screen(view.tree, name):
|
||||
push_error(view.tree.error)
|
||||
get_tree().quit(2)
|
||||
@@ -922,6 +928,7 @@ func _raise_overlay(name: String) -> void:
|
||||
overlay.exit_ramp_units = view.exit_ramp_units
|
||||
overlay.looping_focus = _looping_for(name)
|
||||
overlay.draw_leaf_for = _draw_leaf_for
|
||||
overlay.loop_leaf = _loop_leaf_screens.has(name)
|
||||
overlay.holding = true
|
||||
overlay.time_units = 0.0
|
||||
if not overlay.load_screen(view.tree, name):
|
||||
|
||||
@@ -90,6 +90,9 @@ var looping_focus: Dictionary = {}
|
||||
## consistency harness compares against a renderer that draws no leaves at all.
|
||||
var draw_leaf_for: Array = []
|
||||
|
||||
## Whether this screen replays a leaf's group. See `authored/rendering.json`.
|
||||
var loop_leaf := false
|
||||
|
||||
## While true the screen holds at `rest` and never plays its exit. The
|
||||
## sequencer clears it to send the screen away.
|
||||
var holding: bool = true
|
||||
@@ -464,9 +467,22 @@ func _draw_leaf(element: Dictionary) -> bool:
|
||||
# `ORACLE-CAPTURES.md` says these two "move continuously". Held at its own
|
||||
# `rest.t` the leaf sits at x=1521 -- entirely off the right edge -- so
|
||||
# `holding` would delete the sweeps rather than settle them.
|
||||
# A leaf replays its own group where the oracle has measured that it does
|
||||
# -- `authored/rendering.json` `loop_leaf_on_screens`. The period is the
|
||||
# leaf's own last keyframe time, which IS its declared length: these
|
||||
# records carry zero slack, which is also why the loop-length field
|
||||
# cannot tell "loops at 600" from "runs once for 600 and stops".
|
||||
var was := holding
|
||||
holding = false
|
||||
var pose := pose_at(fe, time_units)
|
||||
var t := time_units
|
||||
if loop_leaf:
|
||||
var span := 0.0
|
||||
for k: Dictionary in fe.get("keyframes", []):
|
||||
if k.has("t"):
|
||||
span = maxf(span, float(k["t"]))
|
||||
if span > 0.0:
|
||||
t = fposmod(time_units, span)
|
||||
var pose := pose_at(fe, t)
|
||||
holding = was
|
||||
# 🔴 A SCALE-0 LEAF MUST NOT CLAIM THE DRAW. The Decoder hit this in its own
|
||||
# renderer: its leaf branch marked the element drawn unconditionally, but
|
||||
|
||||
Reference in New Issue
Block a user