Sand
Everything airborne in FURROW, and everything that breaks.
Put this on an entity and the film's whole sand substrate comes alive: eleven plumes smoking off the dune crests, the airborne haze that keeps something moving in every frame, the thread of grain across the macro crust, the dust devil, the tremor, the furrow's bow wave, the hourglass drain, the curtain into the sink, the breach fountain, the maw's fall, the sheet off the animal's flank, the impact ejecta ring, the 200 m dust wall and the settle — plus the mast bursts, the rig's collapse and the crust plates thrown off the rising dome.
It reads furrow.filmClock and never advances it. The clock belongs to
furrow.Director.
Why it is a component and not a script
An emitter created by a one-shot script is registered and never stepped: it
draws nothing and reports success. Every emitter here is created in awake and
stepped from update, which is the long-lived context that makes GPU particles
and effects.play work at all.
update steps by filmClock.STEP, never by dt, so the film is the same 181
seconds at any frame rate.
Fields
| field | what it does |
|---|---|
density | scales every emission rate. 1 is the film as shot; 0 empties the air without removing anything, which is how to see what the substrate costs. |
Authoring
The film's clock only runs in play, so in edit mode the sand would stand still.
Set require("furrow.sand").previewAt = <film second> and the slice runs from
there at previewRate (1 = film speed, 0 holds an instant), in edit or in play,
so any moment can be framed and judged without waiting for the film to reach it.
Set previewAt back to nil and the clock has the film again.
require("furrow.sand").audit(t) answers what is emitting at film second t
without disturbing anything, which is how "is anything airborne in shot 14"
gets an answer that is not a screenshot.
What it holds
28 emitters, about 55 000 particle slots, roughly 86 MB of GPU buffers.
Scoped to this part · feeds back into the world's score.