# Gulp City street props

Original generic designs, authored procedurally in Blender 5.2. No text, logos, external images, or Poly Haven textures were used. Poly Haven IDs: none.

## Models

- phone-booth: open-front glazed telephone cabin, handset and shelf; 1,784 tris; cobalt-blue canopy with pale illuminated sign.
- newspaper-kiosk: counter, abstract magazines/posters, awning, domed roof and finial; 1,960 tris; dark green painted metal.
- fire-hydrant: cast barrel, bonnet, flange, side caps, bolts and retaining chain; 888 tris; bright red.
- mailbox: vaulted post box with slot, service door, lock and short pedestal; 468 tris; bright yellow.
- trash-bin: ribbed steel litter bin, recessed liner and discarded paper; 760 tris; graphite with orange upper ring.
- vending-machine: sixteen coloured cans behind glazing, light strips, payment panel and pickup flap; 1,958 tris; teal.
- parking-meter: post-mounted ticket machine, screen, coin slot, button and ticket outlet; 360 tris; slate blue.
- flower-planter: tapered concrete planter, soil, dense folded leaves, stems and pink/white blossoms; 1,980 tris; green foliage with pink and white upper accents.

## Rebuild and verification

Run `blender -b --python-exit-code 1 --python build_props.py -- all`. A single-prop slug or `lineup` is also supported. Outputs go beside the script. The pack was generated by a complete clean run, followed by clean planter and vending rebuilds for texture headroom and display enclosure; each prop resets Blender to an empty scene before building. The script reports Paris time between props.

Each GLB contains one mesh object with applied transforms and modifiers, metres, +Y up, +Z front, and a ground-centred origin. Exact target dimensions are in props.json. Material slots are Body and, where needed, Glass/Glow; each slot becomes one glTF primitive. This means one draw per material per instanced batch, not necessarily one draw per prop type.

Body uses one embedded base-colour/ORM/tangent-normal texture set: 256px for props under 1m wide, 384px for medium props except the 352px planter. Procedural noise colour and bump are baked using Cycles (12 samples). ORM stores softened AO in R, roughness in G, metallic in B. Glass is untextured alpha BLEND at 0.35; Glow is untextured emission. There are no external texture dependencies.

Every GLB is re-imported into a fresh Blender scene before rendering and checked for object count, origin, dimensions, triangles, material names, texture size, and file size. Local independent binary audits check finite attributes and degenerate triangles. Per-prop validation and audit JSON files retain the results.

Previews are Cycles renders of the exported, re-imported GLBs: 800x800 game view at 65 degrees downward, and 800x800 side profile at 8 degrees downward. Lineup is 1600x800, the same 65-degree game view. Grey 1.75m human figures, cameras, lights and asphalt appear only in previews.

## What still looks weak / integration limits

- Fine handset, coin, chain and printed-page details disappear at 20px scale. The hydrant chain may alias in motion; it is retained because the brief explicitly asks for a chain.
- The kiosk roof hides much of its merchandise from a steep camera. Its green dome and awning carry the identity; the independent critic suggested a flatter roof or stronger tier.
- The meter is intentionally simple at distance. Its small blue head can read as a plain post; the independent critic suggested a contrasting top cap.
- Foliage and flower petals are visibly angular close up; flowers and news covers use abstract colour geometry rather than detailed illustrations. Bin litter is simplified folded packaging.
- Surfaces are clean with subtle baked grain, not heavily weathered. The assets are less worn than some buildings in the city reference.
- Glass sorting, emissive appearance, mip filtering, instance draw counts and performance still need verification in the actual three.js game. No game source/runtime was available in this asset job; offline validation does not establish runtime performance.

## Independent visual review

A read-only Gemini review viewed the actual reference and prop renders and returned REVISE with suggestions on chain readability, kiosk dome, meter cap, and hydrant height. The first three remain documented above. Its height estimate was rejected against the measured 0.85m export and 1.75m mannequin. Technical checks are separate from that visual verdict. The planter foliage support and vending display contrast were corrected after direct author inspection of both camera views.

Final technical validation: all eight GLBs passed. File sizes range from 129,672 to 423,048 bytes. See pack-validation.json for hashes and exact metrics. Local disk had approximately 12GB free at handoff.
