From 80ef80b4907759c532186d9a911f6be4cd536179 Mon Sep 17 00:00:00 2001 From: Zwitschi Date: Sat, 7 Nov 2026 18:47:31 +0100 Subject: [PATCH] attribution: in-game ODbL credit via AGigLineHUD Completes "Geographic attribution display" for 0.1.0. The demo is built from OpenStreetMap data (ODbL 1.0) and needs attribution wherever the derived work is shown, so the credit now lives in the running game, not just the documents. - AGigLineHUD (C++): plain AHUD::DrawText in the bottom-left draws "(c) OpenStreetMap contributors" and "Data (c) OpenStreetMap contributors, ODbL 1.0 - openstreetmap.org/copyright", with a shadow pass so it stays legible over bright pavement and sky. No UMG widget asset is involved, so a cook cannot drop the attribution through a missing widget reference. - AGigLineGameModeBase: HUDClass = AGigLineHUD, so the credit is on by default in both the DemoMap and the ReviewMap. - AGigLineShotActor: screenshots are requested with the UI shown, so the credit appears in every capture under Screenshots/ - the obligation is provable from the images rather than only described. Docs: - THIRD_PARTY_NOTICES records that the attribution is displayed in-game and where the code lives. - Screenshots/README documents the overlay. - TODO marks the item done and narrows the remaining ODbL question to the shipped-derivative-database posture. Squash of branch gameplay-attribution-0.1.0 (PR #4). --- Game/GigLine/Content/Hollywood/DemoMap.umap | 2 +- Game/GigLine/Content/Test/ReviewMap.umap | 2 +- .../Source/GigLine/GigLineGameModeBase.cpp | 3 ++ Game/GigLine/Source/GigLine/GigLineHUD.cpp | 29 +++++++++++++ Game/GigLine/Source/GigLine/GigLineHUD.h | 42 +++++++++++++++++++ .../Source/GigLine/GigLineShotActor.cpp | 2 +- Screenshots/README.md | 5 +++ Screenshots/demo/review-demo-crossing.png | 4 +- .../demo/review-demo-north-buildings.png | 4 +- Screenshots/demo/review-demo-spawn-view.png | 4 +- Screenshots/demo/review-demo-street-level.png | 4 +- Screenshots/review-character.png | 4 +- Screenshots/review-ground-contact.png | 4 +- Screenshots/review-hero-facade-front.png | 4 +- Screenshots/review-hero-facade-oblique.png | 4 +- Screenshots/review-hero-portals.png | 4 +- Screenshots/review-npc-prefab.png | 4 +- Screenshots/review-overview.png | 4 +- Screenshots/review-player-placement.png | 4 +- Screenshots/review-scale-cubes.png | 4 +- Screenshots/review-shadow-compare.png | 4 +- THIRD_PARTY_NOTICES.md | 2 + TODO.md | 6 +-- 23 files changed, 115 insertions(+), 34 deletions(-) create mode 100644 Game/GigLine/Source/GigLine/GigLineHUD.cpp create mode 100644 Game/GigLine/Source/GigLine/GigLineHUD.h 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`.