# BULWARK MK-VII — Procedural Powered Armour

A single self-contained `index.html` that renders a full humanoid powered-armour suit
built entirely from code with Three.js. There are no external models, textures or
other assets — every plate, joint, piston, vent, bolt, cable and light is generated
from primitives, extruded shapes, lathes, tubes and procedural canvas textures.

## Run

Open `index.html` in any modern browser (an internet connection is required the first
time to load the pinned Three.js r160 modules from jsDelivr via an import map).

Or serve the folder locally:

```
python3 -m http.server 8000
# then open http://localhost:8000/
```

## What's inside

- **~620 distinct mesh parts** (logged to the console as `PART_COUNT <n>` when the
  suit is constructed, and again when it finishes assembling). Parts include layered
  pauldron lamellae, articulated fingers, piston assemblies, spine segments, thruster
  nozzles, cables, vents and several hundred rivets/bolts.
- **Assemble / explode animation** — parts fly in from a randomised exploded pose with
  per-part stagger, overshoot easing and a lock pulse on seating. Explode reverses the
  motion with a tumble. Buttons trigger both; the suit auto-assembles on load.
- **Sci-fi HUD** — rotating targeting reticle, part labels that project and track moving
  parts on screen with leader lines, and a system status panel (integrity, power, sync,
  live part count, FPS).
- **Orbit controls** — drag to orbit, scroll/pinch to zoom, with damping and an
  auto-orbit toggle. Touch-friendly on mobile (larger buttons, capped pixel ratio,
  shadows disabled on coarse-pointer devices for performance).
- **Lighting** — procedural RoomEnvironment IBL, shadow-casting key light, cyan rim,
  amber fill, emissive core/visor/thruster glows and a fake contact shadow.

## Controls

| Action | Input |
| --- | --- |
| Orbit | drag / one-finger drag |
| Zoom | scroll / pinch |
| Assemble | `ASSEMBLE` button |
| Explode | `EXPLODE` button |
| Toggle auto-orbit | `AUTO-ORBIT` button |

## Notes

- One file, no build step, no dependencies beyond the pinned CDN import map
  (`three@0.160.0`).
- Geometry is cached and shared where possible; static parts are plain meshes so the
  part count stays honest and each piece can animate independently.
