0.1.4 materials pass plus the camera fix levelling exposed.
Materials (Tools/ue_build_demo_map.py):
- ensure_material() gains optional masonry coursing (world-space course height,
joint band, joint tint) and roughness variation, so facades read as coursed
stone/stucco instead of one flat specular plane.
- WorldPosition is in centimetres: course heights in metres are scaled by 100
(the first attempt divided by 0.55 and the coursing was invisible).
- connect_material_expressions returns False rather than raising, so every link
now goes through a link() helper that logs failures; UE has no
MaterialExpressionLess, so the joint mask is Frac -> Divide -> OneMinus -> Clamp.
- New materials: M_FacadeStoneShadow, M_FacadeGlass (specular 0.62 ~ IOR 1.5),
M_FacadeBanner.
- Material assignment is now per SLOT keyed on the imported slot material name.
It was slot-0 only, which on the hero is the banner, so stone, shadow stone and
glazing still wore flat Blender materials. Hero now 4/4 slots.
Cameras (GigLineShotActor + ue_build_review_map):
- Optional per-shot ShotFieldOfView; the shot tuples take a 4th element.
- Elevations use a 42-55 deg lens from across the street: with the cameras
levelled (0.1.2 follow-up) the building was small in frame, and tilting to fill
it is what breaks the verticals. hero-facade-front sky 39% -> 20%,
demo-spawn-view 23% -> 16%.
Screenshots re-rendered for the whole set.