Src/lib/builder3d is a pure, framework-independent engine: BuildingSpec in, DerivedBuilding (members + skin panels + validations) out, then Takeoff out of that. No three.js, no React, no DOM anywhere in the module tree. The renderer draws those members; the takeoff measures those same members; inspect mode words those same members.
Also called: single source of truth · model-driven takeoff · no drift between drawing and BOM
The picture and the order are the same list of parts
One pass places every post, girt, purlin, chord, header and panel. The 3D view draws that list, the material takeoff measures that same list, and the card that names a piece when you click it reads that same list. There is no second spreadsheet anywhere, so there is no way for the drawing to say one thing and the order to say another.
Quantities are measured off the drawing, not off a formula
Wall steel is counted per wall rectangle at that wall's own height — the high wall of a single slope, the field above a wainscot band, the gable triangle as a triangle — rather than one eave-height run around the perimeter. That is the difference between a number that is right on a rectangle and a number that is right on the building you drew.
Click any stick and it tells you what it is
A jamb post reads 6x6, 18ft long, including 4ft below grade, Overhead Door 1, one of 8. A truss chord tells you it arrives inside one plated truss, not as a yard stick. A girt tells you it is face-nailed one piece per bay. The count on the card is the quantity on the order, because both are reading the same record.
Eave and ridge mean what the truss plant means
Dimensions follow the industry standard by default: eave, rake and ridge measured to the top of the purlins, width and length outside-of-girt to outside-of-girt. If your drawing set speaks to truss bearing and the post line instead, switch the convention and the numbers relabel without the building changing shape. Get this wrong and every elevation you hand a supplier is off by inches.
The geometry is checked automatically, not by looking at it
The part that works out the geometry runs with no 3D display attached, so it can be tested on its own. Standing checks run on every change: nothing pokes out through the steel, no board floats in mid-air, every opening frames legally, and every quantity has a price with a unit that matches. A broken render fails a check here instead of turning up in a drawing you already emailed.
- 1deriveBuilding(spec) places every post, girt, purlin, chord, header and panel with a position, size, rotation, nominal callout, cut length and a traceability `source` tag.
- 2The three.js Scene instances boxes from that list and nothing else.
- 3deriveTakeoff(derived) reduces the same list into BOM lines, grouped by S618 usage names.
- 4describeItem() reads the same record to name a piece in trade language when you click it.
- 5scripts/test-builder3d.mjs compiles the pure engine with tsc and asserts geometry invariants with no browser involved.
When the drawing and the quantities are computed by two different formulas, they agree until someone changes the building, and then nobody can tell which one is wrong. Every takeoff quantity is measured off the geometry that was actually drawn rather than recalculated from the dimensions. That is why wall steel is counted per wall rectangle and gable triangle instead of one eave-height perimeter guess, which quietly under-counts every monoslope and every wainscotted wall.
- A separate quantity formula silently diverges from the drawing after a geometry change.
- A visual-only 3D tool cannot be trusted to order from.
See it on your own jobs
Twenty minutes, your numbers, no slide deck. We’ll build one of your real buildings in front of you and send you the estimate link at the end — yours to keep either way.
or keep browsing features →