diff --git a/Game/GigLine/Content/Hollywood/DemoMap.umap b/Game/GigLine/Content/Hollywood/DemoMap.umap index b3426fd..460d86f 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:db7e2632a0e5c75d7722f0aab9f727a931fed942c0ee870892da02c2e4c79710 +oid sha256:5a3c68632e916cab692d991b550855054822cb0196c3f69be337c42ccbc5d60c size 44952 diff --git a/Game/GigLine/Content/Test/ReviewMap.umap b/Game/GigLine/Content/Test/ReviewMap.umap index 5fee868..f416a72 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:ed3baf3965562bea42fd99f8a47438491d86b383a77a0620c592a5964197c198 +oid sha256:0b60d901d3cdc13183eac08749faf028dc532c3f1da1a03d7aba8f2111d63c11 size 28715 diff --git a/Game/GigLine/Source/GigLine/GigLineGameModeBase.cpp b/Game/GigLine/Source/GigLine/GigLineGameModeBase.cpp index 437ce07..712292d 100644 --- a/Game/GigLine/Source/GigLine/GigLineGameModeBase.cpp +++ b/Game/GigLine/Source/GigLine/GigLineGameModeBase.cpp @@ -1,8 +1,11 @@ #include "GigLineGameModeBase.h" #include "GigLineCharacter.h" +#include "GigLineHUD.h" AGigLineGameModeBase::AGigLineGameModeBase() { DefaultPawnClass = AGigLineCharacter::StaticClass(); + // ODbL attribution must be visible in the running demo, not only in docs. + HUDClass = AGigLineHUD::StaticClass(); } diff --git a/Game/GigLine/Source/GigLine/GigLineHUD.cpp b/Game/GigLine/Source/GigLine/GigLineHUD.cpp new file mode 100644 index 0000000..5dfcd64 --- /dev/null +++ b/Game/GigLine/Source/GigLine/GigLineHUD.cpp @@ -0,0 +1,29 @@ +#include "GigLineHUD.h" + +#include "Engine/Canvas.h" +#include "Engine/Engine.h" + +void AGigLineHUD::DrawHUD() +{ + Super::DrawHUD(); + + if (!Canvas || AttributionLine.IsEmpty()) + { + return; + } + + // Bottom-left, above any letterbox: the standard place for map/data credits. + const float LineHeight = Canvas->ClipY > 0 ? 22.0f * TextScale : 22.0f * TextScale; + const float X = MarginPx; + const float Y = Canvas->ClipY - MarginPx - LineHeight * 2.1f; + + const FLinearColor Shadow(0.0f, 0.0f, 0.0f, 0.55f); + const FLinearColor Ink(1.0f, 1.0f, 1.0f, 0.92f); + + // Shadow pass for legibility over bright pavement and sky. + DrawText(AttributionLine, Shadow, X + 1.0f, Y + 1.0f, nullptr, TextScale); + DrawText(LicenceLine, Shadow, X + 1.0f, Y + LineHeight + 1.0f, nullptr, TextScale * 0.82f); + + DrawText(AttributionLine, Ink, X, Y, nullptr, TextScale); + DrawText(LicenceLine, Ink, X, Y + LineHeight, nullptr, TextScale * 0.82f); +} diff --git a/Game/GigLine/Source/GigLine/GigLineHUD.h b/Game/GigLine/Source/GigLine/GigLineHUD.h new file mode 100644 index 0000000..61d2c4d --- /dev/null +++ b/Game/GigLine/Source/GigLine/GigLineHUD.h @@ -0,0 +1,42 @@ +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/HUD.h" +#include "GigLineHUD.generated.h" + +/** + * Always-on geographic attribution for the shipped demo. + * + * The demo is built from OpenStreetMap data, which is ODbL 1.0 licensed and + * requires attribution wherever a derived database or produced work is shown. + * This HUD draws the required credit in the bottom-left corner of the screen so + * it is present in the game, not only in the repository documents. + * + * Plain AHUD::DrawText is used deliberately: no UMG widget asset is needed, so + * the attribution cannot be accidentally dropped from a cook by a missing + * widget reference. + */ +UCLASS() +class GIGLINE_API AGigLineHUD : public AHUD +{ + GENERATED_BODY() + +public: + virtual void DrawHUD() override; + + /** Main credit line. Must match the ODbL attribution requirement. */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Attribution") + FString AttributionLine = TEXT("\u00A9 OpenStreetMap contributors"); + + /** Licence line, including where the licence can be read. */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Attribution") + FString LicenceLine = TEXT("Data \u00A9 OpenStreetMap contributors, ODbL 1.0 \u2014 openstreetmap.org/copyright"); + + /** Screen-space margin in pixels. */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Attribution") + float MarginPx = 18.0f; + + /** Text scale relative to the default canvas font. */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Attribution") + float TextScale = 1.45f; +}; diff --git a/Game/GigLine/Source/GigLine/GigLineShotActor.cpp b/Game/GigLine/Source/GigLine/GigLineShotActor.cpp index 290cd4a..d8d819a 100644 --- a/Game/GigLine/Source/GigLine/GigLineShotActor.cpp +++ b/Game/GigLine/Source/GigLine/GigLineShotActor.cpp @@ -34,7 +34,7 @@ void AGigLineShotActor::Tick(float DeltaSeconds) : 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); + FScreenshotRequest::RequestScreenshot(FileName, /*bInShowUI=*/true, false); bWaitingForScreenshot = true; } return; diff --git a/Screenshots/README.md b/Screenshots/README.md index 29723f5..411d572 100644 --- a/Screenshots/README.md +++ b/Screenshots/README.md @@ -56,6 +56,11 @@ All ☑ approved 2026-11-07. FBX → Unreal import. - **Lighting is dynamic-only** (`r.AllowStaticLighting=False`, all lights Movable), so no lighting build is ever required. +- **Attribution overlay**: every shot carries the required ODbL credit in the + bottom-left (`© OpenStreetMap contributors` / `Data © OpenStreetMap + contributors, ODbL 1.0 — openstreetmap.org/copyright`), drawn by + `AGigLineHUD`. Screenshots are requested with the UI shown so the obligation + is visible in review. ## What to look for diff --git a/Screenshots/demo/review-demo-crossing.png b/Screenshots/demo/review-demo-crossing.png index ae841f7..3a11a09 100644 --- a/Screenshots/demo/review-demo-crossing.png +++ b/Screenshots/demo/review-demo-crossing.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7f70435845fa5e34a04ba2e3ca193b54db655791076e8cb80d88546ada3af143 -size 1570518 +oid sha256:c653c408d41483f37ad1801da5b25896a7b55c4b685abf42cd5d396c32472767 +size 1588910 diff --git a/Screenshots/demo/review-demo-north-buildings.png b/Screenshots/demo/review-demo-north-buildings.png index 515855f..ebf9fa2 100644 --- a/Screenshots/demo/review-demo-north-buildings.png +++ b/Screenshots/demo/review-demo-north-buildings.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:807dc31930ffcbcf3c2449f34eb731a7694c8142afe0252666425cb7d385caa8 -size 1536544 +oid sha256:2155329bab55bcbbb507c78a6fe6246a8d5968769fc12d70d5d28f7ca7b5bafe +size 1551804 diff --git a/Screenshots/demo/review-demo-spawn-view.png b/Screenshots/demo/review-demo-spawn-view.png index 81376d8..9805d4e 100644 --- a/Screenshots/demo/review-demo-spawn-view.png +++ b/Screenshots/demo/review-demo-spawn-view.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5970fb86c28990883a15745305f1a1ca4419b8c5a450dbe3fb39e6f24b19f59d -size 1587231 +oid sha256:d0f73699a0557705cab7cc08cb8563dfbc815b2412437f842a989eade31afb95 +size 1608333 diff --git a/Screenshots/demo/review-demo-street-level.png b/Screenshots/demo/review-demo-street-level.png index 6c21f6a..3291657 100644 --- a/Screenshots/demo/review-demo-street-level.png +++ b/Screenshots/demo/review-demo-street-level.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0214e624ebacd17c430cada10a4446c1977a17a380d54e720a48bbb8babc5ac0 -size 1763767 +oid sha256:06ebb28aa6276bf73488bd29fa2b3c6b9768fd5fdeccf449b9053a7482574b6a +size 1782195 diff --git a/Screenshots/review-character.png b/Screenshots/review-character.png index 7fb4c72..dde1aeb 100644 --- a/Screenshots/review-character.png +++ b/Screenshots/review-character.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:806dba0d9bf0ee00d4174d0834babcd2bfa83b4c2132955565ff2759b555b337 -size 2519676 +oid sha256:e3263c3e03689deff30963c8ba87b12db86e9e9144c980ea161d56719c189fbe +size 2281114 diff --git a/Screenshots/review-ground-contact.png b/Screenshots/review-ground-contact.png index 23b215c..27d23dd 100644 --- a/Screenshots/review-ground-contact.png +++ b/Screenshots/review-ground-contact.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c7b403af87a3f50a394bcfd7d997b714553c1580912cffa5bc868b4503104d01 -size 1729770 +oid sha256:a8d2ce6def7b696a6bf0a17ad9b7b83df8830b47272d940b3aafe2e5d0866cc5 +size 1941667 diff --git a/Screenshots/review-hero-facade-front.png b/Screenshots/review-hero-facade-front.png index f73dbf5..286ab15 100644 --- a/Screenshots/review-hero-facade-front.png +++ b/Screenshots/review-hero-facade-front.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:da3ac44e5fd1bf0f9c0675e7582014b871f5ec2ea74543fed201d686c1d307dd -size 2075675 +oid sha256:0e692691c25c96a303058f1c602f40c20399d8e722cfe7c2c603de37ef82d9a8 +size 2081796 diff --git a/Screenshots/review-hero-facade-oblique.png b/Screenshots/review-hero-facade-oblique.png index 1f39b90..6286615 100644 --- a/Screenshots/review-hero-facade-oblique.png +++ b/Screenshots/review-hero-facade-oblique.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:81cab701b528d7ad97225384d966c8282c6e2b3c22ad90e37a3fac4b72473ca5 -size 1939088 +oid sha256:43dc46936a78cfaddc9de96e54176ee9bd5c4f437d577adfa1c8fb4fe7fe9131 +size 1966305 diff --git a/Screenshots/review-hero-portals.png b/Screenshots/review-hero-portals.png index 6863b08..533a332 100644 --- a/Screenshots/review-hero-portals.png +++ b/Screenshots/review-hero-portals.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:29a42347337c797a696b795f594d7eebc58c51a3258cd1726bce0475d3b3ebcc -size 1757866 +oid sha256:abf01a465d1a7bf67548c3218a0621259d2ed667c4c23dd9bab54b5990377c74 +size 1901906 diff --git a/Screenshots/review-npc-prefab.png b/Screenshots/review-npc-prefab.png index d874e8d..e366649 100644 --- a/Screenshots/review-npc-prefab.png +++ b/Screenshots/review-npc-prefab.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1cbd2acd364eb35a5802393d5d3f94036948a054020c2c9e967f5c2153ee3792 -size 1722019 +oid sha256:0bda1773d8ec4b16f7cb9ca546c7806913186445cccdc79d9fde5536a8484c52 +size 1908365 diff --git a/Screenshots/review-overview.png b/Screenshots/review-overview.png index 7839f02..6e5b3e0 100644 --- a/Screenshots/review-overview.png +++ b/Screenshots/review-overview.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:91b3c428b7118df3ff9d11d0b114130b7380c6fa49834f8bac6eb9747a9e5f15 -size 3164110 +oid sha256:9d7c9d86a752e4b9b61427d1f95aed0e11e02ce5031de0e0a8428e6620693831 +size 2621180 diff --git a/Screenshots/review-player-placement.png b/Screenshots/review-player-placement.png index 3ff2e11..6a37d2d 100644 --- a/Screenshots/review-player-placement.png +++ b/Screenshots/review-player-placement.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:836ddf77b91575b61eb54d11981a0d6b8fad6e0ff82e54143d863e48b906921d -size 2009205 +oid sha256:a3a43c0786c7f458850041ae519633210fe22e9603e8ab34301a3dd0103f955d +size 2049465 diff --git a/Screenshots/review-scale-cubes.png b/Screenshots/review-scale-cubes.png index ce4f357..8412d14 100644 --- a/Screenshots/review-scale-cubes.png +++ b/Screenshots/review-scale-cubes.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:07f91984000f49c7960e87829fac422351942ddda08b56f47a2addeb428f08f3 -size 2027852 +oid sha256:8db5324138e9e9ad0ca9c0fd0c03d73cb9274f40f889e9fdf27f364912b1ec54 +size 2100021 diff --git a/Screenshots/review-shadow-compare.png b/Screenshots/review-shadow-compare.png index 9aeac8d..26ed002 100644 --- a/Screenshots/review-shadow-compare.png +++ b/Screenshots/review-shadow-compare.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:aa8b21c253851de43194647be76a5c8bd69fdda315a1f163f7f16566c45e1a62 -size 1684025 +oid sha256:81fbf6b9a504e125f7e990cd0be9c54ec31b117ddf8cc14a0461765e5d03f72c +size 1931209 diff --git a/THIRD_PARTY_NOTICES.md b/THIRD_PARTY_NOTICES.md index bc532cb..529745f 100644 --- a/THIRD_PARTY_NOTICES.md +++ b/THIRD_PARTY_NOTICES.md @@ -25,6 +25,8 @@ Status values: **verified** (licence confirmed and permits our use), **pending** Attribution string for any OSM-derived output: "© OpenStreetMap contributors", . The data is available under the [Open Database License 1.0](https://opendatacommons.org/licenses/odbl/1-0/). +This attribution is **displayed in the running game**, not only in this document: `AGigLineHUD` (`Game/GigLine/Source/GigLine/GigLineHUD.cpp`) draws the credit and the licence URL in the bottom-left of every frame, so the obligation is met by the shipped build. It is visible in every capture under `Screenshots/` because the screenshot actor requests screenshots with the UI shown. + ## Reference photography (local only, not committed, not shipped) Reference photographs are **not** part of this repository. They live in the gitignored `Art/reference/` tree on the development machine, are used only for internal, private development, and are never built into a build or shipped. `.gitignore` enforces this; nothing under `Art/reference/` may be added, staged, or committed. diff --git a/TODO.md b/TODO.md index d99ca13..3017311 100644 --- a/TODO.md +++ b/TODO.md @@ -89,14 +89,14 @@ The MPFB character asset is planned as the NPC template (see `ROADMAP.md`). Keep - [A] 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`). - [ ] Materials and look development for all exported assets. -### Gameplay - active - 01a1b26b-3c94-707f-9665-2f6b4a79b564 (branch `gameplay-lighting-0.1.0`) +### Gameplay - active - 01a1b26b-3c94-707f-9665-2f6b4a79b564 (branch `gameplay-attribution-0.1.0`) - [x] First-person movement, mouse look, and Enhanced Input bindings. Implemented 2026-11-07: `AGigLineCharacter` (C++, 1.75 m capsule, 1.60 m eye camera, 4 m/s walk, mouse look in deg/s, jump) as the default pawn, with five actions and an 11-entry context in `/Game/Input` built by `Tools/ue_create_input_assets.py`. **Not yet confirmed interactively** — launch PIE on `Test/ReviewMap` and walk. Screenshot review pending (`Screenshots/README.md`). - [D] Collision, reset, and pause functionality. Reset (**R**) and pause (**Escape**, a real game pause that releases the cursor) are implemented in `AGigLineCharacter` with `/Game/Input/IA_Reset` and `IA_Pause`. Collision now exists — terrain, road and sidewalks import as complex-as-simple, so a simple hull cannot ramp over the kerbs. **Not verified by hand**: walk, reset and pause need a human at the keyboard. No pause menu widget yet, only the pause itself. - [x] Build the walkable demo level: terrain, street, and hero facade assembled into one map with a start point on the north sidewalk, so the demo is something a player can walk rather than a review staging. **Built 2026-11-07** by `Tools/ue_build_demo_map.py` → `/Game/Hollywood/DemoMap`: sun/sky, `Hero_Facade`, six site meshes imported with collision (`Terrain_DEM`, `Road_Hollywood`, both sidewalks and both kerbs), and a `Demo_PlayerStart` on the north sidewalk 20 m back from the frontage. Demo views in `Screenshots/demo/` re-rendered and ☑ approved 2026-11-07. - [x] Walkable sidewalks and a designated street crossing. Crossing chosen: mid-block signalised crossing, OSM way 385648319, at 130 m along the block (`Geo/verification/2026-11-06-street-profile.md`). Done 2026-11-07: continental zebra markings (0.5 m bars / 0.5 m gaps, 3 m band) at all three signalised crossings, no collision on the paint; kerbs were already flushed at the crossings. Enablers found on the way: the street surfaces were 100 % down-facing (invisible in engine) — winding flipped; the terrain buried the street — 10.7 m corridor cut around the centreline (sidewalks cover the transition, walk-check 0 holes); LFS-lockable `.blend`/`.umap` check out read-only — builders now chmod before saving and fail loudly. Screenshot ☑ approved 2026-11-07 (`Screenshots/demo/review-demo-crossing`); the corridor renders near-black in shadow — that was the **Fixed daytime lighting** item, now also done. - [x] Fixed daytime lighting and basic ambience. **Done 2026-11-07, screenshots approved.** Demo map now has a fixed daytime rig in `Tools/ue_build_demo_map.py`: sun pitch −50 / yaw 120 (intensity 4, warm 255/245/230, atmosphere sun light), sky light 2.6 with real-time capture, sky atmosphere, height fog (density 0.008), and a manual-exposure post-process volume (min = max brightness 1.0) so a shot cannot wash out or crush to black. Two root causes found while doing it: (a) **Blender flat diffuse colours do not survive the FBX→UE import** — every site mesh arrived white and the terrain arrived with `WorldGridMaterial`, which is what actually made the scene look blown out; explicit `M_Asphalt` / `M_Concrete` / `M_Ground` / `M_RoadPaint` materials are now created and assigned in the demo builder. (b) only **one of the three crossings** was reaching the game: each band was its own object and Blender renamed the duplicates `.001`/`.002`, which site assembly skips; all bands are now one `Crossing_Markings` object. Demo cameras also fixed: street-level sat inside the façade body, and the crossing camera aimed at the wrong crossing (s=36.6 instead of the designated s=130.1 at UE X −14956). Lighting is dynamic-only (`r.AllowStaticLighting=False`, all lights Movable) so the editor's "LIGHTING NEEDS TO BE REBUILT" warning no longer fires. All four demo views approved by the owner. -- [ ] Geographic attribution display ("© OpenStreetMap contributors" + license link). +- [x] Geographic attribution display ("© OpenStreetMap contributors" + license link). Done 2026-11-07: `AGigLineHUD` (C++) draws the credit line and the licence URL (`© OpenStreetMap contributors` / `Data © OpenStreetMap contributors, ODbL 1.0 — openstreetmap.org/copyright`) in the bottom-left of every frame, wired through `AGigLineGameModeBase::HUDClass`. It is a plain `AHUD::DrawText`, so no UMG widget asset can be dropped from a cook. `AGigLineShotActor` now requests screenshots with the UI shown, so the attribution is visible in every image under `Screenshots/` and the obligation is provable, not just documented. ### Repository publication @@ -104,7 +104,7 @@ The MPFB character asset is planned as the NPC template (see `ROADMAP.md`). Keep - [x] Scan all reachable Git history and the publication changes with Gitleaks 8.28.0. Removed an Android File Server security token from history and disabled the unused server; the rescans found no leaks. - [x] Review Unreal asset provenance via the generation/import scripts and inspect all 18 reachable Unreal asset versions for recognizable private-reference paths. No such paths were found; this is not a full binary-content audit. - [x] Review OSM source distribution notices: original data retains attribution and licence metadata, and the repository links directly to ODbL 1.0. -- [ ] Review ODbL obligations for each shipped derivative database or produced work before public release. +- [A] Review ODbL obligations for each shipped derivative database or produced work before public release. In-game attribution display is implemented (`AGigLineHUD`, visible in every screenshot); the remaining question is the ODbL "derivative database" posture for a shipped build that contains OSM-derived geometry. - [x] Validate Gitea LFS support. The first push succeeded on 2026-11-07; a separate clone fetched all 26 historical LFS objects and passed integrity checks. - [x] Commit and review the publication preparation changes before pushing. Initial publication commit: `101db3f`.