From ef06dd7d5a0d3c5b0f17fc6cf3255ca5d065964c Mon Sep 17 00:00:00 2001 From: Zwitschi Date: Sat, 7 Nov 2026 18:42:10 +0100 Subject: [PATCH] attribution: in-game ODbL credit via AGigLineHUD The demo is built from OpenStreetMap data (ODbL 1.0) and needs attribution wherever the derived work is shown. Add it to 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 for legibility over bright pavement and sky. No UMG widget asset, so a cook cannot drop it through a missing widget reference. - AGigLineGameModeBase: HUDClass = AGigLineHUD, so the credit is on by default. - AGigLineShotActor: screenshots are now requested with the UI shown, so the attribution appears in every capture under Screenshots/ and the obligation is provable in review rather than only described. Docs: THIRD_PARTY_NOTICES records that the string is displayed in-game; Screenshots/README documents the overlay; TODO marks the item done and narrows the remaining ODbL question to the shipped-derivative-database posture. --- 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 | 4 +- 23 files changed, 114 insertions(+), 33 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 d9401ff..3017311 100644 --- a/TODO.md +++ b/TODO.md @@ -96,7 +96,7 @@ The MPFB character asset is planned as the NPC template (see `ROADMAP.md`). Keep - [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. -- [A] 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`.