Skip to content

feat(skills): motion-blur-streak — per-frame-driven form for elements riding a baked track - #3781

Open
jbernard077 wants to merge 1 commit into
heygen-com:mainfrom
jbernard077:feat/motion-blur-streak-driven-tracks
Open

feat(skills): motion-blur-streak — per-frame-driven form for elements riding a baked track#3781
jbernard077 wants to merge 1 commit into
heygen-com:mainfrom
jbernard077:feat/motion-blur-streak-driven-tracks

Conversation

@jbernard077

@jbernard077 jbernard077 commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

rules/motion-blur-streak.md teaches two paths (directional SVG blur, echo/ghost trail) that both
ride a tween window. An element driven per frame from a baked track — a tracked insert or
callout, a title matched to camera shake — has no window to share. This PR adds that form as a
carve-in of the same rule, measured on both render lanes.

What's added

  • Per-Frame-Driven Carve-In section: the envelope becomes a per-frame function of the track's
    own delta inside the frame-lookup driver — speed = hypot(dx, dy), axis from atan2(dy, dx).
    • Path B, driven form (the default for driven subtrees) — text-free silhouette clones of the
      lead (same box, border, radius, fill; no content; aria-hidden + data-layout-allow-overlap)
      trailing at −0.25 / −0.5 of the per-frame delta, opacity min(0.32, 0.05 × speed) above a
      4 px/frame gate and slaved to the lead's own opacity.
    • Path A, driven form — rotate a filter wrapper onto the travel axis, feGaussianBlur "σ 0"
      with σ = min(SIGMA_MAX, 0.5 × speed), counter-rotate the content.
    • Which path for a driven subtree, with the measurement behind it (below).
  • Four Values rows (TRAIL_GATE, TRAIL_K · TRAIL_MAX, TRAIL_OFFSETS, SIGMA_MAX), one
    constraint, an updated description/tags line, the rules-index.md row, and the hook-regenerated
    skills-manifest.json.

Validation

A product-free driven-card composition (one baked, seeded track; a per-frame canvas plate and a
3D-transformed panel loading the rasterizer) rendered as PNG sequences with static-frame dedup off,
hashed frame by frame:

Variant Lane Frames Result
plate + panel only hardware GL 120 × 2 renders 120/120 identical
driven Path A (per-frame feGaussianBlur) hardware GL 120 × 2 120/120 identical
driven Path A software (SwiftShader) 120 × 2 120/120 identical
driven Path B (ghost trail) hardware GL 120 × 2 120/120 identical
driven Path B software 120 × 2 120/120 identical
stress: three filtered cards, σ up to 20, 15 s hardware GL 450 × 3 450/450 identical, both pairs
stress: three filtered cards software 450 × 2 450/450 identical
stress: three ghost-trail cards, 15 s hardware GL / software 450 × 2 each 450/450 identical on both lanes
preview (Path A and Path B side by side on one track) hardware GL / software 180 × 2 each 180/180 identical on both lanes

hyperframes check: 0 errors, 0 warnings on the preview composition (the three-card stress variants
are not check-clean by design — the cards cross the lab's own mode label and GL-renderer HUD
readout, which a real composition would not carry — and are used only for the hash measurement).

The rule therefore ships the driven form as a preference, not a prohibition: Path B is the
default for driven subtrees because it costs no per-frame filter raster and its text-free clones give
the layout and contrast checkers nothing new to flag; Path A
is legitimate when a true blur is the look, with the note that a per-frame-driven filter is the first
thing to re-measure on a new host (an earlier build, 2026-08, saw 1-LSB feGaussianBlur jitter
under per-frame load and shipped Path B for that reason).

Fit against current HEAD

Anchors re-verified against main @ 250afc3: the section sits between the Camera-Travel
Carve-Out and Values; the existing Recipe and Variations are unchanged, Critical Constraints gains
one cross-reference rewording (two carve-outs instead of one) and one new driven-form bullet.

Preview media

(one baked track, two cards: Path A driven blur on the left, Path B text-free ghost trail on the
right; HUD shows per-frame speed and angle; the track stops for the last second so both cards
settle sharp)

pr-c-driven-trail.mp4

🤖 Generated with Claude Code

… riding a baked track

Extends rules/motion-blur-streak.md with a Per-Frame-Driven Carve-In: when an element is driven
from a baked track (tracked insert, shake-matched title) there is no tween window to share, so the
envelope becomes a per-frame function of the track delta — velocity-gated text-free silhouette
ghosts (Path B, the default for driven subtrees) or a rotate/blur/counter-rotate filter sandwich
(Path A), streak axis from atan2 of the delta. Adds the Values rows, the constraint, and updates
the rules-index row.
@jbernard077
jbernard077 force-pushed the feat/motion-blur-streak-driven-tracks branch from fc41a2b to 7589a22 Compare September 8, 2026 21:09
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