updraftFire
The inferno: what burns, what it makes of the air, and what leaves the building.
film.updraftFire — Updraft slice 3, FIRE & AIR
The inferno: what burns, what it makes of the air, and what leaves the building.
Registered with film.updraftFilm under the name fire, so it runs from the
film's own clock at a fixed 1/24 s per rendered frame. Twenty-one GPU emitters
and one entity; nothing auto-updates, so two runs of the film produce the same
fire frame for frame.
What it owns
| the first cause | the Gallery 3 oil lamp guttering, flaring and cracking, and the burning oil running off the desk onto the boards |
| the shelf run | a flame FRONT that walks the fore-edges at about two metres a second, with what it has already left burning behind it |
| the spiral | the front as a rising helical band, one turn per gallery, with every gallery below it alight at every angle |
| the air | the ceiling jets rolling under the gallery boards, the smoke layer whose underside is s.smokeY, the indraft at the four doors and the chimney column up the axis |
| the events | the Gallery 12 collapse and its spark trail, the brass rail running at Gallery 6, and the dome going out ballistically |
| the sky | the plume and its hot core, the exterior ember field, and the archive airborne |
| the pages | individually lit sheets rising in the draught — the film's hero effect |
The burning pages
A page is a mesh particle: one instanced quad, placed by
shaders.fire.updraftPage (a compute shader that replaces the built-in
integrator with the tower's own weather) and shaded by
materials.fire.updraftPage.
The compute pass gives a page a chimney draught that is strongest on the axis
and dies off across the shaft, a swirl about that axis, an inward entrainment,
and — above the dome — a wind instead. It tumbles the sheet end over end about
two axes derived from the particle's own seed, and it colours the page by its
height, out of Film.look: deep red at the slate, white-yellow at the dome.
So a shaft full of them carries the film's vertical gradient rather than
re-stating it.
The material burns a ragged hole inward from a corner the page's seed chooses,
discarding what the fire has eaten so the sheet ends up full of holes, and
lights the paper by its own hem — which in Movement IV is the only light there
is. The shot-15 folio is an ENTITY wearing that same material, fed the same
four numbers a particle carries through renderer.instanceData lanes.
The curves
Film.heat, Film.emptied and Film.smokeY say how far the inferno has gone.
What is this slice's own is WHERE it has got to:
frontU(t)— the front's position up the spiral, 0 at Gallery 3's shelf and 1 at Gallery 22's, keyed so it crosses each shot's framing while that shot is on screen.shelfDeg(t)— the angle the front stands at on Gallery 3's shelf run.fallY(t)— the Gallery 12 mass, once it lets go.
Fire stands at FIRE_R, half a metre proud of the fore-edges: spawned at the
shelf face itself it is inside the volumes and the shot reads as an unlit shelf.
Reading it back
local Fire = require("film.updraftFire")
Fire.state() -- the front's height and angle, and what is alive
Fire.advance(35, 7) -- drive the fire alone to a film time, for a still
Fire.teardown() -- give every emitter's GPU buffers back
advance simulates warm seconds of film ahead of the time asked for, because
a fire with no past is a fire with nothing in the air. It leaves the film clock
alone.
Every emitter draws on the render layer fire as well as on default, so
capture { renderLayers = "fire" } is the frame with nothing in it but what
burns.
Scoped to this part · feeds back into the world's score.