# Hop City street and canal pack

Original generic designs, authored in Blender 5.2. Metres; GLB +Y up; front +Z. Rafts run along X. Origin is the footprint centre at the lowest point.

- **street-sweeper** — Municipal chaser with hopper, front brushes and amber beacon; 4,428 triangles; orange with white stripe.
- **tram** — Two linked modern saloons, roof pantograph and end headlights; 6,632 triangles; cream with teal roof/skirt.
- **raft-2** — 4 m plank raft on two logs, lashings and rope coil; 2,166 triangles; warm honey wood.
- **raft-3** — 6 m plank raft on two logs, lashings, coil and low crate; 2,110 triangles; warm honey wood.
- **raft-4** — 8 m plank raft on two logs, lashings, coil and low crate; 2,374 triangles; warm honey wood.
- **lily-pad** — Notched fleshy leaf with raised veins and pink flower; 1,022 triangles; rich green and pink.
- **donut** — Ring doughnut, scalloped icing and multicolour sugar sprinkles; 1,116 triangles; strawberry pink and golden dough.
- **tram-signal** — Twin red crossing lamps sharing Glow, rain hoods and bronze bell; 948 triangles; charcoal, red and bronze.
- **bench** — Slatted oak seat/back, curved metal armrests and splayed legs; 1,068 triangles; warm oak and dark green.
- **hedge** — Rounded clipped shrub inside an open low stone kerb; 1,948 triangles; rich green and warm grey stone.

## Build and verification

`blender -b --python-exit-code 1 --python build_street.py -- all` rebuilds every asset from an empty scene, bakes and exports, re-imports each GLB into a fresh scene, checks bounds/origin/materials/triangles/file size, and renders the actual imported mesh. A slug instead of `all` builds only that asset. `lineup` only assembles the existing previews.
Each asset has one mesh, one baked Body material, and optional Glass/Glow. Body has a 512×512 RGB albedo and a 512×512 packed roughness/metallic image (R=1, G=roughness, B=metallic). The exporter binds G/B as glTF metallicRoughnessTexture. Geometry carries bevels, leaf veins, planks, brush tufts and other silhouette detail. Glass is alpha BLEND at 0.35; Glow is untextured emission.
Texture provenance: original Blender procedural nodes, baked with Cycles EMIT at 8 samples and 5 px dilation. No Poly Haven texture IDs used; no external image sources. Albedo contains material colour variation, not directional lighting. The packed map contains material roughness/metallic, not a baked AO pass. No normal map is needed for this low-poly geometry.
Previews: 800×800 Cycles, 32 samples with denoising, soft daylight, orthographic 55-degree game camera or low side camera. Raft side views show the long edge. The faint outline is a real 2 m square; the doughnut game view includes the complete square, while its side view is a close-up. Preview lights, cameras, ground and grid are not exported.
`lineup.png` is a 1600×800 contact lineup of those same game-view renders, independently framed for readable comparison; the labels give real dimensions. It is not a common-scale scene. The lineup compositor uses system Python 3 with Pillow; all modeling, baking, export and rendering use bpy.
Per-piece `*-validation.json` records the fresh Blender import. `*-audit.json` is the independent serialized-GLB audit (zero degenerate triangles, finite attributes, embedded textures). Runtime three.js draw calls and FPS are not measured by this asset worker.

## What still looks weak

- The tram is deliberately economical: dark backed glass and no passenger interior, opening doors or animated pantograph.
- The longer raft rope coils and the doughnut icing are visibly polygonal in extreme close-ups; they are designed for the stated phone-scale camera.
- The hedge uses opaque modeled foliage with baked colour variation, not individual alpha-cutout leaves; its leaf detail is suggestive.
- The independent visual critic preferred stronger tram roof contrast and a more uniform hedge surface. These remain artistic limitations; see critic-review.txt. Its sweeper brush visibility finding was addressed by extending both brush arms. Its request for more distinct raft designs was not adopted: the three rafts intentionally share construction at the specified lengths.
- Signal lamps share one Glow material as requested, so alternating each lamp independently would need a runtime material/mesh split.
- The 0.45 m raft height includes accessories: the longer rafts carry shallow crates to preserve the specified total bounds.
- No in-game collision meshes, motion, sounds or integration code are included; this delivery is the static asset pack.
