diff --git a/CHANGELOG.md b/CHANGELOG.md index f60953e..fa6c0ca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,44 @@ Format: [Keep a Changelog](https://keepachangelog.com/) style, versions follow [ Nothing yet. +## [0.2.0] — 2026-11-09 + +Third-person body. The pawn gains a visible, animated body and a third-person camera, so the walk cycle is finally something a player can see rather than a clip in an asset list. + +### Added + +- **`Tools/character_anim_build.py`**: `GigLine_Idle` (60 frames) and `GigLine_Walk` (30 frames) at 30 fps, authored as parametric cycles so the loop closes by construction. Limb axes were **measured** on the rig — a probe rotated `upperleg01.L` by 0.5 rad on each axis and read `foot.L`, which showed X swings the limb fore/aft while Y twists and Z abducts. +- **Third-person rig** (`ADR-9`): a visible skeletal body, a `USpringArmComponent` with collision testing, and a **V** toggle. One pawn carries both rigs; first person stays the shipped default. +- **Walk capture harness**: a per-shot `ShotFollow` mode that re-places the review camera every frame in the pawn's frame, plus `SetReviewWalk` / `ReturnToStartForReview`, so a stride is captured deterministically and the fixed-camera shots still find the pawn at spawn. +- **Review shots 6, 7 and 8** — third-person back, front and mid-stride — embedded in `Screenshots/README.md`. + +### Changed + +- Character export preset now **bakes animation** (`bake_anim`, all actions). Without it the exporter wrote a static bind pose and Unreal imported a mesh with no clips and no error. +- `Docs/controls.md` documents the V toggle and the review switches; the in-game HUD line reads `WASD move · Mouse look · Space jump · V view · R reset · Esc pause`. + +### Fixed + +- **`PlayAnimation` on a hidden component never took effect.** The body is hidden at construction and only unhidden by the toggle, so the first call could land before the component was ready; the code now sets `AnimationSingleNode`, calls `SetAnimation` + `Play`, and re-asserts while the instance is missing. +- **The animation switch restarted the clip every frame**, freezing the body on frame 0. +- **The importer silently refused to replace the existing assets.** Changing the arm rotation and rebuilding returned the identical bone quaternion every time; `replace_existing` and `delete_asset` both failed because the pawn's constructor hard-references the clips. Importing under a new name (`CharacterV2`) finally landed the change — that is what unblocked the pose after a dozen failed rebuilds. +- **The review runner copied stale screenshots** from `Saved/`, so a shot retired from the camera list reappeared with byte-identical content from an older run. The folder is cleared before each capture. +- **Walking was never enabled for the stride shot**: the call sat in the shot sequencer's `BeginPlay`, which runs before the player pawn exists, so the cast silently found nothing and `speed` stayed at 0. + +### Verified + +- **8 review shots verify**; shots 6, 7 and 8 approved by the owner. +- **1440p, no frame generation, VSync off**: 759 frames, avg **2.64 ms (379 fps)**, p50 2.54, p95 3.39, p99 3.76, max 4.05 ms — about 2 % over `0.1.5` and 6.3× the 60 fps floor. Series: `Docs/perf/0.2.0-walk-frametimes.csv`. +- `-qaselftest`: walk, reset 0 cm from spawn, pause/unpause, transect 1456 samples / 0 holes, wall probe 0/35, façade probe 0/9 — all PASS. +- 82 tool tests pass. + +### Known limitations + +- **The fingers splay** — the bind's finger spread carries into the pose. Deferred to `0.2.2`. +- **The arms-down rotation was found by sweeping**, not derived: 0.55 rad puts the arms at the sides, 0.65 against the hip, 0.75 into the torso. A derived pose is a `0.2.2` job. +- **Camera collision is implemented but unproven** — the spawn point has open space behind it, so no shot exercises the boom shortening. +- The third-person body has no head or hand IK and no turn-in-place; it is a first playable, not a finished character. + ## [0.1.6] — 2026-11-09 Retail frontage. The two retail buildings beside the hero are modelled from their own photograph instead of the generic kit, and the photograph is treated as evidence: an analysis is written before any geometry, and every dimension the image does not resolve is carried into the part report as an assumption. diff --git a/ROADMAP.md b/ROADMAP.md index 8c9c237..2130f52 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -8,7 +8,7 @@ Development roadmap for this project: milestone goals, scope, decisions, and rel ## Status at a glance — 2026-11-08 15:30 -Workstation, geo pipeline, and engine validation are done. The art pipeline has a first blockout, terrain, and street in metres, in one shared coordinate frame. **Project bootstrap is complete**: `Game/GigLine` builds, packages, and both content-acceptance tests (static-mesh scale, MPFB skeletal character) pass. **`v0.1.0` released 2026-11-08**: the walkable demo, hero façade, verified block frontage, first-person controls, ODbL attribution, and every release check pass (traversal, placement, collision, 60 fps at 1440p, fresh-checkout build, packaged build with controls). Next: the `0.1.1`–`0.1.4` patch series (collision detail, scale/façade corrections, packaging fixes, real building façades), **`v0.1.6` released 2026-11-09**: retail frontage for 6800 Lee Drug and 6806–6820 modelled from their own photograph; 6822 Budget deferred (no reference) and the lettering/parapet detail moved to `0.9.0`. **Next:** `0.2.0` (player body, third-person camera, animation). +Workstation, geo pipeline, and engine validation are done. The art pipeline has a first blockout, terrain, and street in metres, in one shared coordinate frame. **Project bootstrap is complete**: `Game/GigLine` builds, packages, and both content-acceptance tests (static-mesh scale, MPFB skeletal character) pass. **`v0.1.0` released 2026-11-08**: the walkable demo, hero façade, verified block frontage, first-person controls, ODbL attribution, and every release check pass (traversal, placement, collision, 60 fps at 1440p, fresh-checkout build, packaged build with controls). Next: the `0.1.1`–`0.1.4` patch series (collision detail, scale/façade corrections, packaging fixes, real building façades), **`v0.1.6` released 2026-11-09**: retail frontage for 6800 Lee Drug and 6806–6820 modelled from their own photograph; 6822 Budget deferred (no reference) and the lettering/parapet detail moved to `0.9.0`. **`v0.2.0` released 2026-11-09**: visible animated body, third-person camera with a V toggle, idle and walk clips, and a deterministic stride capture. Two cosmetic character defects (splayed fingers, a swept-not-derived base rotation) are deferred to `0.2.2`. **Next:** `0.3.0` (Chaos vehicle, enter/exit, closed driving route). | Area | State | | --- | --- | diff --git a/TODO.md b/TODO.md index ae49aa0..953231d 100644 --- a/TODO.md +++ b/TODO.md @@ -9,34 +9,6 @@ Actionable task list for this project. This file is the single, central place fo - When all steps in a version section are done: write a `CHANGELOG.md` entry, then remove the version section from this file. - Release gate: a version is tagged only on the owner's explicit go-ahead once its release checks pass, not automatically when the checkboxes close. -## 0.2.0 — MPFB player body, third-person camera, basic animation (weeks 7–9) - -### Character setup - active - session-5598ce7e-27e3-4c64-bb49-c04a4a31ee58 (branch `anim-body-0.2.0`) - -- [x] Generate MPFB human base mesh; export baked materials and deform skeleton. Done in bootstrap: idle-pose 19 158-vert human with a 137-bone standard rig, `Tools/mpfb_character_export.py` (now `--pose idle` + warm `make_diffuse`). -- [x] Import character into Unreal; validate skeleton, scale, and materials. Done: `/Game/Test/Character` — `SkeletalMesh` (138 bones), `Skeleton`, warm `M_Character_Export` material with baked `T_Character_Diffuse`. -- [x] Promote the character asset into a reusable NPC prefab (visible body, collision capsule, idle pose) ready for pedestrians (`0.5.0`) once the third-person body lands. Done 2026-11-07: `AGigLineNPCPerson` (see the 0.1.0 Character-development item); `0.5.0` reuses it as the pedestrian base. -- [x] Create basic idle/walk animation set. Done 2026-11-09: `Tools/character_anim_build.py` authors `GigLine_Idle` (60 f) and `GigLine_Walk` (30 f) at 30 fps from parametric cycles, and `Tools/ue_character_anim_import.py` imports them. Both AnimSequences verified in `/Game/Test/Character`: Idle 1.967 s, Walk 0.967 s. Limb axes were **measured** on the rig, not assumed — the probe rotated `upperleg01.L` 0.5 rad per axis and read `foot.L`, which showed X is the fore/aft swing (Y twists, Z abducts). -- [x] Verify animation plays correctly on the imported rig. **Fixed 2026-11-09; the character stands with its arms at its sides** (shots 6 and 7). Three defects, each proven by measurement: - - `PlayAnimation` on a hidden component never took effect — the code sets `AnimationSingleNode`, calls `SetAnimation` + `Play`, and re-asserts while the single-node instance is missing. - - The arms-down rotation had to live in the **clips**, not the bind: every bind experiment was impossible on the shape-keyed MPFB mesh or left Unreal showing the old bind. - - **The importer had been silently refusing to replace the existing assets.** Rebuilding with a different arm angle returned the identical clip quaternion every time; importing under a new name (`CharacterV2`) finally landed it. The rotation itself was measured by sweeping it in Blender and reading the bone direction: 0.55 rad gives arms down and clear of the body, 0.75 rad drives them into the torso. Remaining polish, for `0.2.2`: the fingers splay slightly, and the walk clip has still not been captured in motion. -- [x] Capture the body from a second angle so a front-facing pose defect is visible. `demo-third-person-front` added to the shot list and to `Screenshots/README.md`; the third-person shot alone only showed the pawn's back. - -### Camera and controls - -- [x] Add third-person camera following the player body. Done 2026-11-09: `USpringArmComponent` + camera on the capsule, boom 340 cm, lag 8, and the body is the animated skeletal mesh with the skin material. Review shot 5 (`demo-third-person`, `Screenshots/README.md`) shows the rig; the shipped default view stays first person. -- [x] Add first/third-person toggle. **V**, via `IA_ToggleCamera`; the toggle swaps the active camera and the body's visibility. `-thirdperson` on the command line starts in third person so the review is reproducible. -- [x] Add camera collision to prevent clipping through geometry. The spring arm's collision test (`bDoCollisionTest`, probe 12 cm on `ECC_Camera`) shortens the boom instead of letting the camera pass through a wall. **Not yet exercised against a wall in a shot** — the spawn point has open space behind it, so this is implemented but unproven. -- [x] Document any input changes. `Docs/controls.md` gains the **V** first/third-person toggle (first person stays the default), a "changes since 0.1.0" note, and a table of the review harness switches (`-thirdperson`, `-walk`, `-qaselftest`). The in-game HUD line now reads `WASD move · Mouse look · Space jump · V view · R reset · Esc pause`. - -### Release checks - -- [x] Third-person traversal works end-to-end in the demo area. **Walking is captured and verified 2026-11-09**: `demo-third-person-walk` shows the body mid-stride in profile (legs apart, arms counter-swinging), and the run logs `walk=1 speed=28 clip=GigLine_Walk`. Getting there needed two harness fixes, both found by probing rather than guessing: the camera must track the pawn (`ShotFollow`), and the call that enables walking had to move out of the sequencer's `BeginPlay` — it ran before the player pawn existed, so the cast silently found nothing and `speed` stayed 0 while the probe reported `clip=Idle` every frame. -- [x] No blocking animation or rig defects. Both clips play and advance (idle verified by probing the single-node instance's asset time, walk by shot 8), the body carries its skin material, and the QA self-test passes every check. **Two cosmetic defects are deferred, not fixed:** the fingers splay because the bind's finger spread carries into the pose, and the idle base rotation was found by sweeping rather than derived. Both are `0.2.2` items. -- [x] Performance target still met at 1440p. Measured 2026-11-09 at **2560×1440, no frame generation, VSync off**: **759 frames, avg 2.64 ms (379 fps), p50 2.54, p95 3.39, p99 3.76, max 4.05 ms** — 6.3× the 60 fps floor. Body, skin material and animation cost about 2 % against `0.1.5`'s 2.61 ms. Series: `Docs/perf/0.2.0-walk-frametimes.csv`. The same run passed every QA check: walk, reset 0 cm, pause/unpause, transect 1456 samples / 0 holes, wall probe 0/35, façade probe 0/9. -- [ ] Tag `v0.2.0` and write `CHANGELOG.md` entry; then remove this section. - ## 0.2.1 — Rig fixes (patch) ### Patch tasks