The picture and the numbers come from one model

The renderer and the material list read the same placed members, so what you see and what you order cannot disagree.

What it is

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

See it, piece by piece
01

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.

02

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.

03

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.

04

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.

Design — Building
BuildingHide
Dimension standardS618
Industry standard (ANSI/ASABE S618)

Eave, rake and ridge measured to the TOP OF THE PURLINS; width and length measured OUTSIDE-OF-GIRT to OUTSIDE-OF-GIRT. Switching restates the numbers — the building itself doesn’t move.

Width(ft)
40′+
Length(ft)
60′+
Eave height(ft)
14′+
Bay spacing(ft)
10′+
Truss spacing(ft)
10′+
Girt spacing(ft)
2′+
Purlin spacing(ft)
2′+
Post embedment(ft)
4′+
Frost depth(ft)
3′6″+
WainscotOn
Height(ft)
3′+
The dimension standard, with what eave, rake, width and length are measured to. The real screen, drawn from the product’s own design system. Sample data — no customer information appears here.
05

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.

How it works
  1. 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.
  2. 2The three.js Scene instances boxes from that list and nothing else.
  3. 3deriveTakeoff(derived) reduces the same list into BOM lines, grouped by S618 usage names.
  4. 4describeItem() reads the same record to name a piece in trade language when you click it.
  5. 5scripts/test-builder3d.mjs compiles the pure engine with tsc and asserts geometry invariants with no browser involved.
Why we built it

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.

The problem
  • A separate quantity formula silently diverges from the drawing after a geometry change.
  • A visual-only 3D tool cannot be trusted to order from.
Sound familiar?
What you get
Any geometry fix improves the order at the same time.
The engine is testable headlessly, so geometry regressions are caught before a screenshot.
The 3D layer is replaceable without touching a single material calculation.
What's inside

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 →