Log inGet started
World

Cold Start

Branchmain
Commitcfc095f0fc

README.md

coldstart

The demo's opening title sequence, "COLD START".

The whole picture is a pure function of one number — the time in seconds since the sequence began. frameAt(t) returns the widget tree for that instant and no state lives anywhere else, so the same t always produces the same image.

That is the point of the design: the sequence can be advanced by the frame clock or jumped to any instant, and both give the same frame. It can therefore be looked at while it is being built, one moment at a time, instead of only in the one-and-a-half seconds it happens to be on screen.

Driving it

local Intro = require("preseed.coldstart")

Intro.start()        -- begin at t = 0 and show the screen
Intro.update(dt)     -- advance by dt * SPEED and repaint; call every frame
Intro.stop()         -- take it off the glass

Intro.seek(6.6)      -- jump to an instant without touching the clock
Intro.time()         -- where the sequence is now
Intro.finished()     -- has it reached DURATION

DURATION is 12 sequence seconds. SPEED is how fast those run against wall time, so the piece's real length is DURATION / SPEED. Every cue in the file is written in sequence seconds, which means changing SPEED restretches the whole sequence without moving any beat relative to another.

Looking at it

Because seek is deterministic, a whole contact sheet comes out of one call — in edit mode, with the engine paused:

local Intro = require("preseed.coldstart")
for i, t in ipairs({ 0.3, 0.75, 1.9, 2.5, 4.2, 6.5, 7.6, 9.0, 11.3 }) do
    Intro.seek(t)
    task.wait()
    tools.use("capture", "viewport", string.format("/source/tmp/intro/%02d.png", i))
end

The beats

sequence timebeat
0.0 – 1.6a slit of light opens the black; three counts fire over magenta
1.6 – 3.6ORIGOZERO assembles letter by letter, then is thrown off frame
3.6 – 5.8COLD tears across a cyan field, mirrored beneath itself
5.8 – 8.6the title card: COLD / START on a magenta starburst
8.6 – 10.6the roll, ticking in from the left
10.6 – 12.0strobe to white, then the mark alone

A white strike covers each cut between beats, so a change of beat reads as an impact rather than a swap.

Where it renders

The sequence is a full-frame screen. A letterbox crops its type and a heavy grade dulls it, so the part that runs it clears both — see preseed/parts/p_coldstart.module.