A composition lost the first frames of a video item. Its clock ran
while the player was still loading, in the tab and in the game. The
game only waited for videos once, when it started. A composition that
a behavior starts later spawned its items after that wait.
- The view now records which video sprites it left out for lack of a
first picture, one entry per object.
- The composition tab holds its playhead while the preview misses a
video, for at most VIDEO_WAIT_MS (3 s) like the game.
- CompositionSystem holds a composition's clock while one of its live
items misses its video. The rest of the game keeps running.
- The editor play and the published game pass their view to the run
as RunServices.pictures.
- VIDEO_WAIT_MS moves to core/model/video.ts, because the runtime
does not import from viewport/.
- Videos loaded ahead for coming items do not hold the clock.
Items can now be copied and pasted inside the composition tab.
- Ctrl+C keeps the timing of the copied items next to the objects.
- Ctrl+V pastes objects and items in one undo step. The earliest item
lands at the frame under the pointer, on the track there.
- Without the pointer over the tracks it lands at the playhead, on the
selected track or on the top track of the selected items.
- Several items keep their distances and tracks to each other.
- The same copy pastes into a scene as plain objects. Objects copied
from a scene do not paste into a composition, they have no timing.
Tests:
- Unit composition-edit, clipboard, composition-play: 3 new for
pasting, 1 new for the clock waiting in the game
- e2e 69i (play from the end waits for the video), 69j (paste under
the pointer and at the playhead), 68d (a composition started from
On start waits for its video)
- each new check is red without its fix
- README: 2036 editor checks
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A composition can now sit in a scene like a container and play there.
Its items become real objects while they run, so behaviors, colliders
and events work on them as on any other object.
- A composition is placeable with its own symbol, transform and render
layer. The scene view shows its picture at frame 0. A click on that
picture selects the placement, not a single item.
- CompositionSystem spawns each item as an object under the placement
when it begins, with the id <placement>~<item>. On start and the
other events run. The object is destroyed when the item ends.
- The top track lies in front no matter which item started first.
World.arrange() orders the entity list and the scene objects.
- Clips and driven videos follow the same rules as compositionAt().
Loop, restart, stop and the game pause work.
- New nodes: Play composition (with restart), Stop composition and the
event On composition finished. They were planned for step 4 but come
now, because without autoplay nothing could play otherwise.
- The editor run ignores Play composition and says so in the log. It
writes into the saved project, and the items would stay behind.
- contentId() moved to instance.ts. The animation system uses it for
nested ids too.
- Compositions get no "Sort with parent" for now.
Tests: the gate passed with 301 files and 4643 tests, 18 more than
step 1. 13 of them are in tests/core/composition-play.test.ts. The
first gate run failed in event-order.test.ts, which counts the event
nodes and now finds 19. Five counter-checks each turned exactly their
test red. Two order tests stayed green without the fix at first and
were rebuilt. e2e 68 is new and passed with 5 own checks. Its
counter-check without arrange() failed as expected.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>