feat: full cel treatment for Neon Alley — flat toon colors + ink outlines

- LevelMaterials.flat(): toon-banded FLAT color material (no greybox grid
  texture) for dressed maps; cached per tint, rim/spec off
- Neon Alley overrides _box_static: every structure renders flat cel color;
  prop-scale pieces (<10m) get an inverted-hull ink outline scaled to their
  size. Building-scale boxes skip the hull — the inflated plates smear into
  black voids at close range (found via fixed street-camera capture)
- Pylon wires render as flat ink lines; warmer wood + hotter vermilion for
  flat shading (the grid multiply used to brighten tints)
- visual_capture: deterministic street-level shot after the aerial for
  style comparisons

Street capture now reads properly BoomerangX: flat lavender asphalt, hard
light bands, torii framed down the underpass, neon strips + sign glow.

Co-Authored-By: Claude Fable 5 <[email protected]>
This commit is contained in:
Nicholas Butzke
2026-07-18 14:23:37 -04:00
co-authored by Claude Fable 5
parent 0813d0b40d
commit 233f88aee3
3 changed files with 48 additions and 4 deletions
+20
View File
@@ -51,6 +51,26 @@ static func tinted(tint: Color, dark: bool = false) -> Material:
return mat
static var _flat_cache: Dictionary = {}
## Flat cel color: toon banding with NO grid texture — the full stylized
## look for dressed maps (vs. tinted()'s greybox grid for blockouts).
## Rim/specular stay off (they blob on large level surfaces).
static func flat(tint: Color) -> Material:
var key := tint.to_html()
if _flat_cache.has(key):
return _flat_cache[key]
var mat := ShaderMaterial.new()
mat.shader = load(TOON_SHADER)
mat.set_shader_parameter("has_texture", false)
mat.set_shader_parameter("use_triplanar", false)
mat.set_shader_parameter("albedo_color", tint)
mat.set_shader_parameter("rim_strength", 0.0)
mat.set_shader_parameter("specular_strength", 0.0)
_flat_cache[key] = mat
return mat
## Toon version of an arbitrary material (usually a character's imported
## StandardMaterial3D): keeps its albedo texture/color, swaps the shading.
static func toonify(src: Material) -> Material: