ColumnGeometry
The still's shapes, built as triangles.
Everything the column draws is a mesh this module assembles: surfaces of revolution for the shells, domes and bubble caps, a polar-grid deck that can carry a hole where a riser passes through it, boxes for bars and ribs, tubes and annuli for the rest. Parts accumulate into ONE builder and go to the GPU as a single mesh, which is what keeps eight plates of trays, weirs, skirts, ribs and a hundred and sixty bubble caps at a handful of draws.
local G = require("ColumnGeometry")
local b = G.builder()
G.revolve(b, { { r = 0.3, y = 0 }, { r = 0.7, y = 0.5 }, { r = 0, y = 0.9 } }, 16, x, z, 1, 0.6, false)
G.deck(b, 9.0, y, 0.42, 72, 12, { { x = 6.4, z = 0, r = 1.7 } })
local handle = G.upload(b) -- hand it to a Model component
revolve derives its normals from the profile's own tangent, so a wall, a lip
and a dome all shade correctly from one call; flip turns a shell inside out.
deck omits the quads that fall inside a hole and leaves the rim open, because
a riser's brass collar is what covers it. triangles reports what a builder is
holding before it is uploaded.
Scoped to this part · feeds back into the world's score.