feat(materials): generated facade texture maps, sampled world-aligned

New Tools/generate_facade_textures.py: deterministic, stdlib-only PNG generator for
four facade surface sets (ashlar stone, stucco, asphalt, concrete), each as base
colour (_BC) plus roughness (_R). Pure zlib encoder and hash-based value noise, so
re-running produces byte-identical files (verified by md5sum); ~14 s for eight 512²
maps.

ue_build_demo_map.py imports them into /Game/Hollywood/Textures and samples them
world-aligned: WorldPosition (cm) * 1/tile_cm -> ComponentMask(R,G) -> TextureSample
UVs, with per-material tile sizes (stone 440, stucco 260, asphalt 900, concrete
250 cm). A textured material skips the graph coursing deliberately - overlaying both
would double the course pattern.

Textures imported 8/8, hero 4/4 slots assigned, map saved; screenshots re-rendered.
This commit is contained in:
zwitschi committed 2026-11-08 19:04:03 +01:00
1 parent 0f928531df
commit 73e535a24b
39 files changed
+401 -48

No files matched your search

+18
View File
@@ -550,3 +550,21 @@ Scope: facts and traps that cost time to establish. Planned work lives in [TODO.
a 4th element on the shot tuples; a long lens (42–55°) fills the frame from
across the street while the camera stays level, so verticals stay parallel.
`review-hero-facade-front` sky 39 → 20 %, `demo-spawn-view` 23 → 16 %.
## 2026-11-09 — facade texture maps (0.1.4)
- `Tools/generate_facade_textures.py` writes deterministic 512² base-colour and
roughness maps (ashlar stone, stucco, asphalt, concrete) with a pure-zlib PNG
encoder and hash-based value noise — no numpy/Pillow, ~14 s for all eight, and
byte-identical on a re-run (checked by md5sum).
- `ue_build_demo_map.py` imports them to `/Game/Hollywood/Textures` and samples
them **world-aligned**: WorldPosition (cm) → ×(1/tile_cm) → ComponentMask(R,G)
→ TextureSample UVs. `tile_cm` per material: stone 440, stucco 260, asphalt 900,
concrete 250.
- Gotchas: `MaterialExpressionTextureSample`'s UV input pin is **"UVs"**, and the
output pin for colour is **"RGB"** / roughness **"R"**. `ComponentMask` pins are
R/G/B/A booleans. A textured material skips the graph coursing on purpose —
overlaying both would double the course pattern.
- The script needs `ROOT` in `ue_build_demo_map.py` and `sys` imported; forgetting
either fails with `NameError` and an exit code of 0 from the commandlet (always
read the result file under /tmp/gigline).