Four core handles on the main building (pitch at the ridge, eave height, length at the far end wall, width at the far sidewall) plus shape-specific handles for the monitor centre bay, clerestory riser, wing pitch and mansard break. Each is declared in a pure registry with its axis, both travel directions, label, live value, format and the limits the resolver actually enforces.
Also called: direct manipulation · drag handles · resize the building in 3D · ridge and eave tabs
- 1sceneHandleRegistry() declares every handle as data: position, dirIncrease/dirDecrease, glyph, label, value, min/max and how a pointer ray becomes a requested number.
- 2The renderer maps the pointer onto the declared read plane or axis line and calls fromRaw().
- 3resolveBuildingDrag() clamps to BUILDING_LIMITS, applies shape-specific rails (mono/gambrel/hip/monitor/mansard), enforces yard stock lengths, and refuses to shrink the building out from under an existing opening.
- 4With the magnet on, pitch snaps to whole rise-in-12, eave to the standard eave ladder, plan dimensions to bay multiples; off-magnet it lands on a 3in grid.
- 5One drag is one undo entry (a gesture key coalesces every pointermove).
Dragging a building's dimensions freely produced buildings nobody could put up — monoslopes taller than any real structure, gable studs and 6x6 posts longer than anything a yard stocks. The handles now stop at what is actually orderable, and the limits are read from the same resolver the drag itself calls rather than written down separately, so a limit shown on screen can never drift from the limit enforced.
- Free-entry dimension fields produce buildings that cannot be framed or ordered.
- Resizing used to orphan openings past the corner.
- A UI limit that is written down separately from the enforcing code drifts.
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 →