Skip to content

replay: scrubbing a tape keeps the glass's edge - #670

Merged
foxnne merged 1 commit into
mainfrom
replay/scrub-keeps-glass
Oct 19, 2026
Merged

foxnne merged 1 commit into
mainfrom
replay/scrub-keeps-glass

Conversation

@foxnne

@foxnne foxnne commented Oct 19, 2026 •

Copy link
Copy Markdown
Collaborator

What changes

Scrubbing a tape no longer drops the glass's edge on the transport bar and the corner controls.

Cause. A seek replays to its moment with the app's motion skipped (Stage.fastForward → Demo.fast), and Editor.tick did that by publishing motion as off, the same as a system asking for reduced motion. But glass's edge (its lens, rim light and bend) is an amount the motion level grants (motion.liquid, read by BlurBackdrop.queuePane and DropZones). So every frame drawn during a seek drew all glass flat. It showed most across the tour's Materials chapter, where seeks take several displayed frames to land.

Fix. core.motion.publish takes skipping separately from the system's preference. Animations still land at once, as at off, while liquid stays at the person's level. liquid is published under its own key, so a plugin built before this change still reads the level as before (with the old behaviour) and no shared struct changes shape.

The coordinator also suspected the material. It is already part of the replay state: snapshots and keyframes hold window_material, and the snapshot fingerprint covers it. The test now also checks that.

SDK impact

  • None
  • Core-only or additive: reaches plugins at the next SDK release
  • Fingerprint moved: recorded in sdk/src/version.zig, sdk_version untouched, PR labelled sdk
  • SDK release: bumps sdk_version, lists the sdk PRs since the last sdk-v* tag

Verified

  • macOS: the headless tour test (plays the tour) now scrubs across the Materials chapter both ways with a seek budget of 0, so every displayed frame is one of the seek's. On every one of those frames, motion is skipped and motion.liquid() equals its value in straight playback. Every landing replays with no fingerprint mismatches. With the old publish put back, the test fails (expected 1, found 0). Gates run locally: check-fmt, build, test, test-integration, check-web. I did not take a native screenshot.
  • Windows:
  • Linux: CI
  • Web: check-web only

Follow-ups

  • A plugin built against an older core still computes liquid from the level, so its own glass (pixi's, for one) loses its edge during a seek until it is repinned at the next SDK release.
  • Seek frames now draw glass with its edge, as every other frame does, instead of flat. On native, where silent runs draw everything anyway, that costs the same as a normal frame. I did not measure it separately.

🤖 Generated with Claude Code

A seek replays to its moment with the app's motion skipped (`Stage.fastForward`, `Demo.fast`),
and fizzy skipped it by publishing motion as off, as for a system that asks for reduced
motion. But glass's edge — its lens, rim light and bend — is an amount the motion level grants
(`motion.liquid`), so every frame of a seek drew all glass flat: the transport bar and the
corner controls lost their edge while scrubbing, most visibly across the tour's Materials
chapter, whose seeks run on over several frames.

`motion.publish` now takes `skipping` apart from the system's preference: animations land at
once, as at off, while `liquid` stays the person's. It is published under its own key, so a
plugin built before it reads the level as before.

The material itself was already part of the replay state (snapshots, keyframes and the
fingerprint hold it); the test checks that too.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@foxnne
foxnne force-pushed the replay/scrub-keeps-glass branch from 7a08446 to 9ecc6de Compare October 19, 2026 21:10
@foxnne
foxnne marked this pull request as ready for review October 19, 2026 21:10
@foxnne
foxnne enabled auto-merge October 19, 2026 21:10
@foxnne
foxnne added this pull request to the merge queue Oct 19, 2026
Merged via the queue into main with commit 66b5b51 Oct 19, 2026
11 checks passed
@foxnne
foxnne deleted the replay/scrub-keeps-glass branch October 19, 2026 21:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant