Detail the NPC avatars and finish the realism follow-ups
Full build / Import + headless tests (push) Successful in 38s
Full build / Full desktop build + optional release (push) Skipped

Blender library
- Rebuild the face: sclera, iris and upper lid per eye, brow ridge, cheekbones,
  nose bridge and tip, ears with lobes, split upper/lower lips.
- Give each hand four fingers plus a thumb and end every sleeve in a cuff ring.
- Raise CHAR_MAX_VERTS 4000 -> 5000 (16 avatars still cost ~6.9 ms of a 50 ms
  frame), decimate the body to 26 %; characters are now 3,974-5,026 tris and
  3,744-4,807 verts. Rebuild all 8 variants and re-bake their AO maps.

Capture tooling
- Add a `portrait` stage to capture_realism.gd: freeze one NPC, park the crowd
  out of frame, stand the subject on open sidewalk, turn it into the camera and
  put the guard on the sunlit side. New --portrait-type=N picks the role.
- Add the npc_portrait_day concept and map the shot to it, so avatar detail is
  scored against a portrait instead of a wide street frame.

Flashlight
- Drop the fake additive beam (Materials.light_beam + the cone mesh): on GL
  Compatibility a first-person camera inside the cone renders it as a filled
  disc with a bright far ring. Keep the tight spot (14 deg, 20 m, energy 4.2)
  and its headless test; the visible shaft is now planned behind a Forward+
  preset.

Docs and task tracking
- Move the finished realism follow-ups (ground exposure, flashlight, NPC detail,
  judge re-check) to DONE.md and expand TODO.md with step-by-step plans for NPC
  gear fit, venue geometry plus the committed gallery, and the Forward+ preset.
- Record the decisions, gotchas and portrait recipe in MEMORY.md; update the
  Blender contract, the concept README and the capture section of README.md.
- Refresh the gallery captures affected by the avatar rebuild.

Checks: headless 228/228, Python 86/86, blender_assets audit exit 0,
scene_concepts audit all GOOD, screen_designs compare 11 good / 0 bad,
smoke_npc_budget OK, boot clean (only the known headless mesh warning).
This commit is contained in:
zwitschi committed 2026-11-01 17:46:25 +01:00
1 parent 2624b54b23
commit 1ee32215b0
53 files changed
+1853 -151

No files matched your search

+56
View File
@@ -1049,6 +1049,62 @@ reports to `docs/screens/realism/<run>/`.
texture 0.8→1.0, backdrop 0.6→1.6, and the Pillow metric gap 0.444→0.348.
- [x] Update `README.md` (tool usage + gallery), `MEMORY.md` and `docs/architecture.md`.
## Realism Follow-ups — Lighting, Flashlight, NPC Detail
Completed 2026-11-01. The follow-ups left over after the texture/skyline adoption, split off from
`TODO.md` when each one was finished. Evidence: `docs/screens/realism/2026-11-01-npc/`
(`report.md`, `sheet.jpg`), the portrait capture, and the refreshed `docs/screenshots/` gallery
(`screen_designs.py compare` **11 good / 0 bad**). Headless **228/228**, Python **86/86**.
### Ground exposure at the entrance
- [x] Fixed the over-bright entrance ground: the morning sun now sits at 34° elevation (was 50°)
with a phase `sun_yaw`, so the facade shades the near sidewalk and the props cast long
shadows. Ground luminance went 95 → **83** against the concept's 78 (it was 173 before the
realism pass), with the boulevard at 82 and the street at 81. Day haze warmed and
thickened (`fog_color` 0.87/0.83/0.76, density 0.0034, energy 0.5) and the night glow went
to 1.15.
### Flashlight readability
- [x] Made the flashlight read in the dark: the cone went 30° → **14°** with a 20 m range,
forward aim, `light_energy` 4.2 and `spot_attenuation`/`spot_angle_attenuation` 0.9, so it
lights the door instead of washing the facade.
- [x] Staged the two night captures in LATE (`elapsed_s` 760) instead of dusk in
`capture_screenshots.gd`; the judge moved `06-night-flashlight` from **diff (1.00) to
review (0.10)**.
- [x] Rejected a fake additive beam twice (cylinder + UV ramp, then a vertical-fade
`ShaderMaterial`): on GL Compatibility a first-person camera inside the cone renders it as
a filled disc with a bright far ring. `Materials.light_beam()` and the mesh were removed;
the visible *shaft* is parked behind the Forward+ preset in `TODO.md`.
- [x] Guarded the aim with `test_flashlight_aims_a_tight_forward_spot` (lamp on the head, straight
ahead, cone ≤ 20°, starts off).
### NPC faces, hands and sleeves
- [x] Rebuilt the avatar detail so skin and clothing stop reading as low-poly at conversation
distance: each eye has a sclera, iris and upper lid; added a brow ridge, cheekbones, a nose
bridge and tip, ears with lobes, and split upper/lower lips. Hands have four fingers plus a
thumb, and every sleeve ends in a cuff ring.
- [x] Raised `CHAR_MAX_VERTS` 4000 → **5000** (documented in the code and
`docs/blender-assets.md`) after measuring 16 avatars at ~6.9 ms of a 50 ms frame on a single
skinned mesh, so `npc_coat` fits at 4807 vertices; the character range is now 3,974–5,026
triangles and 3,744–4,807 vertices. Body decimation 0.36 → 0.26.
- [x] Rebuilt all 8 variants and re-baked their AO maps (`assets/models/blender/npc/*_ao.png`),
re-imported, and kept `blender_assets.py audit` at exit 0.
- [x] Added a staged portrait capture: `capture_realism.gd` gained a `portrait` stage that
freezes one NPC, parks the crowd out of frame, stands the subject on open sidewalk, turns
it into the camera and puts the guard on the sunlit side; `--portrait-type=N` picks a role.
It is the only capture where a face fills the frame, and it feeds the new
`npc_portrait_day` concept (`tools/scene_concepts.py` `SHOTS`).
- [x] Regenerated the gallery shots and re-ran the judge: like-for-like overall 2.33 → 2.44,
lighting 3.0 → 3.22, materials 2.22 → 2.44. The `characters` sub-score stayed flat
(~2.2–2.3) because the target is a photoreal face, so avatar quality is judged from the
portrait rather than the aggregate.
- [x] Re-checked the `screen_designs.py judge` default model (`google/gemini-2.5-flash-lite`):
it works but intermittently answers HTTP 400 "API key not valid" (one shot in ten on
2026-11-01); `--model google/gemini-2.5-flash` remains the fallback.
## Visual Alignment — UI Paths and Art Loader
Completed 2026-11-01.