diff --git a/TODO.md b/TODO.md index 435bcc9..2c7c2e5 100644 --- a/TODO.md +++ b/TODO.md @@ -242,8 +242,12 @@ licence-free zone only. - [ ] Use the generated concept lighting and palette as the target for the `lighting`/`lookdev` pass, and record the deviations that stay accepted. - [ ] After the pass, regenerate the venue captures and update README plus both venue documents. -- [ ] Hooded/winter portrait: close the deferred close-up by staging a types 5–7 capture - (`--portrait-type`) or adding a scenario spawn that provides one. +- [x] Hooded/winter portrait: `capture_realism.gd` now force-spawns the requested `--portrait-type` + when the role is event-driven (types 5–7 do not appear in the routine day crowd), so the + deferred close-up can be staged. Captured `--portrait-type=5` and vision-reviewed: the hood + reads as a hoodie (drawstrings + face opening) but is snug — no slack volume behind the + head/drape at the neck — and the face stays fully lit with no inner-rim shadow. Acceptable; + the snug hood is a minor scorecard note, not a P0/P1. ### F. Reference images, concept boards and screenshots diff --git a/src/test/capture_realism.gd b/src/test/capture_realism.gd index 41f92ce..f82536d 100644 --- a/src/test/capture_realism.gd +++ b/src/test/capture_realism.gd @@ -208,6 +208,14 @@ func _begin_stage() -> void: _apply(night_swaps) _queue = (stage["shots"] as Array).duplicate() _shot_frames = 0 + # An explicit --portrait-type asks for one role up close, but trespasser/ + # threat/crisis roles are event-driven and do not appear in the routine day + # crowd. Spawn one directly so the hooded/winter close-up can be staged. + if _portrait_type >= 0: + var portrait_profile = gm.selected_scenario.profile_for(_portrait_type) + if portrait_profile != null: + gm.call("_spawn_npc", portrait_profile, "roam", "portrait_subject", + {"kind": "authored"}) print("capture_realism: stage %s at %d ms" % [stage["name"], Time.get_ticks_msec()]) func _run_queue(delta: float) -> void: