bimtex

Look packs

Appearance that travels with the file.

An element is a 3D appearance written as data. A pack is a file of them — concatenate one onto a model and the look goes with it, so nothing is built into bimtex and nothing resolves against a server.

cat packs/trees.ndjson model.ndjson > dressed.ndjson

Every one of these was authored against a reference picture of the real object. See all 211 beside their references — the comparison, on one page, which is how a body that came out wrong gets found.

Pack Dresses

Writing one

Every tile above is built by the same interpreter the live viewer runs, fitted into the same unit envelope the compiler would hand it. No entry states a size: a definition describes proportion and the model states the dimensions, so one line gives a 5 m tree a 5 m crown and a 3 m tree a 3 m one. None of it reaches the drawing set — plans, sections and elevations of a dressed model and its plain twin are identical, and the acceptance suite draws both and compares every sheet.

A lookdef names what it dresses and carries one node tree, written in Three.js's own vocabulary:

{"t":"lookdef","id":"my-oak","for":"tree:oak","body":{"type":"Group","children":[…]}}

Qualified selectors beat bare ones: tree:oak dresses oaks, tree dresses every tree no qualified entry claimed. The same grammar covers furniture:<type> and asset:<class>. material:<name> exists as well, but it reaches pitched roof planes only — walls, slabs, glazing and paving build straight from the material palette, and no definition is offered them.

Bodies use Group and Mesh nodes, plus position / rotation / scale. Every constructor parameter Three.js documents is accepted under its own name, sweep angles included — which is where domes, arches and curved walls come from. The geometry whitelist is BoxGeometry, RoundedBoxGeometry, CylinderGeometry, ConeGeometry, SphereGeometry, CapsuleGeometry, IcosahedronGeometry, PlaneGeometry, TorusGeometry, ExtrudeGeometry, LatheGeometry, ShapeGeometry, TubeGeometry. Materials are semantic names resolved through the material registry — never inline objects.

ExtrudeGeometry, LatheGeometry, ShapeGeometry and TubeGeometry take a profile rather than a size, and they are what architectural detail is made of — mouldings, cornices, sills, mullion sections, turned balusters, handrails. A profile is written in the same grammar road and footprint.spine already use. TubeGeometry takes a path of 3-D points instead, read as a polyline — corners with straight runs between them. "curve":"spline" reads the same points as Catmull-Rom control points, for a bough or a bent chair back.

Two repeat nodes place one authored child many times: bimtex:Run along a span, bimtex:Scatter over a footprint. So much of a building is one small thing repeated — pickets, balusters, louvre blades, decking boards, grass — and as a Group those cost one authored mesh per copy. As a repeat they cost one, and a single-mesh child collapses to one draw call. Scatter is seeded, never random, so every host places the same blades.

Unknown nodes are skipped, segment counts are clamped, and a body over 500 meshes — or a repeat over 4000 copies — is refused outright rather than truncated. Every failure falls back to the plain compiled volumes: appearance never blocks a deliverable. The full grammar, the envelope law and the extension nodes are specified in 10 · Appearance.