# Modern construction atoms

19 reusable architectural masters for contemporary European villas, terraces and small apartment blocks. All parts use metres, +Y up, +Z toward the exterior. `kit.json` is the authoritative placement and dimension manifest; `materials.json` defines the exact 12-name external material shelf.

## Files

- `kit.glb`: uncompressed, named material slots, no embedded textures. All 19 root transforms are identity. `door_pivot/door_leaf` has its own inset vertical pivot.
- `kit.json`: openings, bounds, per-part triangle counts, placement datums and joint rules.
- `materials/`: BaseColor (sRGB), Normal (+Y tangent, linear), ORM (linear: occlusion/roughness/metallic), plus 16-bit Height where applicable.
- `kit_source.blend`, `build_kit.py`, `geometry.py`: editable Y-up source and deterministic geometry builder. The source Blend contains the material slots and vertex colours; the external shelf is bound by the builder for its round-trip renders.
- `kit_sheet.png`, `material_sheet.png`, `details_*.png`: catalog and close-up renders of the exported geometry. Catalog parts are fitted to individual cards, not drawn at a common scale.
- `viewer/`: local Three.js inspector with individual parts, material shelf, mating joints, clay/reverse views and a generated two-storey wall-fit example.
- `validation.json`, `uv_validation.json`, `audit.json`, `build_evidence.json`, `runtime_check.json`: checks of the delivered files.

## Assembler contract

Generate the 0.35 m walls and the roof slabs/parapets. They are not kit atoms. Wall exterior is Z=0 and interior is Z=-0.35. Openings in the manifest describe the clear wall cutout; the perimeter frame occupies part of that cutout. Position normal opening atoms at the bottom centre of the opening. The window sill heights are 0.10 m (`window_tall`) and 0.90 m (`window_std`) above each storey. Use exactly the same tall-window master at every 3 m storey; never stretch its height. Frames have a 55 mm face and aluminium linings fill the wall depth. Provide the specified 44 mm bedding pocket below tall, standard and ribbon openings for their folded sill; otherwise the wall top will cover the sill lining.

Ribbon modules use a different origin: left bottom edge, X=0..1. Repeat at integer X and put `ribbon_end_mullion` at X=N, facing the same direction. The cap extends back into the last module. Cut one continuous N × 1.30 m opening.

Coping starts at X=0 on the parapet wall centreline, not the facade outer face. Butt runs at 1 m; the corner has 0.5 m legs. The manifest gives the corner orientation. Roof rails use half-width end posts that meet into full posts between modules. No extra closure atom is needed.

Downpipe modules run Y=0..1, with tube centre at Z=.075. Place a head at the pipe's top. The shoe inlet is .24 m above its own origin; set its origin at least .06 m above paving. The viewer includes a two-segment drainage joint example.

Balcony origin is at finished floor, slab top Y=0, projecting toward +Z. Canopy origin is at its upper bearing plane. Keep full-size masters and use repetition for runs.

## Materials

Bind materials by exact name. UV0 is already in surface metres divided by the material's `tile_size_metres`; do not apply that division a second time. Use repeat wrapping. Generated facade panels should use global X/Y surface metres so vertical boards remain continuous through panel boundaries. Larch boards are exactly 120 mm wide with 8 mm gaps (eight pitches in a 1.024 m tile). Concrete has vertical form-board marks and a 512 mm tie-hole grid.

Multiply BaseColor by COLOR_0. This is essential for the grasses and soil in `planter_concrete`; tinting uses existing shelf materials, with no additional material names. Door_paint is neutral and can be tinted independently for doors. Preserve vertex colours when rebinding.

Glass_clear is deliberately opaque, dark reflective architectural glazing for buildings without interior geometry. It is not optical/transmissive glass. Supply an environment reflection map, as demonstrated by the inspector. Height maps are optional displacement inputs; the manifest records each scale, bias and formula. The runtime uses the supplied matching normals and does not displace mesh geometry.

The wall, timber, gravel and paving surfaces adapt CC0 Poly Haven scans; metallic, glass and paint surfaces use deterministic swatches. Source URLs, hashes and licence are in `materials.json`. These are art-directed scan adaptations, not measured larch-species or structural-material data.

## Reproduce / inspect

Requires Python with numpy, Pillow and requests, and Blender 5.2. From this directory:

```sh
python3 prepare_materials.py
blender -b --factory-startup --python-exit-code 1 --python build_kit.py
python3 make_sheets.py
python3 validate_kit.py
python3 -m http.server 18766
```

Open `http://localhost:18766/viewer/`. The builder uses Cycles/OptiX when available. Browser screenshots were checked with Chromium software WebGL; recorded draw counts are not hardware performance benchmarks. `browser_check.py` requires Python Playwright and Chromium.

Delivery status: asset kit validated in Blender and Three.js, ready for assembler review. No game/runtime integration is claimed. Slider and shopfront door are fixed poses; only the entrance pivot leaf is separately articulated. No collision meshes or interiors are included.
