You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The timeline could say a shader ran between two frames. It could not say
what in the scene asked for it, so a row named `Scale` was talking about
the renderer while the person was looking at `scaleTo(0.5, duration=1.2)`.
Every `apply()` now leaves a statement behind — file, line, the library
function the person actually called, and the frames each shader key was
written over. The serialiser hands each run to the statement that covers
most of it, and between statements that cover it equally, to the one that
touched the fewest kinds: a group re-emits position, rotation and scale on
every pass, so `scaleTo` is a better answer for a Scale run than `rotateBy`.
Runs from one statement become one row, and that row is the SHORTEST of
them rather than their union. A group's `scaleTo` writes scale for its own
second and a half and position for as long as anything in the group moves;
the union said the call lasted as long as the group did, so shortening it
left the bar exactly where it was.
`removeCallSpan` is the other half of writing: the span that takes a call
OUT. A link in a chain loses its link, a statement of its own takes its
line with it, and a call nested in something else — the `Square(...)` that
made the element — is refused rather than guessed at.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
0 commit comments