hull
The shape of the ship, and the plating on it.
Hull.point(side, s, z) is the whole hull as one function: s runs 0 at the
keel to 1 at the sheer, z runs from the stem into the break at 190, and side
is -1 for port and +1 for starboard. Everything else in the slice — the hawse
pipe, the rail, the porthole rows, the rusticles' hanging points — asks this
function where the surface is, so nothing is placed by a number typed twice.
local Hull = require("deadlight.wreck.hull")
Hull.sheerY(z) -- the weather deck's height along the ship
Hull.stemZ(y) -- the raked leading edge at that height
Hull.halfBeam(z, y) -- half the breadth at a station and a height
Hull.deckEdge(side, z) -- where the rail and the bollards stand
Hull.onShell(side, z, y, out) -- a fitting `out` metres clear of the plating
The builders append into a deadlight.wreck.geom mesh: buildShell,
buildBottom, buildStem, buildDeck, buildBulwark, buildBreak.
The plating is built strake by strake with alternating in-and-out laps.
Every other strake stands 6 cm proud of its neighbours, exactly as a riveted
hull is built, and between two strakes there is a real step face — so a lamp
raking along the side catches a hard edge rather than a texture pretending to be
one. UVs come out in plate units (u = strake index, v = z / PLATE_LEN), which
is what lands the rivet rows on the real seams.
The aft end is a tear, not a cut. Each strake ends at its own z and its lip is pulled inboard, so the break reads as peeled steel — the last thing the lamps come off in shot 14.
The seafloor is y = 0 and KEEL_Y is -8.6, so eight and a half metres of the
hull are under the silt, exactly as Film.WORLD states.
Scoped to this part · feeds back into the world's score.