From 985dfcbac7c0d155add6ff753315d37b74002354 Mon Sep 17 00:00:00 2001 From: Zwitschi Date: Sat, 7 Nov 2026 15:28:42 +0100 Subject: [PATCH] npc: AGigLineNPCPerson prefab + stable-named screenshots - New C++ AGigLineNPCPerson: reusable NPC/pedestrian prefab built on the MPFB human. ACharacter capsule half-height 83 cm (total 1.66 m, head top ~1.66 m so a 1.60 m camera doesn't clip), the character skeletal mesh on the built-in mesh as the visible body (feet on Z 0), AutoPossessAI for 0.5.0 pedestrians. Staged at Z 0 in the review scene; captured as review-npc-prefab.png. - AGigLineShotActor now names screenshots by stable camera name (no list-index prefix): inserting or reordering cameras no longer renumbers files or orphans the old ones. Re-rendered all review/demo shots with stable names. - ue_build_review_map.py: chmod the target .umap before save_map (git marks maps 444 on checkout, silently making save_map return False and dropping stages). - Screenshots/README.md, ROADMAP, TODO updated for the prefab + stable names. - DemoMap.umap rebuilt by the render pipeline (north buildings + demo cameras). --- Game/GigLine/Content/Hollywood/DemoMap.umap | 2 +- Game/GigLine/Content/Test/ReviewMap.umap | 4 +-- .../Source/GigLine/GigLineNPCPerson.cpp | 34 +++++++++++++++++++ .../GigLine/Source/GigLine/GigLineNPCPerson.h | 32 +++++++++++++++++ .../Source/GigLine/GigLineShotActor.cpp | 8 +++-- ROADMAP.md | 2 +- Screenshots/README.md | 33 ++++++++++-------- .../demo/review-00-demo-spawn-view.png | 3 -- .../demo/review-01-demo-street-level.png | 3 -- Screenshots/demo/review-02-demo-crossing.png | 3 -- .../demo/review-03-demo-north-buildings.png | 3 -- Screenshots/demo/review-demo-crossing.png | 3 ++ .../demo/review-demo-north-buildings.png | 3 ++ Screenshots/demo/review-demo-spawn-view.png | 3 ++ Screenshots/demo/review-demo-street-level.png | 3 ++ Screenshots/review-00-overview.png | 3 -- Screenshots/review-01-character.png | 3 -- Screenshots/review-02-scale-cubes.png | 3 -- Screenshots/review-03-player-placement.png | 3 -- Screenshots/review-04-ground-contact.png | 3 -- Screenshots/review-05-shadow-compare.png | 3 -- Screenshots/review-06-hero-portals.png | 3 -- Screenshots/review-07-hero-facade-front.png | 3 -- Screenshots/review-08-hero-facade-oblique.png | 3 -- Screenshots/review-character.png | 3 ++ Screenshots/review-ground-contact.png | 3 ++ Screenshots/review-hero-facade-front.png | 3 ++ Screenshots/review-hero-facade-oblique.png | 3 ++ Screenshots/review-hero-portals.png | 3 ++ Screenshots/review-npc-prefab.png | 3 ++ Screenshots/review-overview.png | 3 ++ Screenshots/review-player-placement.png | 3 ++ Screenshots/review-scale-cubes.png | 3 ++ Screenshots/review-shadow-compare.png | 3 ++ TODO.md | 19 ++++++----- Tools/ue_build_review_map.py | 31 +++++++++++++++++ 36 files changed, 178 insertions(+), 68 deletions(-) create mode 100644 Game/GigLine/Source/GigLine/GigLineNPCPerson.cpp create mode 100644 Game/GigLine/Source/GigLine/GigLineNPCPerson.h delete mode 100644 Screenshots/demo/review-00-demo-spawn-view.png delete mode 100644 Screenshots/demo/review-01-demo-street-level.png delete mode 100644 Screenshots/demo/review-02-demo-crossing.png delete mode 100644 Screenshots/demo/review-03-demo-north-buildings.png create mode 100644 Screenshots/demo/review-demo-crossing.png create mode 100644 Screenshots/demo/review-demo-north-buildings.png create mode 100644 Screenshots/demo/review-demo-spawn-view.png create mode 100644 Screenshots/demo/review-demo-street-level.png delete mode 100644 Screenshots/review-00-overview.png delete mode 100644 Screenshots/review-01-character.png delete mode 100644 Screenshots/review-02-scale-cubes.png delete mode 100644 Screenshots/review-03-player-placement.png delete mode 100644 Screenshots/review-04-ground-contact.png delete mode 100644 Screenshots/review-05-shadow-compare.png delete mode 100644 Screenshots/review-06-hero-portals.png delete mode 100644 Screenshots/review-07-hero-facade-front.png delete mode 100644 Screenshots/review-08-hero-facade-oblique.png create mode 100644 Screenshots/review-character.png create mode 100644 Screenshots/review-ground-contact.png create mode 100644 Screenshots/review-hero-facade-front.png create mode 100644 Screenshots/review-hero-facade-oblique.png create mode 100644 Screenshots/review-hero-portals.png create mode 100644 Screenshots/review-npc-prefab.png create mode 100644 Screenshots/review-overview.png create mode 100644 Screenshots/review-player-placement.png create mode 100644 Screenshots/review-scale-cubes.png create mode 100644 Screenshots/review-shadow-compare.png diff --git a/Game/GigLine/Content/Hollywood/DemoMap.umap b/Game/GigLine/Content/Hollywood/DemoMap.umap index 3b9b4fc..edb6e47 100644 --- a/Game/GigLine/Content/Hollywood/DemoMap.umap +++ b/Game/GigLine/Content/Hollywood/DemoMap.umap @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:dd9704de1c462f323006ed352fbbb3833dd54cba728338476c60f91c4d4203d6 +oid sha256:d6eb86a071caaa75dd40d5f39e0746a1905844c3e479eb86c25081536f1acab9 size 32372 diff --git a/Game/GigLine/Content/Test/ReviewMap.umap b/Game/GigLine/Content/Test/ReviewMap.umap index 5a48dcc..461473e 100644 --- a/Game/GigLine/Content/Test/ReviewMap.umap +++ b/Game/GigLine/Content/Test/ReviewMap.umap @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:deddb2f16424c6147e0fda196002fb44888f9055d34554dc5a567675f720c0d6 -size 28448 +oid sha256:4d2d5e8d826561523a076f0b6e11ab53d46d744b024311281b39a454f96f8f0c +size 32736 diff --git a/Game/GigLine/Source/GigLine/GigLineNPCPerson.cpp b/Game/GigLine/Source/GigLine/GigLineNPCPerson.cpp new file mode 100644 index 0000000..9700208 --- /dev/null +++ b/Game/GigLine/Source/GigLine/GigLineNPCPerson.cpp @@ -0,0 +1,34 @@ +#include "GigLineNPCPerson.h" + +#include "Components/CapsuleComponent.h" +#include "Components/SkeletalMeshComponent.h" +#include "Engine/SkeletalMesh.h" + +AGigLineNPCPerson::AGigLineNPCPerson() +{ + // The MPFB human is ~1.66 m tall, ~0.43 m wide. Half-height 83 cm leaves + // the head top at ~1.66 m, so a 1.60 m camera does not clip it. Radius + // ~35 cm accommodates the relaxed idle pose (arms at the sides). + GetCapsuleComponent()->InitCapsuleSize(35.0f, 83.0f); + GetCapsuleComponent()->SetRelativeLocation(FVector(0.0f, 0.0f, 83.0f)); + + // Visible body: the imported MPFB human on ACharacter's built-in mesh + // component, feet at Z 0 (capsule base lowered to the floor). + USkeletalMeshComponent* Mesh = GetMesh(); + Mesh->SetRelativeLocation(FVector(0.0f, 0.0f, -83.0f)); + Mesh->SetRelativeRotation(FRotator(0.0f, -90.0f, 0.0f)); + Mesh->SetCastShadow(true); + + static ConstructorHelpers::FObjectFinder MeshAsset( + TEXT("/Game/Test/Character/character")); + if (MeshAsset.Succeeded()) + { + Mesh->SetSkeletalMeshAsset(MeshAsset.Object); + Mesh->SetSkeletalMesh(MeshAsset.Object); + } + + // An NPC pawn has no player input; hand it to AI when it is spawned into + // the world (the 0.5.0 pedestrian navigation will drive it). + AutoPossessAI = EAutoPossessAI::PlacedInWorldOrSpawned; + bUseControllerRotationYaw = false; +} \ No newline at end of file diff --git a/Game/GigLine/Source/GigLine/GigLineNPCPerson.h b/Game/GigLine/Source/GigLine/GigLineNPCPerson.h new file mode 100644 index 0000000..06624f5 --- /dev/null +++ b/Game/GigLine/Source/GigLine/GigLineNPCPerson.h @@ -0,0 +1,32 @@ +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/Character.h" +#include "GigLineNPCPerson.generated.h" + +/** + * Reusable NPC/pedestrian prefab built on the MPFB human asset. + * + * Deliberately NOT the 0.1.0 player (which is AGigLineCharacter, a capsule + + * camera). This is the visible-body template for future NPCs/pedestrians + * (0.5.0): ACharacter's collision capsule sized to the ~1.66 m MPFB human, + * with the character skeletal mesh on the built-in mesh component as the + * visible body, feet at Z 0. + * + * Head-height guarantee: capsule half-height 83 cm (total 1.66 m), so the head + * top sits at ~1.66 m; a camera/view at 1.60 m sits just below eye level and + * does not clip the head or neck. Set HeadHeightCm after observing the posed + * mesh if the eye socket lands elsewhere. + */ +UCLASS() +class GIGLINE_API AGigLineNPCPerson : public ACharacter +{ + GENERATED_BODY() + +public: + AGigLineNPCPerson(); + + /** Observed head height (cm above Z 0), used to verify camera clearance. */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "NPC") + float HeadHeightCm = 155.f; +}; \ No newline at end of file diff --git a/Game/GigLine/Source/GigLine/GigLineShotActor.cpp b/Game/GigLine/Source/GigLine/GigLineShotActor.cpp index ae492cc..290cd4a 100644 --- a/Game/GigLine/Source/GigLine/GigLineShotActor.cpp +++ b/Game/GigLine/Source/GigLine/GigLineShotActor.cpp @@ -27,8 +27,12 @@ void AGigLineShotActor::Tick(float DeltaSeconds) if (SettleCountdown <= 0.f) { bWaitingForSettle = false; - const FString FileName = FString::Printf(TEXT("review-%02d-%s"), CurrentShot, - CurrentShot < ShotNames.Num() ? *ShotNames[CurrentShot] : *FString::FromInt(CurrentShot)); + // Use the stable custom name only (no list-index prefix): inserting or + // reordering cameras must not renumber files and orphan the old ones. + const FString Name = CurrentShot < ShotNames.Num() + ? ShotNames[CurrentShot] + : FString::FromInt(CurrentShot); + const FString FileName = FString::Printf(TEXT("review-%s"), *Name); // Resolution is the game window's; the runner passes -ResX/-ResY. FScreenshotRequest::RequestScreenshot(FileName, false, false); bWaitingForScreenshot = true; diff --git a/ROADMAP.md b/ROADMAP.md index c2a8652..f59349a 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -28,7 +28,7 @@ Workstation, geo pipeline, and engine validation are done. The art pipeline has **Geographic data (complete, with blockout detail open):** the OSM extract, address, footprints, demo bounds, EPSG:26911 frame with a recorded origin, and the 3DEP 1 m DEM are verified and committed. The meter→centimetre conversion lives in one function, and every exporter must call it. Block buildings still need height data for three placeholders and cleaning or detailing of the Blosm blockout. -**Review and character (decision):** the review scene is the staging used for all visual approval. Its scope is the character's ground contact, the camera list, and the façade detail shots, and nothing in asset production or gameplay continues past it until these shots pass. The shot list is in `Screenshots/README.md`. Coordinator decision 2026-11-07: **`0.1.0` ships first-person only**, a capsule with a camera and no visible player body. The MPFB character asset (idle pose, warm skin) is the template for later **NPCs** (`0.2.0` body/camera toggle, `0.5.0` pedestrians). It stays a standalone character prefab, not wired into the `AGigLineCharacter` pawn. +**Review and character (decision):** the review scene is the staging used for all visual approval. Its scope is the character's ground contact, the camera list, and the façade detail shots, and nothing in asset production or gameplay continues past it until these shots pass. The shot list is in `Screenshots/README.md`. Coordinator decision 2026-11-07: **`0.1.0` ships first-person only**, a capsule with a camera and no visible player body. The MPFB character asset (idle pose, warm skin) is the template for later **NPCs** (`0.2.0` body/camera toggle, `0.5.0` pedestrians). It is now a concrete reusable prefab, `AGigLineNPCPerson` (collision capsule + visible body, feet on Z 0), kept standalone and not wired into the `AGigLineCharacter` pawn. **Asset production:** the scale test and the `ue_metric_v1` export and import presets are established. The hero façade first pass is built and screenshot-approved; the north-side buildings (TCL Chinese Theatre, Madame Tussaud's) are staged. Open: reference collection for the door recess and the night frame, the surrounding block frontage, sidewalks, roads and collision, and materials for all assets. diff --git a/Screenshots/README.md b/Screenshots/README.md index 3945c8c..fecc2d2 100644 --- a/Screenshots/README.md +++ b/Screenshots/README.md @@ -27,19 +27,24 @@ and exits — about a minute. The camera list lives in ## Review-map shots -All ☑ approved 2026-11-07 unless noted. Click an image for the full-size PNG. +All ☑ approved 2026-11-07 unless noted. `review-npc-prefab` is new (☐ pending). + +> Naming: shots use their stable `Tools/ue_build_review_map.py` camera name (no +> index prefix), so adding or reordering cameras never renumbers files or +> orphans the old ones. Click an image for the full-size PNG. | File | Preview | View | What it shows | | --- | --- | --- | --- | -| `review-00-overview.png` | [overview](review-00-overview.png) | 7 m up, NE | Whole review layout: character + both cubes on the floor | -| `review-01-character.png` | [character](review-01-character.png) | eye height, south | MPFB mannequin, idle pose + warm skin; feet meet the plane | -| `review-02-scale-cubes.png` | [scale cubes](review-02-scale-cubes.png) | south | Floating vs grounded cube: cast vs contact shadow | -| `review-03-player-placement.png` | [player placement](review-03-player-placement.png) | spawn | The `AGigLineCharacter` pawn, capsule height and landing | -| `review-04-ground-contact.png` | [ground contact](review-04-ground-contact.png) | knee height, feet | Floating/sinking character is obvious here | -| `review-05-shadow-compare.png` | [shadow compare](review-05-shadow-compare.png) | low angle | Detached (floating) vs touching (grounded) shadows | -| `review-06-hero-portals.png` | [hero portals](review-06-hero-portals.png) | 8 m, eye height | Three genuine 1.2 m portal recesses with flights and plinth | -| `review-07-hero-facade-front.png` | [hero facade front](review-07-hero-facade-front.png) | road side, straight-on | Hero façade elevation and column rhythm | -| `review-08-hero-facade-oblique.png` | [hero facade oblique](review-08-hero-facade-oblique.png) | north-west | Body depth and column line standing proud of the mass | +| `review-overview.png` | [overview](review-overview.png) | 7 m up, NE | Whole review layout: character + both cubes on the floor | +| `review-character.png` | [character](review-character.png) | eye height, south | MPFB mannequin, idle pose + warm skin; feet meet the plane | +| `review-scale-cubes.png` | [scale cubes](review-scale-cubes.png) | south | Floating vs grounded cube: cast vs contact shadow | +| `review-player-placement.png` | [player placement](review-player-placement.png) | spawn | The `AGigLineCharacter` pawn, capsule height and landing | +| `review-npc-prefab.png` | [npc prefab](review-npc-prefab.png) | mid, west | The `AGigLineNPCPerson` prefab: collision capsule + visible MPFB body, feet on Z 0 (**new 2026-11-07**) | +| `review-ground-contact.png` | [ground contact](review-ground-contact.png) | knee height, feet | Floating/sinking character is obvious here | +| `review-shadow-compare.png` | [shadow compare](review-shadow-compare.png) | low angle | Detached (floating) vs touching (grounded) shadows | +| `review-hero-portals.png` | [hero portals](review-hero-portals.png) | 8 m, eye height | Three genuine 1.2 m portal recesses with flights and plinth | +| `review-hero-facade-front.png` | [hero facade front](review-hero-facade-front.png) | road side, straight-on | Hero façade elevation and column rhythm | +| `review-hero-facade-oblique.png` | [hero facade oblique](review-hero-facade-oblique.png) | north-west | Body depth and column line standing proud of the mass | ## Demo-map views @@ -47,10 +52,10 @@ Rendered from `/Game/Hollywood/DemoMap`, the walkable level. Click an image for | File | Preview | Approval | What it shows | | --- | --- | --- | --- | -| `demo/review-00-demo-spawn-view.png` | [spawn view](demo/review-00-demo-spawn-view.png) | ☑ | Spawn view: north sidewalk, the hero façade across the road | -| `demo/review-01-demo-street-level.png` | [street level](demo/review-01-demo-street-level.png) | ☑ | Street level: portals, flights, banners, colonnade | -| `demo/review-02-demo-crossing.png` | [crossing](demo/review-02-demo-crossing.png) | needs review | From the west, looking along the block (foreground blocking) | -| `demo/review-03-demo-north-buildings.png` | [north buildings](demo/review-03-demo-north-buildings.png) | ☑ | North-side background buildings (TCL, Tussaud's) across the Blvd | +| `demo/review-demo-spawn-view.png` | [spawn view](demo/review-demo-spawn-view.png) | ☑ | Spawn view: north sidewalk, the hero façade across the road | +| `demo/review-demo-street-level.png` | [street level](demo/review-demo-street-level.png) | ☑ | Street level: portals, flights, banners, colonnade | +| `demo/review-demo-crossing.png` | [crossing](demo/review-demo-crossing.png) | needs review | From the west, looking along the block (foreground blocking) | +| `demo/review-demo-north-buildings.png` | [north buildings](demo/review-demo-north-buildings.png) | ☑ | North-side background buildings (TCL, Tussaud's) across the Blvd | ## What to look for diff --git a/Screenshots/demo/review-00-demo-spawn-view.png b/Screenshots/demo/review-00-demo-spawn-view.png deleted file mode 100644 index dc0f647..0000000 --- a/Screenshots/demo/review-00-demo-spawn-view.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0f3d6f0c1885b708645092ad7aeae9b94b7bb1f9df69976886d3055a84877fe9 -size 2599672 diff --git a/Screenshots/demo/review-01-demo-street-level.png b/Screenshots/demo/review-01-demo-street-level.png deleted file mode 100644 index 71736df..0000000 --- a/Screenshots/demo/review-01-demo-street-level.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:75e2814c90d94fad5789aae830d59238544d5360223be9e40ab59cebdc2f09db -size 1926763 diff --git a/Screenshots/demo/review-02-demo-crossing.png b/Screenshots/demo/review-02-demo-crossing.png deleted file mode 100644 index da100be..0000000 --- a/Screenshots/demo/review-02-demo-crossing.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8d304878047072351acddaa27bdd571da4948fb0a5dffa4d901ba6f9e88f2b54 -size 1285673 diff --git a/Screenshots/demo/review-03-demo-north-buildings.png b/Screenshots/demo/review-03-demo-north-buildings.png deleted file mode 100644 index 7f978cd..0000000 --- a/Screenshots/demo/review-03-demo-north-buildings.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e604f6d549f854f4fea2d935ad551111ec0b4f3cfad0219549427814196b0ca6 -size 1777325 diff --git a/Screenshots/demo/review-demo-crossing.png b/Screenshots/demo/review-demo-crossing.png new file mode 100644 index 0000000..408995a --- /dev/null +++ b/Screenshots/demo/review-demo-crossing.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e7791340703cf239fa953504f2b38ce6a96ec131e35e622078acb51d0957e763 +size 1292359 diff --git a/Screenshots/demo/review-demo-north-buildings.png b/Screenshots/demo/review-demo-north-buildings.png new file mode 100644 index 0000000..b39fbc2 --- /dev/null +++ b/Screenshots/demo/review-demo-north-buildings.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:95f580993db879516ee1f4f243b6cd00abad523d10cf23b1cb1a39324365de05 +size 1775921 diff --git a/Screenshots/demo/review-demo-spawn-view.png b/Screenshots/demo/review-demo-spawn-view.png new file mode 100644 index 0000000..c965b34 --- /dev/null +++ b/Screenshots/demo/review-demo-spawn-view.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:788f71de1bf5080c738da6d94170e3d5a577823cd33aa5a10dd892f39b41518f +size 2585447 diff --git a/Screenshots/demo/review-demo-street-level.png b/Screenshots/demo/review-demo-street-level.png new file mode 100644 index 0000000..67951c1 --- /dev/null +++ b/Screenshots/demo/review-demo-street-level.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:292f503ebbd786d87c44ad2a98ef5458bef582134c59c34ae5cfd24331268ba6 +size 1932918 diff --git a/Screenshots/review-00-overview.png b/Screenshots/review-00-overview.png deleted file mode 100644 index b7f641c..0000000 --- a/Screenshots/review-00-overview.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d1505cbc55946c31921d720aa37d9611306f8f224f312bcaa44c9be20fb51f8f -size 2431032 diff --git a/Screenshots/review-01-character.png b/Screenshots/review-01-character.png deleted file mode 100644 index c6cf80d..0000000 --- a/Screenshots/review-01-character.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b561fc09da1d609f36627d7253ee57392709365d87e991e0478e94aa25351729 -size 2474855 diff --git a/Screenshots/review-02-scale-cubes.png b/Screenshots/review-02-scale-cubes.png deleted file mode 100644 index 69ced52..0000000 --- a/Screenshots/review-02-scale-cubes.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:23a344b379225dbb047dd06199a679b7bc28694ceba34b1985253954fd488c07 -size 1909809 diff --git a/Screenshots/review-03-player-placement.png b/Screenshots/review-03-player-placement.png deleted file mode 100644 index 5a0eb52..0000000 --- a/Screenshots/review-03-player-placement.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9d94797297707283f7c541cd7191bf33dc1e3def84dd5562204041c971ffb090 -size 1964632 diff --git a/Screenshots/review-04-ground-contact.png b/Screenshots/review-04-ground-contact.png deleted file mode 100644 index 89886d5..0000000 --- a/Screenshots/review-04-ground-contact.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c7d8ef949f148f1f076c36377ffd606f83dacec44423ce901337b8ac83f9516f -size 1839543 diff --git a/Screenshots/review-05-shadow-compare.png b/Screenshots/review-05-shadow-compare.png deleted file mode 100644 index d348422..0000000 --- a/Screenshots/review-05-shadow-compare.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:306ec54dab6ed6498fc401024a57ada32903baaa357b62d033911db8c3fdd64a -size 1672855 diff --git a/Screenshots/review-06-hero-portals.png b/Screenshots/review-06-hero-portals.png deleted file mode 100644 index 0794217..0000000 --- a/Screenshots/review-06-hero-portals.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6ab647c7cce9db83a79875b8eaa42205f4468ff957a59c67e90fb4b4e133ddd3 -size 1752976 diff --git a/Screenshots/review-07-hero-facade-front.png b/Screenshots/review-07-hero-facade-front.png deleted file mode 100644 index 45cb56f..0000000 --- a/Screenshots/review-07-hero-facade-front.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ccf12d909e095f113f655df87efa3bf27f5fe05a547e5647590ecb3bcbbc27a7 -size 2048644 diff --git a/Screenshots/review-08-hero-facade-oblique.png b/Screenshots/review-08-hero-facade-oblique.png deleted file mode 100644 index 5f87c2c..0000000 --- a/Screenshots/review-08-hero-facade-oblique.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6cf0d70b3a5e8ea97e1f77b56b38e4f73a47b909c2bdf4bf64cd981d998ed3bf -size 1924852 diff --git a/Screenshots/review-character.png b/Screenshots/review-character.png new file mode 100644 index 0000000..dfb05f8 --- /dev/null +++ b/Screenshots/review-character.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4f7e7731e6228ba7954947545a02066e415989a8bf2aab96c4113891a78221d7 +size 2202483 diff --git a/Screenshots/review-ground-contact.png b/Screenshots/review-ground-contact.png new file mode 100644 index 0000000..516451f --- /dev/null +++ b/Screenshots/review-ground-contact.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3c20c78e6c9a109dea7e0aafd0ec9cfe799ca5cf5961398c3a369481ac675af2 +size 1705468 diff --git a/Screenshots/review-hero-facade-front.png b/Screenshots/review-hero-facade-front.png new file mode 100644 index 0000000..e267105 --- /dev/null +++ b/Screenshots/review-hero-facade-front.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3369c4eccf8902a9e84056b0fe419735b29983d08ae26ba112374cf601c15df0 +size 2304244 diff --git a/Screenshots/review-hero-facade-oblique.png b/Screenshots/review-hero-facade-oblique.png new file mode 100644 index 0000000..3a7cee3 --- /dev/null +++ b/Screenshots/review-hero-facade-oblique.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a77f2f03eee7a351713937387cdb2dafe590e607f3960c18c31d600d2f9c7d47 +size 2404004 diff --git a/Screenshots/review-hero-portals.png b/Screenshots/review-hero-portals.png new file mode 100644 index 0000000..5db95d1 --- /dev/null +++ b/Screenshots/review-hero-portals.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f5c65c6f974a5ef490a0da4a36fd8d237211d3efa0540040eb0ef3bca4a7d137 +size 1794383 diff --git a/Screenshots/review-npc-prefab.png b/Screenshots/review-npc-prefab.png new file mode 100644 index 0000000..42230dd --- /dev/null +++ b/Screenshots/review-npc-prefab.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1a52cf51af9cfb70e788c0e6d81cb33737380bc8c3adb4f72a9c8c2ef9aa74f5 +size 1660515 diff --git a/Screenshots/review-overview.png b/Screenshots/review-overview.png new file mode 100644 index 0000000..9a2acc1 --- /dev/null +++ b/Screenshots/review-overview.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:068f9cd7209a02f9e6e1f6c6babfefa43507992600eb7086fbea9792367bb379 +size 2127805 diff --git a/Screenshots/review-player-placement.png b/Screenshots/review-player-placement.png new file mode 100644 index 0000000..a256838 --- /dev/null +++ b/Screenshots/review-player-placement.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9b766e74af88547fe201766bc118bbea70b478e9f7ff9f9ac4251343bd39fb8e +size 1847345 diff --git a/Screenshots/review-scale-cubes.png b/Screenshots/review-scale-cubes.png new file mode 100644 index 0000000..f6cf6ae --- /dev/null +++ b/Screenshots/review-scale-cubes.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a0c2a93e30216c76e7db5ad28ce9b0e580cfcd8c269b1494cdc65b6ce57b788a +size 2066648 diff --git a/Screenshots/review-shadow-compare.png b/Screenshots/review-shadow-compare.png new file mode 100644 index 0000000..cb38caa --- /dev/null +++ b/Screenshots/review-shadow-compare.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e708d4d8b765ec270b57af26a1134ccd7fcc34d55123634599a316d8dc9d4327 +size 2052859 diff --git a/TODO.md b/TODO.md index 784e07f..ef1f9e2 100644 --- a/TODO.md +++ b/TODO.md @@ -61,11 +61,11 @@ Owner: this session. Scope: the review scene used for all visual approval — th - [x] Put the character on the ground rather than floating. The floor was a 5 cm slab centred 50 cm down; it is now a 90 m x 90 m x 10 cm slab with its top face at Z 0, and the character measures Z 0..83 cm — feet on the plane (`Screenshots/README.md`). - [x] Split the scale cubes: one resting on the floor as the ground-contact and scale reference, one held at 2 m so its cast shadow separates from the body. - [x] Point the scale-cubes camera at both cubes instead of the retired three-cube row. -- [x] **Character placement shot**: `review-03-player-placement` shows the pawn (`AGigLineCharacter`) staged by `Tools/ue_build_review_map.py` with a cube behind it. Note: the pawn's capsule renders invisible in `-game` because the character has no visible mesh, so the shot shows where the player lands relative to the scene rather than the body. -- [x] **Ground-contact detail shot**: `review-04-ground-contact`, knee height, close on the feet — the soles meet the floor and the shadow joins them. -- [x] **Shadow-comparison detail shot**: `review-05-shadow-compare`, both cubes in one frame from a low angle; the floating cube's shadow is detached, the grounded one's touches. -- [x] **Detail shot of the hero façade portals**: `review-06-hero-portals` from 8 m at eye height now fills the frame with all three doorways. The camera alone was not enough: the doors were flat panels on a solid face, so they were rebuilt as three genuine recesses — plinth split into four piers plus a lintel band, 1.2 m reveal, stone jambs and lintels standing 0.10 m proud, three mullions each. Facade bounds are now exactly Z 0..14.50 m; a jamb overhang had been sinking the model 0.15 m into the ground. -- [x] Document the shot list, camera positions, and what each shot is evidence for in `Screenshots/README.md`; nine shots, each with an approval line. +- [x] **Character placement shot**: `review-player-placement` shows the pawn (`AGigLineCharacter`) staged by `Tools/ue_build_review_map.py` with a cube behind it. Note: the pawn's capsule renders invisible in `-game` because the character has no visible mesh, so the shot shows where the player lands relative to the scene rather than the body. +- [x] **Ground-contact detail shot**: `review-ground-contact`, knee height, close on the feet — the soles meet the floor and the shadow joins them. +- [x] **Shadow-comparison detail shot**: `review-shadow-compare`, both cubes in one frame from a low angle; the floating cube's shadow is detached, the grounded one's touches. +- [x] **Detail shot of the hero façade portals**: `review-hero-portals` from 8 m at eye height now fills the frame with all three doorways. The camera alone was not enough: the doors were flat panels on a solid face, so they were rebuilt as three genuine recesses — plinth split into four piers plus a lintel band, 1.2 m reveal, stone jambs and lintels standing 0.10 m proud, three mullions each. Facade bounds are now exactly Z 0..14.50 m; a jamb overhang had been sinking the model 0.15 m into the ground. +- [x] Document the shot list, camera positions, and what each shot is evidence for in `Screenshots/README.md`; shots use stable names with an approval line (10 review + 4 demo). - [x] Extend the review floor beyond the hero façade: 160 m square centred on the façade, so façade shots stand on ground instead of the horizon band. - [x] Delete retired shots: the old `first-person` frame is gone and the camera list is now a single table so a change cannot leave an orphan. @@ -75,14 +75,15 @@ The MPFB character asset is planned as the NPC template (see `ROADMAP.md`). Keep - [x] Give the MPFB character asset a standing idle pose so review and NPC shots show a person, not an A-pose bind. Done: `Tools/mpfb_character_export.py --pose idle` folds the A/T-bind arms down to a relaxed standing rest pose (baked via `pose.armature_apply` before export; `upperarm01.L` rest z −0.71 → −1.91 rad), re-exported, re-imported (138 bones), rendered in `review-01-character`. - [x] Bake a second skin tone or clothing layer, so the character does not read as a grey mannequin in shots. Done: the v2-skin bake came out **black** and slow at 1024², so we synthesize a warm skin-tone diffuse directly (`Tools/mpfb_character_export.py` `make_diffuse`, with a darker shorts-suggestive bottom band) via a stdlib/numpy PNG writer. Character reads warm, not grey. Screenshot approved (`Screenshots/review-01-character`). -- [ ] (open) Keep the character as a reusable NPC prefab: a visible body, a collision capsule, and a head-height check that the camera does not clip at 1.60 m — for when NPCs/pedestrians are wired in (`0.2.0+`), not the `0.1.0` player. +- [x] Keep the character as a reusable NPC prefab: a visible body, a collision capsule, and a head-height check that the camera does not clip at 1.60 m — for when NPCs/pedestrians are wired in (`0.2.0+`), not the `0.1.0` player. Done 2026-11-07: `AGigLineNPCPerson` (C++), ACharacter with capsule half-height 83 cm / total 1.66 m (head at ~1.66 m, so a 1.60 m camera does not clip), the MPFB human on the built-in mesh as the visible body, `AutoPossessAI` for pedestrians; confirmed spawned feet-on-Z-0 and rendered in `Screenshots/review-npc-prefab` (☐ pending approval). +- [x] Screenshots use stable camera names (no index prefix), so inserting a shot no longer renumbers/ orphans files; `AGigLineShotActor` + `Screenshots/README.md` updated. ### Asset production - [x] Establish a consistent scale test, named export presets, and repeatable import settings. Scale test = the three-cube calibration scene (`Art/blender/scaletest/`, regenerable via `Tools/scale_test_export.py`); named export preset `ue_metric_v1` (FBX settings in that script); named import preset `ue_metric_v1` (`FbxImportUI` settings in `Tools/ue_scale_test_import.py`). Both scripts are the templates for production asset export/import. - [-] Collect reference photography for manual façade work. Local only, never committed: `Art/reference/` is gitignored. **72 images in eleven folders**: hero façades to 4k, the El Capitan Theatre exterior series, premiere-night staging, Ovation Hollywood, the north side, and the Lee Drug neighbour. Gaps largely closed by the Flickr/web-search pass: the hero entrance is now documented (three portals with individual short flights — the inherited "eight steps, 12 m wide" is overturned), and the 6806–6822 retail run appears in an oblique 2013 frame. Still missing: a clean isolated frame of the door recess and a night frame of 6840 itself. - [x] Download reference photography for the two north-side buildings inside the 50 m buffer — TCL Chinese Theatre (OSM way 424105908, 6925 Hollywood Blvd) and Madame Tussaud's (way 424105889, 6933 Hollywood Blvd). Done 2026-11-06 with `Tools/commons_fetch.py` against the Wikimedia Commons API: eleven frames in the local `Art/reference/north-chinese/` and `Art/reference/north-tussauds/`, provenance in each `sidecar.json`, nothing committed. -- [x] Model hero façade for the El Capitan Entertainment Centre site. **Second pass built 2026-11-07** (proportions recalibrated from the 2009 photograph: entablature 3.4 m, parapet 2.2 m, architrave and cornice bands, square pedestals — the first pass had 5.7 m of blank wall above the capitals and read as a warehouse). **First pass built 2026-11-07** (`Tools/hero_facade_build.py` → `Art/blender/hero/hero-facade-2026-11-07.blend` + JSON part report with evidence per part → `Tools/ue_hero_facade_import.py` → `/Game/Hollywood/ElCapitan/SM_HeroFacade`, 1892 tris, 4 materials, placed on the measured building line). Six columns at 4.96 m over the 25.75 m frontage, plinth, three portal flights (5 risers, not the old 8), entablature 2.2 m, parapet 1.6 m with motto band and medallions. **Screenshot approved** (`Screenshots/review-06` portals, `review-07/08` facade). Next pass: banner and window placement, then materials. +- [x] Model hero façade for the El Capitan Entertainment Centre site. **Second pass built 2026-11-07** (proportions recalibrated from the 2009 photograph: entablature 3.4 m, parapet 2.2 m, architrave and cornice bands, square pedestals — the first pass had 5.7 m of blank wall above the capitals and read as a warehouse). **First pass built 2026-11-07** (`Tools/hero_facade_build.py` → `Art/blender/hero/hero-facade-2026-11-07.blend` + JSON part report with evidence per part → `Tools/ue_hero_facade_import.py` → `/Game/Hollywood/ElCapitan/SM_HeroFacade`, 1892 tris, 4 materials, placed on the measured building line). Six columns at 4.96 m over the 25.75 m frontage, plinth, three portal flights (5 risers, not the old 8), entablature 2.2 m, parapet 1.6 m with motto band and medallions. **Screenshot approved** (`Screenshots/review-hero-portals`, `review-hero-facade-front/oblique`). Next pass: banner and window placement, then materials. - [ ] Model surrounding block frontage. - [x] Model simplified background buildings directly across Hollywood Boulevard. Done 2026-11-07, the two in-scope north-side buildings — TCL Chinese Theatre (SM_TCL_Chinese_Theatre) and Madame Tussaud's (SM_Madame_Tussauds) — taken from the verified OSM blockout volumes and exported with `ue_metric_v1`, with a Y-mirror so they land north of Hollywood Blvd across the street from the hero (TCL spans Unreal Y 1802..9431, Tussaud's 1888..7586; road centreline ≈ 0, hero façade at Y −1450). Staged in the DemoMap as `North_TCL_Chinese` / `North_Madame_Tussauds`; demo shot `review-03-demo-north-buildings` captured. Simple flat facade materials (surfaces are the `0.1.4` patch). - [-] Build sidewalks, roads, and collision meshes. Terrain, road, sidewalks and kerbs exist (`Art/blender/terrain/`, `street/`) and are assembled in `site/site-2026-11-06.blend`; collision and details (crossing markings, kerb radii, aprons) are not built. Ground must follow the DEM: 3.94 m fall along the block, ~2 % crown between the gutters at ±10–11 m from the centreline, north sidewalk higher than south. Kerb height is an unresolved assumption — the DEM does not resolve it (`Geo/verification/2026-11-06-cross-sections.md`). @@ -174,7 +175,7 @@ Suggested blender skills: **procedural-modeling** + **geometry-nodes** (the faç - [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`. -- [ ] 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. +- [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. - [ ] Create basic idle/walk animation set. - [ ] Verify animation plays correctly on the imported rig. @@ -293,7 +294,7 @@ Suggested blender skills: **procedural-modeling** + **geometry-nodes** (the faç ### Simulation -- [ ] Add pedestrian characters with navigation, reusing the idle-pose character asset as the NPC prefab (`/Game/Test/Character`). +- [ ] Add pedestrian characters with navigation, using `AGigLineNPCPerson` (the reusable NPC prefab) as the base, driving it via AI/`AutoPossessAI`. - [ ] Implement crosswalk behavior (pedestrians use the designated crossing). - [ ] Add limited ambient traffic on the street network. - [ ] Optimize simulation cost to stay within frame budget. diff --git a/Tools/ue_build_review_map.py b/Tools/ue_build_review_map.py index 475846d..168fc5b 100644 --- a/Tools/ue_build_review_map.py +++ b/Tools/ue_build_review_map.py @@ -25,6 +25,20 @@ def log(msg): lines.append(str(msg)) +def ensure_writable(path): + # A packed .umap left read-only (git sets 644->444 on checkout, or the + # editor re-flags it) makes save_map silently return False with no error. + # chmod u+w it so the staged camera list and actors actually persist. + p = os.path.join(unreal.Paths.project_dir(), path.replace("/Game/", "Content/")) + try: + mode = os.stat(p).st_mode & 0o777 + if mode & 0o200 == 0: + os.chmod(p, 0o644) + log(f"map writable: chmod u+w {p} (was {oct(mode)})") + except FileNotFoundError: + pass + + def spawn(cls, loc, label=None, scale=None, rot=None): a = unreal.EditorLevelLibrary.spawn_actor_from_class(cls, loc) if a is None: @@ -149,6 +163,18 @@ try: else: log("MISSING: /Script/GigLine.GigLineCharacter") + # --- NPC prefab ----------------------------------------------------------- + # The reusable NPC person: a collision capsule + visible MPFB body, standing + # feet on Z 0, placed clear of the pawn so the prefab reads on its own. + npc = None + npc_class = unreal.load_class(None, "/Script/GigLine.GigLineNPCPerson") + if npc_class: + npc = spawn(npc_class, unreal.Vector(-4500, 300, 0), "NPC_Person") + if npc: + log("staged: NPC_Person (AGigLineNPCPerson) at Z 0") + else: + log("MISSING: /Script/GigLine.GigLineNPCPerson") + # --- camera list --------------------------------------------------------- # Every camera is a (name, location, target) triple; the look-at rotation is # computed from the pair so a camera cannot drift out of aim when one number @@ -162,6 +188,9 @@ try: ("scale-cubes", unreal.Vector(0, -900, 200), unreal.Vector(0, 600, 80)), # the pawn the game spawns, with the grounded cube beside it ("player-placement", unreal.Vector(320, -520, 140), unreal.Vector(0, 0, 80)), + # the NPC prefab: capsule + visible body, feet on Z 0, at double scale + # distance because it stands off to the west of the main staging + ("npc-prefab", unreal.Vector(-4200, 600, 160), unreal.Vector(-4500, 300, 90)), # low, close on feet and cube base: ground contact must be obvious ("ground-contact", unreal.Vector(180, -260, 35), unreal.Vector(0, 40, 20)), # shadow comparison, low angle so both shadows read @@ -214,6 +243,7 @@ try: # quit after the demo shots so a dedicated DemoMap capture run # terminates cleanly (render_screenshots.sh runs both maps). seq.set_editor_property("quit_when_done", True) + ensure_writable("/Game/Hollywood/DemoMap") saved = unreal.EditorLoadingAndSavingUtils.save_map( unreal.EditorLevelLibrary.get_editor_world(), "/Game/Hollywood/DemoMap") log(f"demo map staged: {len(demo_shots)} cameras, save {saved}") @@ -239,6 +269,7 @@ except Exception as exc: # noqa # --- save -------------------------------------------------------------------- try: + ensure_writable(MAP_PATH) world = unreal.EditorLevelLibrary.get_editor_world() saved = unreal.EditorLoadingAndSavingUtils.save_map(world, MAP_PATH) log(f"save_map {MAP_PATH}: {saved}")