The body stood in an A-pose while the log said the clip was playing. Two independent defects, found by querying the imported asset instead of guessing: 1. PlayAnimation needs the component in AnimationSingleNode with a live single-node instance. The body is hidden at construction and only unhidden by the camera toggle, so the first call could land before the component was ready, and the Wanted == PlayingAnimation guard then returned forever. UpdateBodyAnimation now sets the mode, calls SetAnimation + Play, and re-asserts while the instance is missing. 2. The arms-down offsets lived only in the clip keys. The exporter writes clip data relative to the rest pose, so they arrived as a ±20 degree swing around an A-posed bind - which is exactly what the pose probe measured. apply_base_pose now bakes them into the rest pose before any clip is authored, the same trick mpfb_character_export.py --pose idle uses. The table is applied with inverted signs: as written, the FBX axis mapping produced arms raised in a V. Shot 6 confirms it: the arms hang at the sides. Still open and recorded - the idle pose reads awkwardly (arms forward, hands splayed) and the walk clip has no shot in motion; both are marked in TODO.md and Screenshots/README.md. Instrumentation removed; the diagnostics that remain are behind gigline.SetupLogs.
Screenshots — demo-map visual review
Rendered captures of the demo map only — what a player sees when the demo runs. Generated by Tools/render_screenshots.sh; the PNGs are committed so a reviewer sees exactly what the build rendered.
The review staging map (/Game/Test/ReviewMap) is not part of this set: it exists to hold the camera list and the hero detail rig, and it is not what ships.
How to regenerate
Tools/render_screenshots.sh --verify
Stages the demo shot cameras, runs the game on /Game/Hollywood/DemoMap, copies the PNGs into Screenshots/demo/ and then runs Tools/visual_loop.py --verify to check that each shot still shows the content its expectation describes. About a minute.
Status at a glance
Every shot is embedded below, in order, so the whole review happens in this file.
| # | Shot | Verified | Approved |
|---|---|---|---|
| 1 | Spawn view | ☑ 2026-11-09 | ☑ 2026-11-09 |
| 2 | Street level | ☑ 2026-11-09 | ☑ 2026-11-09 |
| 3 | Crossing | ☑ 2026-11-09 | ☑ 2026-11-09 |
| 4 | North buildings | ☑ 2026-11-09 | ☑ 2026-11-09 |
| 5 | Retail frontage | ☑ 2026-11-09 | ☑ 2026-11-09 |
| 6 | Third-person body | ☑ 2026-11-09 | ☐ pending |
Verified is what --verify reports: the frame is not blank, is the right size, and has tonal range. Approved is the owner's verdict, recorded here. Each shot also has an expectation in Tools/visual_targets.json describing the content it must show.
1. Spawn view
- File:
demo/review-demo-spawn-view.png - View: north sidewalk, 14 m back, level horizon
- Expected content: the whole south block — the neoclassical hero façade between its neighbouring buildings, both sidewalks and the road in the foreground
- Verified: ☑ 2026-11-09 · Approved: ☑ 2026-11-09
2. Street level
- File:
demo/review-demo-street-level.png - View: eye height, north side
- Expected content: the hero colonnade with the adjacent frontage buildings either side, shopfronts at pavement level
- Verified: ☑ 2026-11-09 · Approved: ☑ 2026-11-09
3. Crossing
- File:
demo/review-demo-crossing.png - View: from the north sidewalk along the crosswalk
- Expected content: the designated mid-block crossing (s=130 m, UE X −14956) — zebra bars on the asphalt, south frontage and colonnade behind
- Verified: ☑ 2026-11-09 · Approved: ☑ 2026-11-09
4. North buildings
- File:
demo/review-demo-north-buildings.png - View: across the Boulevard from the south side
- Expected content: the two north-side buildings (TCL Chinese Theatre, Madame Tussaud's), full height in frame
- Verified: ☑ 2026-11-09 · Approved: ☑ 2026-11-09
5. Retail frontage
- File:
demo/review-demo-retail-frontage.png - View: north sidewalk, level horizon, 68° lens
- Expected content: the retail run beside the hero — 6800 Lee Drug's bronze cornice, mural row and parapet next to 6806–6820's burgundy fascia, pilasters and window storey
- Verified: ☑ 2026-11-09 · Approved: ☑ 2026-11-09
Read this one against the reference photograph it was modelled from: Art/reference/retail-neighbours/01-lee-drug-and-neighbor.jpg (Gb321, CC BY-SA 4.0).
Known gaps in this first pass, recorded rather than hidden:
- The parapet still reads as a blank band. It is now two tiers with three deeper reveals, and the step is visible, but there is no profile or shadow line to break the wall — a moulded coping and a modelled reveal need the
0.9.0façade system. - The mural row now reads (framed plates standing 0.12–0.20 m off the wall), but the lettering band does not: it is a plate at 0.10 m and it disappears at 40 m. Wall lettering is a decal/texture problem, scoped in
0.9.0; no amount of extra plate depth fixed it in the second pass. - The corner tower is a plain cylinder with two cap rings — the stepped Deco profile in the photograph is richer than that.
- The camera crops the east end of Lee Drug at 68° from the north sidewalk.
- 6822 Budget is untouched and still a bare blockout volume: no photograph of it exists.
6. Third-person body
- File:
demo/review-demo-third-person.png - View: third-person boom, ~6 m behind the pawn, captured with
-thirdpersonso the pawn starts in the third-person rig - Expected content: the player's own visible body on the north sidewalk, seen from behind, with the hero façade across the street
- Verified: ☑ 2026-11-09 · Approved: ☐ pending
What this shot is evidence for:
- The pawn carries a visible skeletal body with the warm skin material, and a spring-arm camera with collision testing. The V toggle swaps first and third person; the shipped default stays first person and the review passes
-thirdperson. - The idle clip now drives the body. The arms hang at the sides rather than standing out in a bind A-pose, which is what the first three captures of this shot showed.
What is still not right, and is tracked:
- The arms hang too far forward and the hands splay outward, so the pose reads as a person standing awkwardly rather than at rest. The base pose is applied to the rest pose with inverted signs (the FBX axis mapping flips it); the elbow and hand orientation still need work, and that belongs to the
0.2.2skin/animation tuning pass rather than to this rig. - The walk clip has no shot of its own. It imports and its curves carry a ±18° arm swing and a 0.45 rad hip swing, but nothing has captured it in motion; a walking shot needs a camera that follows a moving pawn.
- Camera collision is implemented but unproven: the spawn point has open space behind it, so no shot exercises the arm shortening.
The iteration loop (uncommitted)
Tools/visual_loop.py measures each capture against its reference photograph and turns the deltas into modelling actions for the Blender skill packs:
python3 Tools/visual_loop.py --compare --iteration 3 # writes Art/reference/iterations/3/
That directory is gitignored: iterations stay uncommitted until a shot is confirmed, and only confirmed shots are promoted into Screenshots/demo/. The feedback file names the affected skill (blender-modeler, archviz, materials, lookdev, camera-cinematography) so the next modelling pass has a starting point rather than an opinion.
Note the comparison is only meaningful when the shot and the reference frame the same subject — a wide block view measured against a tight façade crop will always report low edge similarity.
Scene conventions
- Demo map (
/Game/Hollywood/DemoMap): fixed daytime — sun pitch −62 / yaw 120 (intensity 4, warm), sky light 2.6, sky atmosphere, height fog, fixed exposure. - Cameras: elevation shots sit at their target height (pitch 0, so verticals stay parallel) and use a 42–68° lens to fill the frame from across the street.
- Materials: every surface carries a look-developed material from
Tools/ue_build_demo_map.py— noise-blended base colour, masonry coursing, and a generated texture set (Tools/generate_facade_textures.py) sampled world-aligned. Explicit roughness and specular per surface type.
Known cosmetic issues
Every issue is tracked in TODO.md under the version that will fix it; an issue with no ticket is a bug in the plan, not a note.
| Issue | Where it is tracked | State |
|---|---|---|
| Hero stone renders pale — the material is a procedural graph and a generated texture set, not a measured surface | 0.9.0 → measured material library |
Open |
| Hero façade has no doors at street level left and right of the central bay, and the central-bay elements (columns, stairs, set-back entrance, door frames, signage) are not positioned as the photographs show | 0.9.0 → per-building models, hero façade |
Open |
| Nothing may stand in front of the hero façade that blocks it — no awning, no temporary structure | 0.9.0 → per-building models, hero façade |
Open |
| Retail parapet has no moulded profile, and wall lettering built as a plate does not read at 40 m | 0.9.0 → 6800 Lee Drug and 6806–6820, second pass |
Open (moved out of 0.1.6) |
| 6822 Budget is a bare blockout volume — no photograph exists to model it from | 0.9.0 → photography gap |
Deferred (moved out of 0.1.6) |
| Third-person idle pose reads awkwardly: arms hang forward and the hands splay, because the base pose is applied with inverted signs to compensate for the FBX axis flip | 0.2.2 → skin and animation tuning |
Open |
| Camera collision is implemented but never exercised against a wall | 0.2.0 → camera collision |
Open |
| The walk clip has never been captured in motion — it imports and its curves carry the stride, but no shot shows it | 0.2.0 → verify animation plays correctly |
Open |
| Between kerb and building line the walkable surface is the terrain mesh, not a modelled pavement | 0.6.0 → model the pavement between kerb and building line |
Open |
Accepted by the owner, not a defect:
- Banners hang on the column line rather than flush to the wall — that is how they hang in the photographs.
Resolved and removed from this list on 2026-11-09:
- "The El Capitan Theatre has no marquee or blade sign" —
Tools/ue_stage_theatre_trim.pystages all six trim actors; verified in/tmp/gigline/theatre-import.txt. - "Materials are not yet created in Blender or fully integrated" — contradicted by the scene conventions above: every surface carries a look-dev material built in
Tools/ue_build_demo_map.py.





