norm3(x: number, y: number, z: number) → void
| arg | type | description |
|---|
| x | number | |
| y | number | |
| z | number | |
cross(ax: number, ay: number, az: number, bx: number, by: number, bz: number) → void
| arg | type | description |
|---|
| ax | number | |
| ay | number | |
| az | number | |
| bx | number | |
| by | number | |
| bz | number | |
frame(o: Vec, up: Vec, fwdHint: Vec?) → Frame
A frame at `o` whose +Y is `up` and whose +Z is as close to `fwdHint` as
the up axis allows. This is the frame every part is authored in: +Y runs
along the bone, +Z is the direction the suit faces.
| arg | type | description |
|---|
| o | Vec | |
| up | Vec | |
| fwdHint | Vec? | |
offset(fr: Frame, dx: number, dy: number, dz: number) → Frame
A frame moved along its own axes, so sub-shapes are placed in part terms.
| arg | type | description |
|---|
| fr | Frame | |
| dx | number | |
| dy | number | |
| dz | number | |
rotated(fr: Frame, axis: string, deg: number) → Frame
Spin a frame about one of its own axes. `axis` is "x" | "y" | "z".
| arg | type | description |
|---|
| fr | Frame | |
| axis | string | |
| deg | number | |
mix(u: Vec, v: Vec) → void
| arg | type | description |
|---|
| u | Vec | |
| v | Vec | |
toWorld(fr: Frame, lx: number, ly: number, lz: number) → void
| arg | type | description |
|---|
| fr | Frame | |
| lx | number | |
| ly | number | |
| lz | number | |
dir(fr: Frame, lx: number, ly: number, lz: number) → Vec
Rotate a part-local direction into the frame (no translation).
| arg | type | description |
|---|
| fr | Frame | |
| lx | number | |
| ly | number | |
| lz | number | |
evalColor(col: ColorFn, px: number, py: number, pz: number, nx: number, ny: number, nz: number) → void
| arg | type | description |
|---|
| col | ColorFn | |
| px | number | |
| py | number | |
| pz | number | |
| nx | number | |
| ny | number | |
| nz | number | |
vert(b: Builder, px: number, py: number, pz: number, nx: number, ny: number, nz: number, u: number, v: number, col: ColorFn) → number
Append one vertex; returns its 0-based index.
| arg | type | description |
|---|
| b | Builder | |
| px | number | |
| py | number | |
| pz | number | |
| nx | number | |
| ny | number | |
| nz | number | |
| u | number | |
| v | number | |
| col | ColorFn | |
tri(b: Builder, a: number, c: number, d: number) → void
| arg | type | description |
|---|
| b | Builder | |
| a | number | |
| c | number | |
| d | number | |
quadLocal(b: Builder, fr: Frame, q: { { number } }, col: ColorFn, uvScale: number) → void
A flat quad from four local points, normal derived from the winding.
| arg | type | description |
|---|
| b | Builder | |
| fr | Frame | |
| q | { { number } } | |
| col | ColorFn | |
| uvScale | number | |
triLocal(b: Builder, fr: Frame, q: { { number } }, col: ColorFn) → void
A flat triangle from three local points — the cap fans, so a cap costs half
what it would as degenerate quads.
| arg | type | description |
|---|
| b | Builder | |
| fr | Frame | |
| q | { { number } } | |
| col | ColorFn | |
slab(b: Builder, fr: Frame, hx: number, hy: number, hz: number, ch: number, col: ColorFn, taper: number?) → void
The workhorse: a box with every edge chamfered. `hx/hy/hz` are half
extents along the frame axes; `ch` is the cut. Optional `taper` scales the
top ring in X and Z, which is what turns a plate into a pauldron.
| arg | type | description |
|---|
| b | Builder | |
| fr | Frame | |
| hx | number | |
| hy | number | |
| hz | number | |
| ch | number | |
| col | ColorFn | |
| taper | number? | |
profile(sx: number, sz: number, inset: number) → void
eight-point chamfered rectangle profile, CCW seen from +Y
| arg | type | description |
|---|
| sx | number | |
| sz | number | |
| inset | number | |
cylinder(b: Builder, fr: Frame, r1: number, r2: number, h: number, seg: number, col: ColorFn, capA: boolean?, capB: boolean?) → void
A cylinder along the frame's +Y, from -h/2 (radius r1) to +h/2 (radius r2).
| arg | type | description |
|---|
| b | Builder | |
| fr | Frame | |
| r1 | number | |
| r2 | number | |
| h | number | |
| seg | number | |
| col | ColorFn | |
| capA | boolean? | |
| capB | boolean? | |
ring(y: number, r: number) → void
| arg | type | description |
|---|
| y | number | |
| r | number | |
torus(b: Builder, fr: Frame, R: number, r: number, majorSeg: number, minorSeg: number, col: ColorFn) → void
A ring lying in the frame's XZ plane: the hydraulic ribs on the forearms
and the mag-clamp collar on a gauntlet.
| arg | type | description |
|---|
| b | Builder | |
| fr | Frame | |
| R | number | |
| r | number | |
| majorSeg | number | |
| minorSeg | number | |
| col | ColorFn | |
pt(i: number, j: number) → void
| arg | type | description |
|---|
| i | number | |
| j | number | |
bolt(b: Builder, fr: Frame, r: number, h: number, col: ColorFn) → void
A hex head sunk into a washer: the detail that makes a plate read as bolted
rather than extruded. `up` is the frame's +Y.
| arg | type | description |
|---|
| b | Builder | |
| fr | Frame | |
| r | number | |
| h | number | |
| col | ColorFn | |
boltRow(b: Builder, fr: Frame, count: number, spacing: number, r: number, h: number, col: ColorFn) → void
A row of bolts along the frame's X axis.
| arg | type | description |
|---|
| b | Builder | |
| fr | Frame | |
| count | number | |
| spacing | number | |
| r | number | |
| h | number | |
| col | ColorFn | |
sweep(b: Builder, pts: { Vec }, r: number, seg: number, col: ColorFn) → void
A tube through a list of world-ish local points: torn cabling, the tether,
a hydraulic hose. `pts` are part-local positions.
| arg | type | description |
|---|
| b | Builder | |
| pts | { Vec } | |
| r | number | |
| seg | number | |
| col | ColorFn | |
fin(b: Builder, fr: Frame, len: number, root: number, tip: number, thick: number, col: ColorFn) → void
A flat tapered fin: cooling vanes, the collar wings, the boot cleats.
| arg | type | description |
|---|
| b | Builder | |
| fr | Frame | |
| len | number | |
| root | number | |
| tip | number | |
| thick | number | |
| col | ColorFn | |
hash3(x: number, y: number, z: number) → number
Deterministic value noise — the same seed gives the same rust every boot,
so a screenshot taken today matches the one taken tomorrow.
| arg | type | description |
|---|
| x | number | |
| y | number | |
| z | number | |
noise(x: number, y: number, z: number) → number
| arg | type | description |
|---|
| x | number | |
| y | number | |
| z | number | |
fade(t: number) → number return t
| arg | type | description |
|---|
| t | number | |
L(a: number, bb: number, t: number) → number return a
| arg | type | description |
|---|
| a | number | |
| bb | number | |
| t | number | |
fbm(x: number, y: number, z: number, octaves: number) → number
| arg | type | description |
|---|
| x | number | |
| y | number | |
| z | number | |
| octaves | number | |
upload(b: Builder) → void
Hand the accumulated geometry to the GPU. Returns a MeshHandle a Model
component takes directly, plus the triangle count for the record.
| arg | type | description |
|---|
| b | Builder | |
triCount(b: Builder) → number
| arg | type | description |
|---|
| b | Builder | |