feat: street-level detail pass — real roads, streetlights, trees, cables

Closes more of the gap to hand-authored city art at eye level:

- Kenney City Kit Roads (CC0) installed: every street in the 10x10 grid is
  now real road meshes — lane-marked straights (single stretched mesh per
  segment) and line-marked crossroad tiles at all 81 intersections, tinted
  to sit under the toon lighting without clipping
- Kit streetlights (curved arms over the road) along both central avenues,
  with slim pole colliders kept for grapples
- Kenney Nature Kit trees replace the cone/box stand-ins in shrine
  courtyards and plaza planters (original kit materials kept — the toon
  swap mangled their vertex colors into cyan)
- Overhead cable bundles sag across the east-west streets (the classic
  urban-Japan sky clutter), drawn as ink lines; central avenue kept clear
- Construction sites get cones + barriers from the roads kit
- Per-building tint jitter so repeated kit models read as distinct shops

Verified via street/aerial captures (dark marked asphalt, green trees,
detailed facades); movement 11/11, smoke 0 failures, acoustics ALL PASSED.

Co-Authored-By: Claude Fable 5 <[email protected]>
This commit is contained in:
Nicholas Butzke
2026-07-19 02:33:31 -04:00
co-authored by Claude Fable 5
parent f62f4f2503
commit 04d91dea31
2 changed files with 0 additions and 37 deletions
-36
View File
@@ -1,36 +0,0 @@
extends SceneTree
## Dev tool: print AABBs of prop models used by the city builder.
const PATHS := [
"res://assets/props/roads/road-straight.glb",
"res://assets/props/roads/road-crossroad-line.glb",
"res://assets/props/roads/road-crossing.glb",
"res://assets/props/roads/light-curved.glb",
"res://assets/props/roads/light-curved-double.glb",
"res://assets/props/roads/construction-barrier.glb",
"res://assets/props/roads/construction-cone.glb",
"res://assets/props/nature/tree_default.glb",
"res://assets/props/nature/tree_detailed.glb",
"res://assets/props/nature/tree_oak.glb",
"res://assets/props/nature/tree_tall.glb",
]
func _initialize() -> void:
for p in PATHS:
var scene = load(p)
if scene == null:
print("measure: FAILED ", p)
continue
var inst: Node3D = scene.instantiate()
get_root().add_child(inst)
var aabb := AABB()
var first := true
for mi in inst.find_children("*", "MeshInstance3D", true, false):
var b: AABB = mi.global_transform * mi.get_aabb()
aabb = b if first else aabb.merge(b)
first = false
print("measure: %s size=%s min=%s" % [p.get_file(), aabb.size, aabb.position])
inst.queue_free()
quit()
-1
View File
@@ -1 +0,0 @@
uid://dd4g4l7mg66ro