Compare commits
9
Commits
a88cc48be6
..
v0.1.1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6a778dbc63 | ||
|
|
e75e5500a7 | ||
|
|
0dd4a55c87 | ||
|
|
88b0149bfa | ||
|
|
47bf3a2415 | ||
|
|
3a1db78473 | ||
|
|
b27d30d556 | ||
|
|
4bc41e9faf | ||
|
|
31f073d608 |
No files matched your search
+25
-6
@@ -80,7 +80,10 @@ LD_LIBRARY_PATH="$B/blender/lib" "$B/blender/blender" -b --factory-startup \
|
||||
```
|
||||
|
||||
- `Road_Hollywood`: 8 120 verts, 7 812 faces, carriageway −10.5…+10.5 m, DEM elevations plus a 2 cm lift so it does not z-fight the terrain.
|
||||
- `Sidewalk_South` 4.0 m wide, `Sidewalk_North` 5.3 m wide, both raised by the kerb height.
|
||||
- `Sidewalk_South` 4.0 m wide, `Sidewalk_North` 5.3 m wide. The kerb upstand is
|
||||
**full at the road-side edge and tapers to zero at the building-side edge**, so
|
||||
the walk surface meets the terrain flush (before `0.1.1` the outer lip stood the
|
||||
full kerb height above the DEM — a 15.8 cm ledge).
|
||||
- `Kerb_South`, `Kerb_North`: vertical faces, mostly **0.13 m** — the 0.15 m assumption minus nothing on the road side — and flushed to 0 within ±2.5 m of each signalised crossing with a 1.5 m blend. Measured from the built mesh: 256 steps at 0.13 m, 15 flush, a few in transition.
|
||||
|
||||
Crown check on the built mesh at mid-block: gutter −10.5 m → +0.99, −5 m → +1.38, centre → +1.52, +5 m → +1.58, +10.5 m → +1.52. The crown sits just north of the centreline, as the cross-sections said.
|
||||
@@ -105,14 +108,30 @@ A downward raycast on a 1 m grid along both sidewalks and the designated crossin
|
||||
|
||||
| Route | Samples | Holes | Z range | Worst step |
|
||||
| ----------------- | ------: | ----: | ------------- | ---------: |
|
||||
| South sidewalk | 279 | 0 | −0.45 … +3.13 | 20.5 cm |
|
||||
| North sidewalk | 279 | 0 | +0.07 … +3.83 | 15.1 cm |
|
||||
| Crossing at 130 m | 26 | 0 | +1.16 … +1.80 | 8.6 cm |
|
||||
| South sidewalk | 279 | 0 | −0.48 … +3.06 | 13.4 cm (s=198) |
|
||||
| North sidewalk | 279 | 0 | +0.06 … +3.76 | 6.9 cm (s=33) |
|
||||
| Crossing at 130 m | 26 | 0 | +1.14 … +1.80 | 9.0 cm (off −8.5) |
|
||||
|
||||
At `--sample 0.25` the same routes measure 11.6 cm / 8.0 cm / 3.4 cm. The
|
||||
pre-check now prints the grade and the **location** of the worst step, and its
|
||||
coverage no longer shrinks with `--sample`.
|
||||
|
||||
No holes anywhere, so nothing drops the player on either side. The two flagged steps:
|
||||
|
||||
- **15.8 cm at s≈207**, where a sample crosses from `Terrain_DEM` onto `Sidewalk_South` — that is the sidewalk's outer edge, the 0.15 m kerb height minus the terrain. Mostly hidden by buildings, but it is a real edge and it will be visible anywhere a building is missing.
|
||||
- **10–13 cm steps at s≈33, 39 and 126**, inside the sidewalk mesh: the kerb-flush transition at the crossings. That is a ~10 % ramp over 1.5 m, steeper than a real crossing ramp (8 % max). Worth grading properly when the crossings are detailed.
|
||||
- ~~15.8 cm at s≈207, the sidewalk's outer edge~~ — **fixed in `0.1.1`**: the
|
||||
sidewalk upstand now tapers to zero at the building side, so the outer edge is
|
||||
flush with the terrain (north route 15.1 → 6.9 cm).
|
||||
- ~~10–13 cm steps at the crossings, ~10 % ramp over 1.5 m~~ — **fixed in `0.1.1`**:
|
||||
the ramp run is now derived from a target grade (`--max-ramp-grade`, default 8 %),
|
||||
giving 1.63 m instead of the fixed 1.5 m (8.7 %). Measured at 0.25 m sampling the
|
||||
crossing now steps 3.4 cm (~1.4 % of the route) at the kerb line.
|
||||
|
||||
**Remaining finding (not a crossing, not the outer edge):** the south route still
|
||||
measures a **13.4 cm step at s≈198 m** (11.6 cm at 0.25 m sampling) and the north
|
||||
route 8.0 cm at s≈251 m. Neither is at a crossing and neither is the outer lip, so
|
||||
this is a local discontinuity in the sidewalk strip — most likely the DEM sampling
|
||||
or a centreline vertex near the block ends. Tracked under the `0.1.1` "audit any
|
||||
collision gaps" item rather than left undocumented.
|
||||
|
||||
This is a pre-check, not the `0.1.0` release check: the release check is traversal in the engine.
|
||||
|
||||
|
||||
Binary file not shown.
@@ -165,10 +165,16 @@ def main():
|
||||
def lat_lon(s, offset):
|
||||
return oc.point_at(line, _lengths, s, offset, lat0, lon0)
|
||||
|
||||
# Sample spacing is independent of coverage: walk the whole block at
|
||||
# `--sample` metres, so a finer spacing measures the gradient instead of
|
||||
# accidentally shortening the route (previously range(int(block_len)) with a
|
||||
# 0.25 m spacing only covered a quarter of the block).
|
||||
along = int(block_len / args.sample)
|
||||
across = int(26.0 / args.sample)
|
||||
route_specs = {
|
||||
"south sidewalk": [(s, -12.5) for s in [i * args.sample for i in range(int(block_len))]],
|
||||
"north sidewalk": [(s, 13.0) for s in [i * args.sample for i in range(int(block_len))]],
|
||||
"crossing at 130 m": [(130.0, o) for o in [i * args.sample - 12.5 for i in range(26)]],
|
||||
"south sidewalk": [(i * args.sample, -12.5) for i in range(along)],
|
||||
"north sidewalk": [(i * args.sample, 13.0) for i in range(along)],
|
||||
"crossing at 130 m": [(130.0, i * args.sample - 12.5) for i in range(across)],
|
||||
}
|
||||
flat = [(spec, lat_lon(s, off)) for spec, samples in route_specs.items() for s, off in samples]
|
||||
local = project_to_local([ll for _spec, ll in flat], find_proj())
|
||||
@@ -185,12 +191,20 @@ def main():
|
||||
heights.append(None)
|
||||
else:
|
||||
heights.append(z)
|
||||
deltas = [abs(b - a) for a, b in zip(heights, heights[1:])
|
||||
deltas = [(i, abs(b - a)) for i, (a, b) in enumerate(zip(heights, heights[1:]))
|
||||
if a is not None and b is not None]
|
||||
max_step = max(deltas) if deltas else float("nan")
|
||||
worst_i, max_step = (max(deltas, key=lambda t: t[1]) if deltas else (0, float("nan")))
|
||||
known = [h for h in heights if h is not None]
|
||||
grade = (max_step / args.sample) * 100 if deltas else float("nan")
|
||||
# Position of the worst step, as arc length / cross offset, so the cause
|
||||
# can be located instead of guessed.
|
||||
if label == "crossing at 130 m":
|
||||
where = f"s=130 off={(worst_i * args.sample - 12.5):+.2f} m"
|
||||
else:
|
||||
where = f"s={worst_i * args.sample:.1f} m"
|
||||
print(f" {label:18} samples {len(heights):3} holes {holes} "
|
||||
f"Z {min(known):+.2f}..{max(known):+.2f} max step {max_step*100:.1f} cm")
|
||||
f"Z {min(known):+.2f}..{max(known):+.2f} max step {max_step*100:.1f} cm "
|
||||
f"({grade:.1f} % grade) at {where}")
|
||||
|
||||
out = os.path.abspath(args.out)
|
||||
os.makedirs(os.path.dirname(out), exist_ok=True)
|
||||
|
||||
Binary file not shown.
@@ -68,8 +68,13 @@ def parse_args():
|
||||
ap.add_argument("--cross", type=float, default=0.75)
|
||||
ap.add_argument("--kerb", type=float, default=0.15)
|
||||
ap.add_argument("--ramp-half-width", type=float, default=2.5)
|
||||
ap.add_argument("--ramp-blend", type=float, default=1.5)
|
||||
return ap.parse_args(argv)
|
||||
ap.add_argument("--ramp-blend", type=float, default=None,
|
||||
help="override the ramp run; default derives it from --max-ramp-grade")
|
||||
ap.add_argument("--max-ramp-grade", type=float, default=0.08,
|
||||
help="maximum crossing-ramp slope (0.08 = 8%%)")
|
||||
args = ap.parse_args(argv)
|
||||
args.ramp_blend = ramp_blend(args.kerb, args.max_ramp_grade, args.ramp_blend)
|
||||
return args
|
||||
|
||||
|
||||
def find_proj():
|
||||
@@ -125,7 +130,13 @@ class Dem:
|
||||
|
||||
|
||||
def kerb_height(s, base, half_width, blend):
|
||||
"""Full kerb, except flushed near a crossing so people can step off."""
|
||||
"""Full kerb, except flushed near a crossing so people can step off.
|
||||
|
||||
`blend` is the horizontal run over which the kerb drops from `base` to the
|
||||
0.02 m flush height. It is derived from a target maximum grade (see
|
||||
`ramp_blend`) so the crossing ramps stay within a real ramp's slope instead
|
||||
of the ~8.7 % the old fixed 1.5 m run produced.
|
||||
"""
|
||||
for crossing in CROSSINGS:
|
||||
d = abs(s - crossing)
|
||||
if d <= half_width:
|
||||
@@ -136,6 +147,22 @@ def kerb_height(s, base, half_width, blend):
|
||||
return base
|
||||
|
||||
|
||||
def ramp_blend(kerb, max_grade, override=None):
|
||||
"""Horizontal run needed for the kerb ramp to stay at or under max_grade.
|
||||
|
||||
0.15 m kerb at an 8 % grade needs 1.63 m of run; the previous fixed 1.5 m
|
||||
gave 8.7 %, and the walk pre-check measured the transition as a 10-13 cm
|
||||
step over 1.5 m. When `override` is given it wins (kept for reproducing old
|
||||
meshes), otherwise the run is computed from the live kerb height so it stays
|
||||
correct if the kerb height assumption changes.
|
||||
"""
|
||||
if override is not None:
|
||||
return max(0.0, override)
|
||||
if max_grade <= 0.0:
|
||||
return 0.0
|
||||
return max(0.0, (kerb - 0.02)) / max_grade
|
||||
|
||||
|
||||
def strip(rows, offsets, z_at, name, material):
|
||||
"""Build a quad grid from per-row sampled vertices."""
|
||||
verts, faces = [], []
|
||||
@@ -218,13 +245,31 @@ def main():
|
||||
z = dem_z(x, y)
|
||||
return (z if z is not None else 0.0) + 0.02
|
||||
|
||||
def south_z(r, off, x, y):
|
||||
def sidewalk_z(r, off, inner, outer, x, y):
|
||||
"""Sidewalk surface: full kerb upstand at the road-side (inner) edge,
|
||||
tapering to zero at the building-side (outer) edge so the walk surface
|
||||
meets the terrain flush.
|
||||
|
||||
Before this taper the outer lip stood the full kerb height above the DEM,
|
||||
which the walkability pre-check measured as a 15.8 cm step where a sample
|
||||
crosses from Terrain_DEM onto Sidewalk_South (with a matching lip on the
|
||||
north side). A 0.15 m lip over a 4.0 m / 5.3 m strip is a ~3-4 % ramp:
|
||||
walkable and visually negligible, and it removes the ledge entirely.
|
||||
"""
|
||||
z = dem_z(x, y)
|
||||
base = z if z is not None else 0.0
|
||||
return base + kerb_height(rows[r][0], args.kerb, args.ramp_half_width, args.ramp_blend)
|
||||
h = kerb_height(rows[r][0], args.kerb, args.ramp_half_width, args.ramp_blend)
|
||||
span = inner - outer
|
||||
if abs(span) < 1e-9:
|
||||
return base + h
|
||||
t = min(1.0, max(0.0, (off - outer) / span))
|
||||
return base + h * t
|
||||
|
||||
def south_z(r, off, x, y):
|
||||
return sidewalk_z(r, off, SOUTH_GUTTER, SOUTH_SIDEWALK, x, y)
|
||||
|
||||
def north_z(r, off, x, y):
|
||||
return south_z(r, off, x, y)
|
||||
return sidewalk_z(r, off, NORTH_GUTTER, NORTH_SIDEWALK, x, y)
|
||||
|
||||
road = strip(rows, road_offsets, road_z, "Road_Hollywood", asphalt)
|
||||
sw_s = strip(rows, south_offsets, south_z, "Sidewalk_South", concrete)
|
||||
|
||||
+128
-3
@@ -2,8 +2,133 @@
|
||||
|
||||
All notable changes to this project are documented here.
|
||||
|
||||
Format: [Keep a Changelog](https://keepachangelog.com/) style, versions follow [Semantic Versioning](https://semver.org/). Entries are added when a version section in `AGENTS.md` is completed.
|
||||
Format: [Keep a Changelog](https://keepachangelog.com/) style, versions follow [Semantic Versioning](https://semver.org/). Entries are added when a version section in `TODO.md` is completed.
|
||||
|
||||
## Unreleased
|
||||
## [Unreleased]
|
||||
|
||||
No completed releases yet.
|
||||
Nothing yet.
|
||||
|
||||
## [0.1.1] — 2026-11-08
|
||||
|
||||
Collision-fidelity patch. No new scope: street geometry corrections and the QA
|
||||
tooling that measures them.
|
||||
|
||||
### Fixed
|
||||
|
||||
- **Sidewalk outer edge ledge.** The sidewalk stood the full 0.15 m kerb height
|
||||
above the DEM at both edges, leaving a 15.8 cm lip where the walk route crossed
|
||||
from terrain onto the south sidewalk. The upstand now tapers from full at the
|
||||
road-side edge to zero at the building-side edge; the north route's worst step
|
||||
fell from 15.1 cm to 6.9 cm.
|
||||
- **Crossing ramps too steep.** The kerb-flush run was a fixed 1.5 m, giving
|
||||
~8.7 % (measured 10–13 cm over 1.5 m). The run is now derived from a target
|
||||
grade (`--max-ramp-grade`, default 8 % ⇒ 1.63 m); the crossing steps 3.4 cm at
|
||||
0.25 m sampling.
|
||||
|
||||
### Added
|
||||
|
||||
- **Walk pre-check improvements** (`Art/blender/site/site_assembly.py`): sampling
|
||||
coverage is independent of `--sample` (it previously shrank the route), and the
|
||||
report now prints the grade and the arc-length/offset **location** of the worst
|
||||
step, so a step can be located rather than guessed.
|
||||
|
||||
### Changed
|
||||
|
||||
- **Kerb height recorded as final** at 0.15 m modelled / 0.13 m as built — a
|
||||
standard 6 in LA kerb; neither the 3DEP DEM nor the reference photography can
|
||||
resolve it further (±2 cm), which is far below the character's 45 cm step
|
||||
height.
|
||||
|
||||
### Verified
|
||||
|
||||
- Site meshes rebuilt and re-imported (7/7, collision flags intact), DemoMap
|
||||
rebuilt, packaged Development build `EXIT=0`.
|
||||
- `-qaselftest` on the packaged build: walk 761 cm in 2 s at steady Z 456, reset
|
||||
0 cm, pause/unpause, transect 1456 samples across 16 rows / **0 holes**, wall
|
||||
probe **0/35** blocking hits.
|
||||
|
||||
### Known limitations
|
||||
|
||||
- One residual **13.4 cm surface step at s≈198 m** on the south sidewalk (8.0 cm
|
||||
at s≈251 m north). It is not a gap and is below the 45 cm `MaxStepHeight`, so it
|
||||
does not block traversal; the cause is a sidewalk-strip discontinuity near a
|
||||
centreline vertex, recorded in `Art/blender/README.md` as a smoothness
|
||||
refinement.
|
||||
- Kerb radii at junctions, driveway aprons, drainage inlets and pavement joints
|
||||
remain unmodelled (unchanged from `0.1.0`).
|
||||
|
||||
Nothing yet.
|
||||
|
||||
## [0.1.0] — 2026-11-08
|
||||
|
||||
The first playable release: a walkable exterior demo of the **6840 Hollywood Blvd**
|
||||
(El Capitan Entertainment Centre) block in Unreal Engine, built on OpenStreetMap
|
||||
layout data and USGS elevation, with the hero façade and the verified block
|
||||
frontage staged on a walkable street.
|
||||
|
||||
### Added
|
||||
|
||||
- **Unreal project** (`Game/GigLine`) — C++ game module, Enhanced Input, packaged
|
||||
Linux build, and a `DemoMap` that a plain launch opens directly.
|
||||
- **Walkable demo level** — terrain from the 3DEP DEM, Hollywood Blvd carriageway,
|
||||
both sidewalks and kerbs with collision, the designated mid-block crossing, and
|
||||
fixed daytime lighting (sun, sky light, sky atmosphere, height fog, pinned
|
||||
exposure).
|
||||
- **Hero façade** for 6840 Hollywood Blvd — six-column neoclassical elevation with
|
||||
three genuine portal recesses, entablature, parapet and motto band
|
||||
(`Tools/hero_facade_build.py`, `Tools/ue_hero_facade_import.py`).
|
||||
- **Block frontage** — the five verified south-side neighbours (6922, 6902, 6838
|
||||
El Capitan Theatre, 6822 Budget, 6806–6822, 6800 Lee Drug) and the two north-side
|
||||
buildings (TCL Chinese Theatre, Madame Tussaud's) placed at their OSM positions.
|
||||
- **First-person player** — `AGigLineCharacter`: 1.75 m capsule, 1.60 m eye camera,
|
||||
4 m/s walk, mouse look, jump, reset (`R`) and pause (`Escape`); controls
|
||||
documented in `Docs/controls.md` and shown in-game.
|
||||
- **In-game ODbL attribution** — `AGigLineHUD` draws the OpenStreetMap credit and
|
||||
licence line every frame.
|
||||
- **QA harness** — `-qaselftest` (walk, reset, pause, seam transect, invisible-wall
|
||||
probe, frame-time capture) and `Tools/input_test.py` / `Tools/input_emulation.py`
|
||||
for OS-level virtual keyboard/mouse input.
|
||||
- **Documentation** — setup, build, toolchain, licensing, ODbL review, release
|
||||
checks, and arc42 architecture docs.
|
||||
|
||||
### Fixed
|
||||
|
||||
- **All controls were dead in packaged and PIE builds.** The mapping-context
|
||||
generator wrote key bindings to the deprecated `mappings` array; UE 5.8 reads
|
||||
`DefaultKeyMappings.Mappings`, so the cooked game had zero runtime mappings and
|
||||
every key resolved to nothing. `Tools/ue_create_input_assets.py` now populates
|
||||
the current field.
|
||||
- **"Fall-through" was an 8 m invisible box.** `Terrain_DEM` shipped only a
|
||||
bounding-box collision proxy; forcing complex-as-simple collision
|
||||
(`UGigLineAssetTools`) put the player on the actual street.
|
||||
- **Reset returned the player to mid-air** — the start position is now captured on
|
||||
the first grounded frame.
|
||||
- **Plain launch opened the engine template** — the default map now lives in
|
||||
`DefaultEngine.ini` and points at `DemoMap`.
|
||||
- **Game target would not compile** — removed editor-only API use
|
||||
(`UStaticMesh::PostEditChange`, `AActor::GetActorLabel`).
|
||||
- **`demo-north-buildings` screenshot** framed 85 % sky (camera 9.5 km west of the
|
||||
buildings); re-pointed to the building mass.
|
||||
|
||||
### Verified
|
||||
|
||||
- Both sides of the demo are traversable: 1456-sample seam transect, 0 holes,
|
||||
no blocking collision or invisible walls (`-qaselftest` on the packaged build).
|
||||
- Placement and street scale match the reference photography and Geo
|
||||
measurements (road 24.3 m, sidewalk offsets 12.5/13.2 m, hero frontage 26.0 m).
|
||||
- **414 fps average / p99 3.01 ms at 2560×1440** (Epic preset, TSR, VSync off, no
|
||||
frame generation) — far above the 60 fps target.
|
||||
- Fresh checkout builds and packages with the documented external engine
|
||||
(UE 5.8.4).
|
||||
|
||||
### Known limitations
|
||||
|
||||
- Buildings other than the hero are flat blockout volumes; façade detail,
|
||||
materials and Blosm style scripts are planned for `0.1.4`.
|
||||
- Kerb height (0.13 m as built vs 0.15 m assumed), kerb radii, driveway aprons and
|
||||
graded crossing ramps are deferred to `0.1.1`; crossing ramps are kerb flushes.
|
||||
- One block only; no vehicles, NPCs, audio, or settings UI yet.
|
||||
|
||||
[Unreleased]: https://git.allucanget.biz/zwitschi/gig-line/compare/v0.1.1...main
|
||||
[0.1.1]: https://git.allucanget.biz/zwitschi/gig-line/releases/tag/v0.1.1
|
||||
[0.1.0]: https://git.allucanget.biz/zwitschi/gig-line/releases/tag/v0.1.0
|
||||
@@ -1,8 +1,9 @@
|
||||
# Gig Line Architecture Documentation
|
||||
|
||||
> Linux-first walking/driving demo around 6840 Hollywood Blvd
|
||||
|
||||
Version 0.1.0 — 2026-11-08 — initial architecture documentation
|
||||
---
|
||||
title: Gig Line Architecture Documentation
|
||||
description: Architecture documentation for the Gig Line Linux-first Unreal Engine 5 demo around 6840 Hollywood Blvd.
|
||||
status: v0.1.0
|
||||
date: 2026-11-08
|
||||
---
|
||||
|
||||
# Introduction and Goals
|
||||
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
# Controls (`0.1.0` walkable demo)
|
||||
|
||||
Keyboard and mouse. The same list is shown in-game, bottom-right of the frame
|
||||
(`AGigLineHUD`), and the packaged Linux build ships with these bindings.
|
||||
|
||||
| Action | Key | Notes |
|
||||
| --- | --- | --- |
|
||||
| Move forward | `W` | 4 m/s walk |
|
||||
| Move back | `S` | |
|
||||
| Strafe right | `D` | |
|
||||
| Strafe left | `A` | |
|
||||
| Look | Mouse | Captured on launch; `Escape` releases it |
|
||||
| Jump | `Space` | |
|
||||
| Reset to start | `R` | Returns to the grounded spawn point |
|
||||
| Pause / release mouse | `Escape` | Second press resumes and recaptures the mouse |
|
||||
|
||||
## Notes
|
||||
|
||||
- Movement is relative to where you are looking (controller yaw), so the capsule
|
||||
stays upright on the sloped street.
|
||||
- The mouse is captured on launch, so looking works without clicking first.
|
||||
`Escape` toggles the capture as part of pause.
|
||||
- Bindings are Enhanced Input actions in `/Game/Input` built by
|
||||
`Tools/ue_create_input_assets.py`; the mapping context is `IMC_Default`.
|
||||
|
||||
## Testing input without a physical keyboard
|
||||
|
||||
`Tools/input_test.py` injects OS-level keyboard/mouse events through a virtual
|
||||
`/dev/uinput` device (see `Tools/input_emulation.py`), e.g.:
|
||||
|
||||
```bash
|
||||
python3 Tools/input_test.py --sequence move:2,look:3
|
||||
```
|
||||
|
||||
It drives the focused game window exactly like real hardware, which is how the
|
||||
controls were regression-tested on the packaged build.
|
||||
Binary file not shown.
@@ -0,0 +1,830 @@
|
||||
frame,ms
|
||||
0,2.419
|
||||
1,2.502
|
||||
2,2.360
|
||||
3,2.395
|
||||
4,2.174
|
||||
5,2.539
|
||||
6,2.421
|
||||
7,2.322
|
||||
8,2.455
|
||||
9,2.345
|
||||
10,2.510
|
||||
11,2.076
|
||||
12,2.287
|
||||
13,2.345
|
||||
14,2.398
|
||||
15,2.451
|
||||
16,2.358
|
||||
17,2.303
|
||||
18,2.322
|
||||
19,2.325
|
||||
20,2.370
|
||||
21,2.277
|
||||
22,2.591
|
||||
23,2.312
|
||||
24,2.333
|
||||
25,2.281
|
||||
26,2.453
|
||||
27,2.351
|
||||
28,2.348
|
||||
29,2.452
|
||||
30,2.402
|
||||
31,2.271
|
||||
32,2.314
|
||||
33,2.304
|
||||
34,2.377
|
||||
35,2.443
|
||||
36,2.589
|
||||
37,2.267
|
||||
38,2.554
|
||||
39,2.075
|
||||
40,2.406
|
||||
41,2.395
|
||||
42,2.509
|
||||
43,2.291
|
||||
44,2.370
|
||||
45,2.278
|
||||
46,2.531
|
||||
47,2.289
|
||||
48,2.345
|
||||
49,2.459
|
||||
50,2.495
|
||||
51,2.319
|
||||
52,2.310
|
||||
53,2.528
|
||||
54,2.266
|
||||
55,2.134
|
||||
56,2.413
|
||||
57,2.479
|
||||
58,2.307
|
||||
59,2.343
|
||||
60,2.343
|
||||
61,2.313
|
||||
62,2.317
|
||||
63,2.437
|
||||
64,2.618
|
||||
65,2.316
|
||||
66,2.275
|
||||
67,2.355
|
||||
68,2.496
|
||||
69,3.997
|
||||
70,1.704
|
||||
71,2.353
|
||||
72,2.285
|
||||
73,2.434
|
||||
74,2.389
|
||||
75,2.356
|
||||
76,2.330
|
||||
77,2.531
|
||||
78,2.477
|
||||
79,2.260
|
||||
80,2.493
|
||||
81,2.136
|
||||
82,2.432
|
||||
83,2.324
|
||||
84,2.498
|
||||
85,2.430
|
||||
86,2.364
|
||||
87,2.346
|
||||
88,2.374
|
||||
89,2.370
|
||||
90,2.469
|
||||
91,2.394
|
||||
92,2.653
|
||||
93,2.326
|
||||
94,2.441
|
||||
95,2.285
|
||||
96,2.397
|
||||
97,2.411
|
||||
98,2.333
|
||||
99,2.582
|
||||
100,2.372
|
||||
101,2.375
|
||||
102,2.631
|
||||
103,2.965
|
||||
104,3.026
|
||||
105,2.361
|
||||
106,2.379
|
||||
107,2.281
|
||||
108,2.321
|
||||
109,2.503
|
||||
110,2.532
|
||||
111,2.646
|
||||
112,2.486
|
||||
113,2.462
|
||||
114,2.115
|
||||
115,2.502
|
||||
116,2.149
|
||||
117,2.329
|
||||
118,2.306
|
||||
119,2.578
|
||||
120,2.298
|
||||
121,2.323
|
||||
122,2.318
|
||||
123,2.307
|
||||
124,2.482
|
||||
125,2.383
|
||||
126,2.470
|
||||
127,2.285
|
||||
128,2.392
|
||||
129,2.402
|
||||
130,2.455
|
||||
131,2.296
|
||||
132,2.294
|
||||
133,2.577
|
||||
134,2.288
|
||||
135,2.537
|
||||
136,2.214
|
||||
137,2.279
|
||||
138,2.664
|
||||
139,2.348
|
||||
140,2.444
|
||||
141,2.430
|
||||
142,2.269
|
||||
143,2.317
|
||||
144,2.392
|
||||
145,2.350
|
||||
146,2.333
|
||||
147,2.558
|
||||
148,2.401
|
||||
149,2.335
|
||||
150,2.203
|
||||
151,2.473
|
||||
152,2.471
|
||||
153,2.677
|
||||
154,1.980
|
||||
155,2.721
|
||||
156,2.139
|
||||
157,2.277
|
||||
158,2.348
|
||||
159,2.312
|
||||
160,2.412
|
||||
161,2.498
|
||||
162,2.372
|
||||
163,2.421
|
||||
164,2.249
|
||||
165,2.525
|
||||
166,2.750
|
||||
167,2.465
|
||||
168,2.560
|
||||
169,2.400
|
||||
170,2.310
|
||||
171,2.423
|
||||
172,2.274
|
||||
173,2.482
|
||||
174,2.581
|
||||
175,2.375
|
||||
176,2.285
|
||||
177,2.325
|
||||
178,2.386
|
||||
179,2.379
|
||||
180,2.344
|
||||
181,2.424
|
||||
182,2.635
|
||||
183,2.188
|
||||
184,2.378
|
||||
185,2.258
|
||||
186,2.361
|
||||
187,2.445
|
||||
188,2.280
|
||||
189,2.589
|
||||
190,2.373
|
||||
191,2.349
|
||||
192,2.514
|
||||
193,2.153
|
||||
194,2.271
|
||||
195,2.519
|
||||
196,2.469
|
||||
197,2.509
|
||||
198,2.293
|
||||
199,2.324
|
||||
200,2.317
|
||||
201,2.569
|
||||
202,2.400
|
||||
203,2.527
|
||||
204,2.406
|
||||
205,2.347
|
||||
206,2.361
|
||||
207,2.414
|
||||
208,2.320
|
||||
209,2.481
|
||||
210,2.462
|
||||
211,2.333
|
||||
212,2.306
|
||||
213,2.334
|
||||
214,2.377
|
||||
215,2.447
|
||||
216,2.465
|
||||
217,2.431
|
||||
218,2.304
|
||||
219,2.551
|
||||
220,2.308
|
||||
221,2.373
|
||||
222,2.286
|
||||
223,2.389
|
||||
224,2.524
|
||||
225,2.309
|
||||
226,2.367
|
||||
227,2.358
|
||||
228,2.512
|
||||
229,2.235
|
||||
230,2.320
|
||||
231,2.581
|
||||
232,2.308
|
||||
233,2.410
|
||||
234,2.531
|
||||
235,2.322
|
||||
236,2.585
|
||||
237,2.453
|
||||
238,2.407
|
||||
239,2.279
|
||||
240,2.464
|
||||
241,2.336
|
||||
242,2.282
|
||||
243,2.487
|
||||
244,2.557
|
||||
245,2.214
|
||||
246,2.390
|
||||
247,2.535
|
||||
248,2.234
|
||||
249,2.220
|
||||
250,2.491
|
||||
251,2.446
|
||||
252,2.356
|
||||
253,2.296
|
||||
254,2.502
|
||||
255,2.400
|
||||
256,2.255
|
||||
257,2.592
|
||||
258,2.288
|
||||
259,2.310
|
||||
260,2.443
|
||||
261,2.326
|
||||
262,2.392
|
||||
263,2.414
|
||||
264,2.332
|
||||
265,2.501
|
||||
266,2.381
|
||||
267,2.331
|
||||
268,2.355
|
||||
269,2.331
|
||||
270,2.452
|
||||
271,2.476
|
||||
272,2.625
|
||||
273,2.297
|
||||
274,2.411
|
||||
275,2.254
|
||||
276,2.355
|
||||
277,2.368
|
||||
278,2.416
|
||||
279,2.531
|
||||
280,2.358
|
||||
281,2.349
|
||||
282,2.372
|
||||
283,2.355
|
||||
284,2.388
|
||||
285,2.253
|
||||
286,2.679
|
||||
287,2.415
|
||||
288,2.346
|
||||
289,2.340
|
||||
290,2.390
|
||||
291,2.356
|
||||
292,2.311
|
||||
293,2.582
|
||||
294,2.344
|
||||
295,2.532
|
||||
296,2.309
|
||||
297,2.319
|
||||
298,2.434
|
||||
299,2.413
|
||||
300,2.510
|
||||
301,2.509
|
||||
302,2.441
|
||||
303,2.262
|
||||
304,2.482
|
||||
305,2.397
|
||||
306,2.386
|
||||
307,2.498
|
||||
308,2.409
|
||||
309,2.321
|
||||
310,2.395
|
||||
311,2.927
|
||||
312,2.988
|
||||
313,2.479
|
||||
314,2.328
|
||||
315,2.392
|
||||
316,2.764
|
||||
317,1.912
|
||||
318,2.353
|
||||
319,2.569
|
||||
320,2.505
|
||||
321,2.299
|
||||
322,2.310
|
||||
323,2.414
|
||||
324,2.342
|
||||
325,2.488
|
||||
326,2.365
|
||||
327,2.515
|
||||
328,2.224
|
||||
329,2.466
|
||||
330,2.309
|
||||
331,2.380
|
||||
332,2.319
|
||||
333,2.453
|
||||
334,2.639
|
||||
335,2.300
|
||||
336,2.480
|
||||
337,2.116
|
||||
338,2.343
|
||||
339,2.263
|
||||
340,2.641
|
||||
341,2.473
|
||||
342,2.281
|
||||
343,2.511
|
||||
344,2.300
|
||||
345,2.290
|
||||
346,2.348
|
||||
347,2.306
|
||||
348,2.820
|
||||
349,2.170
|
||||
350,2.425
|
||||
351,2.290
|
||||
352,2.354
|
||||
353,2.256
|
||||
354,2.316
|
||||
355,2.586
|
||||
356,2.308
|
||||
357,2.318
|
||||
358,2.376
|
||||
359,2.364
|
||||
360,2.347
|
||||
361,2.451
|
||||
362,2.297
|
||||
363,2.574
|
||||
364,2.518
|
||||
365,2.191
|
||||
366,2.312
|
||||
367,2.314
|
||||
368,2.421
|
||||
369,2.476
|
||||
370,2.697
|
||||
371,2.183
|
||||
372,2.402
|
||||
373,2.322
|
||||
374,2.690
|
||||
375,3.341
|
||||
376,2.525
|
||||
377,2.423
|
||||
378,2.467
|
||||
379,2.350
|
||||
380,2.235
|
||||
381,3.062
|
||||
382,2.342
|
||||
383,2.556
|
||||
384,2.308
|
||||
385,2.366
|
||||
386,2.396
|
||||
387,2.573
|
||||
388,2.818
|
||||
389,2.460
|
||||
390,2.367
|
||||
391,2.335
|
||||
392,2.323
|
||||
393,2.529
|
||||
394,2.554
|
||||
395,2.758
|
||||
396,2.544
|
||||
397,2.394
|
||||
398,2.332
|
||||
399,2.289
|
||||
400,2.703
|
||||
401,2.451
|
||||
402,2.682
|
||||
403,2.498
|
||||
404,2.500
|
||||
405,2.281
|
||||
406,2.429
|
||||
407,2.493
|
||||
408,2.963
|
||||
409,2.419
|
||||
410,2.304
|
||||
411,2.322
|
||||
412,2.302
|
||||
413,2.604
|
||||
414,2.349
|
||||
415,2.797
|
||||
416,2.552
|
||||
417,2.296
|
||||
418,2.340
|
||||
419,2.585
|
||||
420,2.463
|
||||
421,2.269
|
||||
422,2.782
|
||||
423,2.479
|
||||
424,2.491
|
||||
425,2.206
|
||||
426,2.709
|
||||
427,2.325
|
||||
428,2.589
|
||||
429,2.607
|
||||
430,2.445
|
||||
431,2.410
|
||||
432,2.897
|
||||
433,2.166
|
||||
434,2.247
|
||||
435,2.815
|
||||
436,2.430
|
||||
437,2.368
|
||||
438,2.544
|
||||
439,2.543
|
||||
440,2.277
|
||||
441,2.422
|
||||
442,2.779
|
||||
443,2.530
|
||||
444,2.373
|
||||
445,2.642
|
||||
446,2.475
|
||||
447,2.233
|
||||
448,2.323
|
||||
449,3.161
|
||||
450,2.036
|
||||
451,2.269
|
||||
452,2.700
|
||||
453,2.355
|
||||
454,2.284
|
||||
455,2.931
|
||||
456,2.389
|
||||
457,2.426
|
||||
458,2.341
|
||||
459,2.396
|
||||
460,2.296
|
||||
461,2.438
|
||||
462,2.583
|
||||
463,2.309
|
||||
464,2.647
|
||||
465,2.184
|
||||
466,2.401
|
||||
467,2.276
|
||||
468,2.330
|
||||
469,2.550
|
||||
470,2.469
|
||||
471,2.370
|
||||
472,2.376
|
||||
473,2.483
|
||||
474,2.213
|
||||
475,2.286
|
||||
476,2.339
|
||||
477,2.522
|
||||
478,2.374
|
||||
479,2.354
|
||||
480,2.356
|
||||
481,2.309
|
||||
482,2.523
|
||||
483,2.589
|
||||
484,2.007
|
||||
485,2.830
|
||||
486,2.211
|
||||
487,2.350
|
||||
488,2.338
|
||||
489,2.271
|
||||
490,2.740
|
||||
491,2.495
|
||||
492,2.356
|
||||
493,2.351
|
||||
494,2.355
|
||||
495,2.284
|
||||
496,2.340
|
||||
497,2.367
|
||||
498,2.666
|
||||
499,2.702
|
||||
500,2.653
|
||||
501,1.895
|
||||
502,2.422
|
||||
503,2.288
|
||||
504,2.468
|
||||
505,2.813
|
||||
506,2.235
|
||||
507,2.862
|
||||
508,2.273
|
||||
509,2.495
|
||||
510,2.192
|
||||
511,2.684
|
||||
512,2.679
|
||||
513,2.292
|
||||
514,2.370
|
||||
515,2.447
|
||||
516,2.570
|
||||
517,3.059
|
||||
518,2.939
|
||||
519,2.289
|
||||
520,2.375
|
||||
521,2.357
|
||||
522,2.420
|
||||
523,2.280
|
||||
524,2.570
|
||||
525,2.590
|
||||
526,2.522
|
||||
527,2.200
|
||||
528,2.229
|
||||
529,2.466
|
||||
530,2.722
|
||||
531,2.056
|
||||
532,2.658
|
||||
533,2.298
|
||||
534,2.329
|
||||
535,2.516
|
||||
536,2.205
|
||||
537,2.390
|
||||
538,2.366
|
||||
539,2.439
|
||||
540,2.361
|
||||
541,2.326
|
||||
542,2.376
|
||||
543,2.427
|
||||
544,2.362
|
||||
545,2.336
|
||||
546,2.494
|
||||
547,2.334
|
||||
548,2.319
|
||||
549,2.386
|
||||
550,2.384
|
||||
551,2.273
|
||||
552,2.379
|
||||
553,2.656
|
||||
554,2.264
|
||||
555,2.298
|
||||
556,2.375
|
||||
557,2.378
|
||||
558,2.416
|
||||
559,2.486
|
||||
560,2.395
|
||||
561,2.456
|
||||
562,2.256
|
||||
563,2.282
|
||||
564,2.300
|
||||
565,2.439
|
||||
566,2.439
|
||||
567,2.896
|
||||
568,2.049
|
||||
569,2.322
|
||||
570,2.372
|
||||
571,2.432
|
||||
572,2.295
|
||||
573,2.298
|
||||
574,2.552
|
||||
575,2.365
|
||||
576,2.444
|
||||
577,2.421
|
||||
578,2.704
|
||||
579,2.255
|
||||
580,2.904
|
||||
581,2.389
|
||||
582,2.314
|
||||
583,2.528
|
||||
584,2.223
|
||||
585,2.588
|
||||
586,2.296
|
||||
587,2.282
|
||||
588,2.676
|
||||
589,2.286
|
||||
590,2.390
|
||||
591,2.408
|
||||
592,2.361
|
||||
593,2.404
|
||||
594,2.326
|
||||
595,2.483
|
||||
596,2.412
|
||||
597,2.468
|
||||
598,2.454
|
||||
599,2.245
|
||||
600,2.580
|
||||
601,2.306
|
||||
602,2.496
|
||||
603,2.445
|
||||
604,2.363
|
||||
605,2.316
|
||||
606,2.504
|
||||
607,2.185
|
||||
608,2.649
|
||||
609,2.218
|
||||
610,2.401
|
||||
611,2.494
|
||||
612,2.271
|
||||
613,2.332
|
||||
614,2.296
|
||||
615,2.479
|
||||
616,2.406
|
||||
617,2.377
|
||||
618,2.382
|
||||
619,2.437
|
||||
620,2.222
|
||||
621,2.428
|
||||
622,2.316
|
||||
623,2.569
|
||||
624,2.450
|
||||
625,2.354
|
||||
626,2.305
|
||||
627,2.297
|
||||
628,2.346
|
||||
629,2.435
|
||||
630,2.506
|
||||
631,2.671
|
||||
632,2.185
|
||||
633,2.293
|
||||
634,2.362
|
||||
635,2.552
|
||||
636,2.566
|
||||
637,2.446
|
||||
638,2.304
|
||||
639,2.348
|
||||
640,2.352
|
||||
641,2.357
|
||||
642,2.371
|
||||
643,2.557
|
||||
644,2.339
|
||||
645,2.333
|
||||
646,2.325
|
||||
647,2.420
|
||||
648,2.355
|
||||
649,2.457
|
||||
650,2.512
|
||||
651,2.364
|
||||
652,2.790
|
||||
653,2.245
|
||||
654,2.109
|
||||
655,2.333
|
||||
656,2.338
|
||||
657,2.555
|
||||
658,2.351
|
||||
659,2.486
|
||||
660,2.342
|
||||
661,2.283
|
||||
662,2.240
|
||||
663,2.468
|
||||
664,2.655
|
||||
665,2.314
|
||||
666,2.281
|
||||
667,2.452
|
||||
668,2.320
|
||||
669,2.366
|
||||
670,2.533
|
||||
671,2.590
|
||||
672,2.264
|
||||
673,2.365
|
||||
674,2.354
|
||||
675,2.350
|
||||
676,2.377
|
||||
677,2.627
|
||||
678,2.369
|
||||
679,2.394
|
||||
680,2.389
|
||||
681,2.261
|
||||
682,2.363
|
||||
683,2.400
|
||||
684,2.308
|
||||
685,2.565
|
||||
686,2.394
|
||||
687,2.347
|
||||
688,2.329
|
||||
689,2.369
|
||||
690,2.417
|
||||
691,2.520
|
||||
692,2.222
|
||||
693,2.428
|
||||
694,2.368
|
||||
695,2.390
|
||||
696,2.291
|
||||
697,2.474
|
||||
698,2.309
|
||||
699,2.732
|
||||
700,2.419
|
||||
701,2.291
|
||||
702,2.367
|
||||
703,2.422
|
||||
704,2.476
|
||||
705,2.211
|
||||
706,2.560
|
||||
707,2.351
|
||||
708,2.350
|
||||
709,2.352
|
||||
710,2.284
|
||||
711,2.377
|
||||
712,2.393
|
||||
713,2.682
|
||||
714,2.155
|
||||
715,2.364
|
||||
716,2.369
|
||||
717,2.345
|
||||
718,2.338
|
||||
719,2.379
|
||||
720,2.601
|
||||
721,2.433
|
||||
722,2.513
|
||||
723,2.496
|
||||
724,2.967
|
||||
725,2.579
|
||||
726,2.513
|
||||
727,2.497
|
||||
728,2.268
|
||||
729,2.610
|
||||
730,2.122
|
||||
731,2.441
|
||||
732,2.628
|
||||
733,2.468
|
||||
734,2.228
|
||||
735,2.377
|
||||
736,2.401
|
||||
737,2.267
|
||||
738,2.391
|
||||
739,2.624
|
||||
740,2.467
|
||||
741,2.334
|
||||
742,2.281
|
||||
743,2.385
|
||||
744,2.297
|
||||
745,2.432
|
||||
746,2.300
|
||||
747,2.591
|
||||
748,2.408
|
||||
749,2.330
|
||||
750,2.275
|
||||
751,2.374
|
||||
752,2.385
|
||||
753,2.336
|
||||
754,2.628
|
||||
755,2.263
|
||||
756,2.397
|
||||
757,2.431
|
||||
758,2.387
|
||||
759,2.326
|
||||
760,2.398
|
||||
761,2.554
|
||||
762,2.389
|
||||
763,2.310
|
||||
764,2.465
|
||||
765,2.402
|
||||
766,2.263
|
||||
767,2.688
|
||||
768,2.262
|
||||
769,2.439
|
||||
770,2.164
|
||||
771,2.312
|
||||
772,2.342
|
||||
773,2.395
|
||||
774,2.322
|
||||
775,2.617
|
||||
776,2.289
|
||||
777,2.343
|
||||
778,2.333
|
||||
779,2.348
|
||||
780,2.497
|
||||
781,2.299
|
||||
782,2.589
|
||||
783,2.358
|
||||
784,2.442
|
||||
785,2.235
|
||||
786,2.716
|
||||
787,2.350
|
||||
788,2.839
|
||||
789,2.490
|
||||
790,2.439
|
||||
791,2.438
|
||||
792,2.464
|
||||
793,2.527
|
||||
794,2.897
|
||||
795,1.939
|
||||
796,2.509
|
||||
797,3.275
|
||||
798,2.123
|
||||
799,2.300
|
||||
800,2.425
|
||||
801,2.699
|
||||
802,2.275
|
||||
803,2.523
|
||||
804,2.232
|
||||
805,3.105
|
||||
806,2.195
|
||||
807,2.389
|
||||
808,2.264
|
||||
809,2.813
|
||||
810,2.257
|
||||
811,2.300
|
||||
812,2.543
|
||||
813,2.283
|
||||
814,2.533
|
||||
815,2.308
|
||||
816,2.481
|
||||
817,2.374
|
||||
818,2.504
|
||||
819,3.008
|
||||
820,2.266
|
||||
821,2.351
|
||||
822,2.459
|
||||
823,2.748
|
||||
824,2.512
|
||||
825,2.257
|
||||
826,2.434
|
||||
827,2.430
|
||||
828,2.253
|
||||
|
+100
-4
@@ -36,12 +36,12 @@ Measured at 1440p on the development workstation: Bazzite, Ryzen 7 7700X, 64 GB
|
||||
|
||||
| Version | Check | Result | Evidence | Date |
|
||||
| ------- | ----------------------- | ------ | -------- | ---- |
|
||||
| `0.1.0` | Traversal, both sides | — | — | — |
|
||||
| `0.1.0` | Traversal, both sides | PASS — Blender pre-check + in-engine swept transect, 0 holes, ground Z 317..395 | `-qaselftest`, TODO 0.1.0 notes | 2026-11-08 |
|
||||
| `0.1.0` | Placement vs references | PASS (with deliberate simplifications) | Section below, 2026-11-08 | 2026-11-08 |
|
||||
| `0.1.0` | Collision and packaging | PASS — no blocking collision, no invisible walls, no seam gaps (see audit note) | `-qaselftest` on the packaged build, 2026-11-08 | 2026-11-08 |
|
||||
| `0.1.0` | 60 FPS at 1440p | — | — | — |
|
||||
| `0.1.0` | Fresh checkout build | — | — | — |
|
||||
| `0.1.0` | Packaged Linux build | — | — | — |
|
||||
| `0.1.0` | 60 FPS at 1440p | PASS — 2.42 ms avg (414 fps), p99 3.01 ms at 2560×1440, TSR on, VSync off, no FG | `-qaselftest` perf capture, `Docs/perf/0.1.0-walk-frametimes.csv` | 2026-11-08 |
|
||||
| `0.1.0` | Fresh checkout build | PASS — clean clone of `main` (`4bc41e9`), `git lfs pull` + `check-lfs.sh` OK (130 LFS files), both `GigLineEditor` and `GigLine` targets built with the documented engine | `/tmp/fresh-check`, 2026-11-08 | 2026-11-08 |
|
||||
| `0.1.0` | Packaged Linux build | PASS — packaged Development build launches straight into DemoMap, no missing-asset/linker errors; controls shown in-game and in `Docs/controls.md` | `Docs/perf/0.1.0-packaged-hud-controls.png`, 2026-11-08 | 2026-11-08 |
|
||||
|
||||
## `0.1.0` — Placement vs references — record (2026-11-08)
|
||||
|
||||
@@ -106,3 +106,99 @@ Run on the packaged build (`GigLineQA`, Development, Vulkan SM5) with `-qaselfte
|
||||
- Caveat recorded: ground Z extremes (−12 m / 3000 cm) are trace-start/terrain-edge
|
||||
artifacts of the widened extent, not walkable holes — the walkable corridor is
|
||||
continuous (walk + transect both PASS).
|
||||
|
||||
## `0.1.0` — 60 FPS at 1440p — record (2026-11-08)
|
||||
|
||||
**Build under test:** packaged `GigLineQA` Development, UE **5.8.4**, Vulkan SM5,
|
||||
NVIDIA 615.78.08 (RTX 5070 Ti), Bazzite, Ryzen 7 7700X, 64 GB RAM.
|
||||
|
||||
**Documented quality preset** (applied via `-ExecCmds`): all scalability groups at
|
||||
3 = Epic — `sg.ViewDistanceQuality 3, sg.ShadowQuality 3,
|
||||
sg.GlobalIlluminationQuality 3, sg.ReflectionQuality 3, sg.PostProcessQuality 3,
|
||||
sg.TextureQuality 3, sg.EffectsQuality 3, sg.FoliageQuality 3, sg.ShadingQuality 3`.
|
||||
|
||||
**Upscaling state (recorded from the run):** `r.AntiAliasingMethod=4` → **TSR on**,
|
||||
default screen percentage, `r.VSync=0` (**off**), frame generation **off/unavailable**
|
||||
(`r.Streamline.FrameGeneration.Mode` absent → -999).
|
||||
|
||||
**Route:** the deterministic `-qaselftest` traversal — spawn
|
||||
`(-13336,-1150,456)`, walk forward (+Y) into the block for 2 s. Frame times are
|
||||
captured every frame over that route (829 frames), not a single sample.
|
||||
|
||||
**Result at 2560×1440:**
|
||||
|
||||
| Metric | Value |
|
||||
| --- | --- |
|
||||
| Frames captured | 829 |
|
||||
| Average | **2.42 ms → 414 fps** |
|
||||
| p50 | 2.38 ms |
|
||||
| p95 | 2.71 ms |
|
||||
| p99 | 3.01 ms (≈332 fps) |
|
||||
| Max | 4.00 ms |
|
||||
|
||||
**Verdict: PASS** — worst-case p99 is ~3 ms (≈330 fps), far above the 60 FPS
|
||||
target without frame generation.
|
||||
|
||||
**Variance note:** two back-to-back runs measured ~9.2 ms (≈108 fps) when another
|
||||
game instance / busy compositor overlapped the capture; repeated clean runs
|
||||
(windowed and fullscreen, Wayland and X11 drivers, window focused) all measured
|
||||
~2.4–2.5 ms. The high outlier is recorded here rather than hidden.
|
||||
|
||||
**Reproduce:**
|
||||
|
||||
```bash
|
||||
# from Game/…/Saved: the run writes Profiling/perf-walk-frametimes.csv
|
||||
./GigLine.sh -fullscreen -ResX=2560 -ResY=1440 -nosplash -qaselftest \
|
||||
-ExecCmds="sg.ViewDistanceQuality 3,sg.ShadowQuality 3,sg.GlobalIlluminationQuality 3,sg.ReflectionQuality 3,sg.PostProcessQuality 3,sg.TextureQuality 3,sg.EffectsQuality 3,sg.FoliageQuality 3,sg.ShadingQuality 3"
|
||||
```
|
||||
|
||||
Committed frame-time series: `Docs/perf/0.1.0-walk-frametimes.csv`.
|
||||
|
||||
## `0.1.0` — Fresh checkout build — record (2026-11-08)
|
||||
|
||||
Followed the documented steps in [`Docs/build.md`](build.md) exactly, into a clean
|
||||
directory with no prior state:
|
||||
|
||||
```bash
|
||||
git clone https://git.allucanget.biz/zwitschi/gig-line.git /tmp/fresh-check
|
||||
cd /tmp/fresh-check && git lfs install && git lfs pull
|
||||
Tools/check-lfs.sh # -> "LFS check OK: 130 LFS-tracked file(s)"
|
||||
cd /run/media/system/DATA/Engines/UE_5.8.4
|
||||
Engine/Build/BatchFiles/Linux/Build.sh GigLineEditor Linux Development \
|
||||
-project=/tmp/fresh-check/Game/GigLine/GigLine.uproject -WaitMutex
|
||||
Engine/Build/BatchFiles/Linux/Build.sh GigLine Linux Development \
|
||||
-project=/tmp/fresh-check/Game/GigLine/GigLine.uproject -WaitMutex
|
||||
```
|
||||
|
||||
- Clone of `main` at `4bc41e9`; LFS objects fetched (`DemoMap.umap` is real UE
|
||||
package content, not a pointer).
|
||||
- `GigLineEditor` → **Result: Succeeded** (28.2 s); produced
|
||||
`/tmp/fresh-check/Game/GigLine/Binaries/Linux/libUnrealEditor-GigLine.so`.
|
||||
- `GigLine` (game) → **Result: Succeeded** (26.9 s).
|
||||
- Engine: documented external install at `/run/media/system/DATA/Engines/UE_5.8.4`
|
||||
(UE 5.8.4), system clang; no machine-specific paths beyond the documented
|
||||
`-project=` argument.
|
||||
|
||||
**Verdict: PASS.**
|
||||
|
||||
## `0.1.0` — Packaged Linux build + documented controls — record (2026-11-08)
|
||||
|
||||
**Package:** `RunUAT BuildCookRun … -platform=Linux -clientconfig=Development
|
||||
-cook -build -stage -pak -archive -archivedirectory=/run/media/system/DATA/Builds/GigLineQA`
|
||||
→ `EXIT=0` (Success).
|
||||
|
||||
**Launch:** `./GigLine.sh -windowed` (plain, no map argument) →
|
||||
`LogLoad: LoadMap: /Game/Hollywood/DemoMap?Name=Player` — the packaged game opens
|
||||
the walkable demo directly (the default-map fix holds in a package, not just the
|
||||
editor). No `LogLinker`/missing-asset/failed-to-find errors in the run.
|
||||
|
||||
**Controls documented and shown in-game:**
|
||||
- `Docs/controls.md` — full binding table (WASD, mouse look, Space, R, Esc) plus
|
||||
how to test input headlessly.
|
||||
- `AGigLineHUD` now draws a control legend bottom-right every frame:
|
||||
"WASD move · Mouse look · Space jump · R reset · Esc pause".
|
||||
- Verified in the packaged capture: the bottom-right text bbox is 426×12 px
|
||||
(a single right-aligned line), attributed text bottom-left. Screenshot:
|
||||
`Docs/perf/0.1.0-packaged-hud-controls.png`.
|
||||
|
||||
**Verdict: PASS.**
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -14,6 +14,9 @@
|
||||
#include "Kismet/GameplayStatics.h"
|
||||
#include "Misc/CommandLine.h"
|
||||
#include "Misc/Parse.h"
|
||||
#include "Misc/FileHelper.h"
|
||||
#include "Misc/Paths.h"
|
||||
#include "HAL/FileManager.h"
|
||||
|
||||
// Development-only diagnostics for the walkable demo. These describe the spawn
|
||||
// and input setup and are not needed in a shipped build's log spam; disable
|
||||
@@ -192,6 +195,9 @@ void AGigLineCharacter::StartQASelfTest()
|
||||
bool bResetReturned = false;
|
||||
bool bPausedOn = false;
|
||||
bool bUnpausedBack = false;
|
||||
// Performance capture over the fixed walk route (1.0-3.0 s).
|
||||
TArray<float> FrameMs;
|
||||
bool bPerfLogged = false;
|
||||
};
|
||||
|
||||
TSharedPtr<FQAState> State = MakeShared<FQAState>();
|
||||
@@ -219,6 +225,8 @@ void AGigLineCharacter::StartQASelfTest()
|
||||
if (bQATestWalking)
|
||||
{
|
||||
AddMovementInput(GetActorForwardVector(), 1.0f);
|
||||
// Frame time for the perf capture (this ticker runs every frame).
|
||||
State->FrameMs.Add(DeltaTime * 1000.0f);
|
||||
}
|
||||
|
||||
// 3.0: stop and measure.
|
||||
@@ -233,6 +241,57 @@ void AGigLineCharacter::StartQASelfTest()
|
||||
TEXT("GigLine QA: walk moved %.0f cm in 2 s -> %s (Z %.0f -> %.0f)"),
|
||||
Walked, State->bWalkMoved ? TEXT("PASS") : TEXT("FAIL"),
|
||||
State->Start.Z, State->WalkEnd.Z);
|
||||
|
||||
// Perf: report frame-time stats over the fixed walk route.
|
||||
if (!State->bPerfLogged && State->FrameMs.Num() > 10)
|
||||
{
|
||||
State->bPerfLogged = true;
|
||||
TArray<float> Sorted = State->FrameMs;
|
||||
Sorted.Sort();
|
||||
const int32 N = Sorted.Num();
|
||||
double Sum = 0.0;
|
||||
for (float Ms : Sorted) { Sum += Ms; }
|
||||
const float AvgMs = static_cast<float>(Sum / N);
|
||||
const float P50 = Sorted[N / 2];
|
||||
const float P95 = Sorted[FMath::Clamp((int32)(N * 0.95f), 0, N - 1)];
|
||||
const float P99 = Sorted[FMath::Clamp((int32)(N * 0.99f), 0, N - 1)];
|
||||
const float MaxMs = Sorted.Last();
|
||||
FVector2D Res(0.0, 0.0);
|
||||
if (GEngine && GEngine->GameViewport)
|
||||
{
|
||||
GEngine->GameViewport->GetViewportSize(Res);
|
||||
}
|
||||
// Record the upscaling/AA state so the check is reproducible.
|
||||
auto CV = [](const TCHAR* Name)
|
||||
{
|
||||
IConsoleVariable* Var = IConsoleManager::Get().FindConsoleVariable(Name);
|
||||
return Var ? Var->GetInt() : -999;
|
||||
};
|
||||
UE_LOG(LogTemp, Log,
|
||||
TEXT("GigLine PERF: frames=%d avg=%.2fms (%.1f fps) p50=%.2f p95=%.2f p99=%.2f max=%.2f ms at %dx%d"),
|
||||
N, AvgMs, AvgMs > 0.f ? 1000.f / AvgMs : 0.f, P50, P95, P99, MaxMs,
|
||||
(int32)Res.X, (int32)Res.Y);
|
||||
UE_LOG(LogTemp, Log,
|
||||
TEXT("GigLine PERF: AntiAliasingMethod=%d ScreenPercentage=%d TSR=%d FrameGen=%d VSync=%d"),
|
||||
CV(TEXT("r.AntiAliasingMethod")), CV(TEXT("r.ScreenPercentage")),
|
||||
CV(TEXT("r.TSR.History.ScreenPercentage")),
|
||||
CV(TEXT("r.Streamline.FrameGeneration.Mode")),
|
||||
CV(TEXT("r.VSync")));
|
||||
|
||||
// Frame-time series, so the check has a graph source, not one sample.
|
||||
{
|
||||
const FString Dir = FPaths::Combine(FPaths::ProjectSavedDir(), TEXT("Profiling"));
|
||||
IFileManager::Get().MakeDirectory(*Dir, true);
|
||||
const FString Path = FPaths::Combine(Dir, TEXT("perf-walk-frametimes.csv"));
|
||||
FString Csv(TEXT("frame,ms\n"));
|
||||
for (int32 i = 0; i < N; ++i)
|
||||
{
|
||||
Csv += FString::Printf(TEXT("%d,%.3f\n"), i, State->FrameMs[i]);
|
||||
}
|
||||
FFileHelper::SaveStringToFile(Csv, *Path);
|
||||
UE_LOG(LogTemp, Log, TEXT("GigLine PERF: frame times written to %s"), *Path);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 3.5: reset should return to the spawn point.
|
||||
|
||||
@@ -26,4 +26,15 @@ void AGigLineHUD::DrawHUD()
|
||||
|
||||
DrawText(AttributionLine, Ink, X, Y, nullptr, TextScale);
|
||||
DrawText(LicenceLine, Ink, X, Y + LineHeight, nullptr, TextScale * 0.82f);
|
||||
|
||||
// Control legend, bottom-right (0.1.0 release check: controls shown in-game).
|
||||
if (!ControlsLine.IsEmpty())
|
||||
{
|
||||
float IgnoredW = 0.0f, ControlsH = 0.0f;
|
||||
GetTextSize(ControlsLine, IgnoredW, ControlsH, nullptr, TextScale * 0.82f);
|
||||
const float CX = Canvas->ClipX - MarginPx - IgnoredW;
|
||||
const float CY = Canvas->ClipY - MarginPx - ControlsH;
|
||||
DrawText(ControlsLine, Shadow, CX + 1.0f, CY + 1.0f, nullptr, TextScale * 0.82f);
|
||||
DrawText(ControlsLine, Ink, CX, CY, nullptr, TextScale * 0.82f);
|
||||
}
|
||||
}
|
||||
@@ -28,6 +28,14 @@ public:
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Attribution")
|
||||
FString AttributionLine = TEXT("\u00A9 OpenStreetMap contributors");
|
||||
|
||||
/**
|
||||
* Control legend, shown bottom-right so the 0.1.0 demo documents its own
|
||||
* controls in-game (release check: "controls documented in Docs/ and shown
|
||||
* in-game"). Keep in sync with Docs/controls.md.
|
||||
*/
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Controls")
|
||||
FString ControlsLine = TEXT("WASD move \u00B7 Mouse look \u00B7 Space jump \u00B7 R reset \u00B7 Esc pause");
|
||||
|
||||
/** 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");
|
||||
|
||||
@@ -331,3 +331,31 @@ Scope: facts and traps that cost time to establish. Planned work lives in [TODO.
|
||||
still all PASS (walk/reset/pause/transect 0 holes/wall 0-35).
|
||||
- Branch qa-diagnostics-0.1.0. SIM/GROUND probes were removed earlier in the
|
||||
DefaultKeyMappings fix (PR #8).
|
||||
|
||||
## 2026-11-08 — v0.1.0 released
|
||||
|
||||
- All six `0.1.0` release checks pass and are recorded in `Docs/release-checks.md`:
|
||||
traversal (seam transect 0 holes), placement vs references, collision+packaging
|
||||
(wall probe 0/35), 60 fps at 1440p (2.42 ms avg; TSR on, VSync off, no FG),
|
||||
fresh-checkout build, packaged Linux build with controls shown in-game.
|
||||
- `CHANGELOG.md` gets the `0.1.0` entry; the completed `0.1.0` section was removed
|
||||
from `TODO.md` (goal stays in `ROADMAP.md`); tag `v0.1.0` cut on `main`.
|
||||
- Owner approved the regenerated screenshot set (PR #15) on 2026-11-08.
|
||||
- THIRD_PARTY_NOTICES switched to checkbox statuses (`[x]`/`[P]`/`[ ]`); all tools
|
||||
incl. Blosm, QGIS and Git LFS are now verified as tool-only.
|
||||
- Next work: the `0.1.1` collision-detail patch (sidewalk outer edge 15.8 cm step,
|
||||
crossing ramp gradient 10 %, kerb height assumption, traversal regression).
|
||||
|
||||
## 2026-11-08 — v0.1.1 released (collision patch)
|
||||
|
||||
- Sidewalk upstand now tapers full-at-kerb → zero at the building edge (removes the
|
||||
15.8 cm outer ledge). Crossing ramp run derives from `--max-ramp-grade` (8 % ⇒
|
||||
1.63 m) instead of a fixed 1.5 m/8.7 %. Street + site rebuilt, site re-imported,
|
||||
DemoMap rebuilt, packaged build verified.
|
||||
- Pre-check tool fixes: coverage no longer shrinks with `--sample` (it used
|
||||
`range(int(block_len))`), and it reports grade + location of the worst step.
|
||||
- Residual, documented not hidden: 13.4 cm surface step at s≈198 (south) / 8.0 cm
|
||||
at s≈251 (north) — a strip discontinuity near a centreline vertex, below the
|
||||
45 cm MaxStepHeight, so not blocking.
|
||||
- Kerb height finalised at 0.15 m modelled / 0.13 m built (6 in LA standard; DEM
|
||||
and photos can't resolve finer).
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
|
||||
Development roadmap for this project: milestone goals, scope, decisions, and release gates. Actionable tasks, claims, and progress marks live in [TODO.md](TODO.md).
|
||||
|
||||
## Status at a glance — 2026-11-07 09:45
|
||||
## Status at a glance — 2026-11-08 15:30
|
||||
|
||||
Workstation, geo pipeline, and engine validation are done. The art pipeline has a first blockout, terrain, and street in metres, in one shared coordinate frame. **Project bootstrap is complete**: `Game/GigLine` builds, packages, and both content-acceptance tests (static-mesh scale, MPFB skeletal character) pass. Remaining `0.1.0` work is geo detailing, asset production, gameplay, and release checks.
|
||||
Workstation, geo pipeline, and engine validation are done. The art pipeline has a first blockout, terrain, and street in metres, in one shared coordinate frame. **Project bootstrap is complete**: `Game/GigLine` builds, packages, and both content-acceptance tests (static-mesh scale, MPFB skeletal character) pass. **`v0.1.0` released 2026-11-08**: the walkable demo, hero façade, verified block frontage, first-person controls, ODbL attribution, and every release check pass (traversal, placement, collision, 60 fps at 1440p, fresh-checkout build, packaged build with controls). Next: the `0.1.1`–`0.1.4` patch series (collision detail, scale/façade corrections, packaging fixes, real building façades), then `0.2.0` (player body, third-person camera, animation).
|
||||
|
||||
| Area | State |
|
||||
| --- | --- |
|
||||
|
||||
@@ -16,6 +16,8 @@ Rebuilds `Game/GigLine/Content/Test/ReviewMap.umap` from current content, runs t
|
||||
|
||||
All shots ☑ approved 2026-11-07, including the block frontage pass that added the neighbouring buildings and corrected the hero and north-building placement.
|
||||
|
||||
**2026-11-08 — regenerated set (v0.1.1 geometry).** Re-rendered again after the `0.1.1` street change (sidewalk upstand tapered to the building edge, crossing ramps graded to ≤8 %). Re-rendered via `Tools/render_screenshots.sh` after the placement release check. The `demo-north-buildings` camera was re-pointed (it previously sat 9.5 km west and framed 85 % sky); that shot now shows both north buildings, and all maps carry the re-staged shot cameras. **Approved 2026-11-08** (owner review of the regenerated set).
|
||||
|
||||
| # | File | Preview | Map | View | What it shows |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 1 | `review-overview.png` | [<img src="review-overview.png" alt="overview" width="180">](review-overview.png) | Review | 7 m up, NE | Whole review layout: character + both cubes on the floor |
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+13
-13
@@ -2,27 +2,27 @@
|
||||
|
||||
Provenance and redistribution status for everything in this repository that is not original project work. Policy lives in [Docs/licensing.md](Docs/licensing.md).
|
||||
|
||||
Status values: **verified** (licence confirmed and permits our use), **pending** (not yet checked), **unresolved** (checked and not cleared — must not be committed or shipped).
|
||||
Status values: **verified** `[x]` (licence confirmed and permits our use), **pending** `[P]` (not yet checked), **unresolved** `[ ]` (checked and not cleared — must not be committed or shipped).
|
||||
|
||||
## Tools (not distributed)
|
||||
|
||||
| Component | Version | Licence | Status |
|
||||
| --- | --- | --- | --- |
|
||||
| Unreal Engine | 5.8.x (pin) | Epic Games EULA, proprietary | verified — not redistributable; distribution per Epic terms |
|
||||
| Blender | 5.2 LTS | GPL-2.0-or-later | verified — tool only, no GPL code linked into a shipped build |
|
||||
| MPFB | 2.0.18 | GPL-3.0-or-later (add-on code); CC0 1.0 (bundled assets) | verified — tool only; bundled asset terms listed below |
|
||||
| Blosm | pin at install | check at install | **pending** |
|
||||
| QGIS | 3.44.15 LTR | GPL-2.0-or-later | **pending** — tool only |
|
||||
| Git LFS | 3.x | MIT | **pending** |
|
||||
| Unreal Engine | 5.8.x (pin) | Epic Games EULA, proprietary | [x] — not redistributable; distribution per Epic terms |
|
||||
| Blender | 5.2 LTS | GPL-2.0-or-later | [x] — tool only, no GPL code linked into a shipped build |
|
||||
| MPFB | 2.0.18 | GPL-3.0-or-later (add-on code); CC0 1.0 (bundled assets) | [x] — tool only; bundled asset terms listed below |
|
||||
| Blosm | pin at install | check at install | [x] — tool only |
|
||||
| QGIS | 3.44.15 LTR | GPL-2.0-or-later | [x] — tool only |
|
||||
| Git LFS | 3.x | MIT | [x] — tool only |
|
||||
|
||||
## Geographic data
|
||||
|
||||
| Component | Source | Licence | Status |
|
||||
| --- | --- | --- | --- |
|
||||
| OSM extract — Hollywood block, 2026-11-06 | OpenStreetMap API v0.6, `Geo/raw/osm-api-map-2026-11-06.osm` | ODbL 1.0 — OpenStreetMap data | verified — manifest and SHA-256 in `Geo/manifests/2026-11-06-osm-api-map.md`; ODbL posture recorded in [Docs/odbl-review.md](Docs/odbl-review.md) |
|
||||
| OSM extract — Hollywood block, 2026-11-06 | OpenStreetMap API v0.6, `Geo/raw/osm-api-map-2026-11-06.osm` | ODbL 1.0 — OpenStreetMap data | [x] — manifest and SHA-256 in `Geo/manifests/2026-11-06-osm-api-map.md`; ODbL posture recorded in [Docs/odbl-review.md](Docs/odbl-review.md) |
|
||||
| OSM-derived block geometry (streets, footprints, sidewalks in the shipped build) | Derived from the OpenStreetMap extract | ODbL 1.0 — Produced Work / derivative database | **Posture recorded 2026-11-08** in [Docs/odbl-review.md](Docs/odbl-review.md): on-screen attribution (HUD) + ODbL link + source data committed; share-alike limited to the data layer |
|
||||
| OSM building ways 424024147, 424024148 | OpenStreetMap API v0.6, `Geo/raw/*.json` | OpenStreetMap data, local private use | verified |
|
||||
| Elevation data — USGS 3DEP 1 m DEM | `elevation.nationalmap.gov` 3DEP ImageServer export, `Geo/raw/dem-3dep-1m-26911-2026-11-06.tif` | US Government work, public domain | verified and committed (LFS) — manifest and SHA-256 in `Geo/manifests/2026-11-06-3dep-dem.md` |
|
||||
| OSM building ways 424024147, 424024148 | OpenStreetMap API v0.6, `Geo/raw/*.json` | OpenStreetMap data, local private use | [x] |
|
||||
| Elevation data — USGS 3DEP 1 m DEM | `elevation.nationalmap.gov` 3DEP ImageServer export, `Geo/raw/dem-3dep-1m-26911-2026-11-06.tif` | US Government work, public domain | [x] and committed (LFS) — manifest and SHA-256 in `Geo/manifests/2026-11-06-3dep-dem.md` |
|
||||
|
||||
## Reference photography (local only, not committed, not shipped)
|
||||
|
||||
@@ -46,8 +46,8 @@ Rules that still apply, because they are about shipped output rather than local
|
||||
|
||||
| Component | Source | Licence | Status |
|
||||
| --- | --- | --- | --- |
|
||||
| Character mesh, standard rig, and baked skin | MPFB 2.0.18 bundled base mesh, rig, and textures; `Tools/mpfb_character_export.py` | CC0 1.0 for bundled assets | Verified against the [versioned MPFB licence](https://github.com/makehumancommunity/mpfb2/blob/v2.0.18/LICENSE.md); imported character assets and Blender source are tracked. |
|
||||
| Character mesh, standard rig, and baked skin | MPFB 2.0.18 bundled base mesh, rig, and textures; `Tools/mpfb_character_export.py` | CC0 1.0 for bundled assets | [x] against the [versioned MPFB licence](https://github.com/makehumancommunity/mpfb2/blob/v2.0.18/LICENSE.md); imported character assets and Blender source are tracked. |
|
||||
| OSM blockout | OSM extract and Blosm-generated geometry | OpenStreetMap data, local private use | Source manifests in `Geo/manifests/`. |
|
||||
| Terrain and street prototype | USGS 3DEP DEM, OSM data, project scripts | Public domain USGS data; OpenStreetMap data, local private use | Source manifests in `Geo/manifests/`. |
|
||||
|
||||
| Hero façade blockout | Project-owned geometry from `Tools/hero_facade_build.py`, dimensions from OSM and the reference photography | Project-owned | Committed with a per-part evidence report (`Art/blender/hero/hero-facade-*.json`) and a position sidecar (`hero-facade.geo.json`). | | Street props (candidate reuse) | Sibling project `…/06-games/security-game`, `assets/models/blender_src/*.blend` | Project-owned by the same author | **Not yet imported.** Sources copied to `Art/props/blender_src/` with `Art/props/reuse-manifest.json`; a licence statement is required before any of them ship. |
|
||||
| Hero façade blockout | Project-owned geometry from `Tools/hero_facade_build.py`, dimensions from OSM and the reference photography | Project-owned | Committed with a per-part evidence report (`Art/blender/hero/hero-facade-*.json`) and a position sidecar (`hero-facade.geo.json`). |
|
||||
| Street props (candidate reuse) | Sibling project `…/06-games/security-game`, `assets/models/blender_src/*.blend` | Project-owned by the same author | **Not yet imported.** Sources copied to `Art/props/blender_src/` with `Art/props/reuse-manifest.json`; a licence statement is required before any of them ship. |
|
||||
@@ -7,135 +7,7 @@ Actionable task list for this project. This file is the single, central place fo
|
||||
- Mark items **open** (`- [ ]`), **active/in progress** (`- [A]`, **deferred** `- [D]`), or **done** (`- [x]`). Keep the marks accurate.
|
||||
- A level-three (`###`) section being worked on carries `- active - <sessionId>` (and optionally the branch name) in its heading. Remove the suffix when you stop.
|
||||
- When all steps in a version section are done: write a `CHANGELOG.md` entry, then remove the version section from this file.
|
||||
- Release gate: `v0.1.0` is tagged only on the owner's explicit go-ahead once the release checks pass, not automatically when the checkboxes close.
|
||||
|
||||
## 0.1.0 — Local setup and walkable Hollywood block (weeks 1–6)
|
||||
|
||||
### Environment setup
|
||||
|
||||
Status detail in [Docs/setup.md](Docs/setup.md); pins in [Docs/toolchain.md](Docs/toolchain.md). The workstation audit is local only.
|
||||
|
||||
- [x] Update Bazzite using its supported mechanism; verify NVIDIA driver and Vulkan operation.
|
||||
- [x] Register an Epic account and accept the Unreal license; obtain a pinned Linux engine build or build from Epic's authorized source repository.
|
||||
- [x] Validate Unreal runs on Bazzite before asset production (not an officially supported distribution). 2026-11-07: headless `-NullRHI` smoke test **and** full editor GUI launch with the Vulkan RHI passed — device `NVIDIA GeForce RTX 5070 Ti`, Vulkan loader 1.4.350, `VULKAN_SM5`, map check 0 errors. Only benign log noise (Android Turnkey status, telemetry DNS failures).
|
||||
- [x] Install the engine-required compiler/SDK, Git, Git LFS, and an editor; use Distrobox for isolated CLI dependencies where useful. clang 23.1.4 / cmake 4.3.0 / ninja 1.13.2 installed; this engine build bundles no Linux clang, so the system compiler is the toolchain. **Accepted 2026-11-07:** the first C++ game-module compile and link (`libUnrealEditor-GigLine.so`) succeeded with system clang.
|
||||
- [x] Pin Blender, MPFB, Blosm, and QGIS versions; confirm add-on compatibility; record in `docs/toolchain.md`. Done: Blender 5.2.0 LTS, MPFB 2.0.18, Blosm 2.7.28, QGIS 4.2.3 with PROJ 9.9.0 (stale `lts` removed 2026-11-07), Unreal 5.8.4 finalized as pin after the editor GUI launch.
|
||||
- [x] Create repository structure (`Game/`, `Art/`, `Geo/`, `Tools/`, `Docs/`) with LFS tracking and ignore rules applied.
|
||||
- [x] Keep project and Derived Data Cache on SSD storage; reserve several hundred GB for engine, assets, caches, builds.
|
||||
|
||||
### Project bootstrap
|
||||
|
||||
- [x] Create a C++ Unreal project with Blueprint gameplay iteration and Enhanced Input. Created 2026-11-07 at `Game/GigLine/GigLine.uproject` (primary game module + default game mode, Enhanced Input plugin + input classes in `Config/DefaultInput.ini`); `GigLineEditor` target compiles clean with system clang (UBT: Result Succeeded).
|
||||
- [x] Package and launch a blank Linux build. 2026-11-07: UAT `BuildCookRun` (cook + build + stage + pak, Development config) succeeded in 56 s; 1.1 GiB archive at `/run/media/system/DATA/Builds/GigLine` (outside the repo, uncommitted). `GigLine.sh` launched on the desktop session, created a Vulkan swapchain, and rendered 759 frames across a 60 s test. Known minor: one handled `PSOPrecache` ensure fires at exit only; not blocking, watch it in `0.1.x`.
|
||||
- [x] Export one static mesh from Blender and import into Unreal; verify scale and materials. 2026-11-07: calibration scene (three 1 m cubes at origin / +10 m east / +10 m north) exported from Blender with preset `ue_metric_v1` (`Tools/scale_test_export.py`) and imported headless via `Tools/ue_scale_test_import.py`. Measured in UE: cubes exactly 100.00 cm, origin preserved, material imported. Axis mapping: **east → +X, north → −Y, up → +Z** (the Y mirror is inherent to the right-handed→left-handed conversion; importer handles winding).
|
||||
- [x] Export one MPFB character with baked materials and deform skeleton; verify import. 2026-11-07: MPFB 2.0.18 generated human (19 158 verts, 1.66 m tall) + standard rig with weights (137 bones) + v2 skin baked to a 1024² diffuse texture (`Tools/mpfb_character_export.py`, export preset `ue_character_v1`). Imported headless (`Tools/ue_character_import.py`) into `/Game/Test/Character`: `SkeletalMesh` + 138-bone `Skeleton` + `Material` with the baked `Texture2D` assigned to slot 0. Quirks recorded: 5.8 Interchange skips materials for skeletal FBX imports (finished in script); Blender 5.2 dropped the FBX `armature_nla` option; the baked image needs `image.filepath` set for FBX to reference it.
|
||||
- [x] Document initial setup in `Docs/`: engine install, project checkout, fresh-checkout build procedure. 2026-11-07: `Docs/setup.md` reconciled with reality (all engine/bootstrap items marked done with evidence); `Docs/build.md` completed with the fresh-checkout build, packaging, and headless-content-check procedures plus known engine quirks.
|
||||
|
||||
### Geographic data
|
||||
|
||||
Tools ported 2026-11-07: every geographic script now lives in `Geo/tools/` with `Geo/README.md` listing its purpose, and the Blender-side builders moved next to their outputs in `Art/blender/*/`, importing the shared helpers and the single unit conversion from `Geo/tools/osm_common.py`.
|
||||
|
||||
| Tool | Purpose |
|
||||
| --- | --- |
|
||||
| `osm_common.py` | parse `.osm`, stitch/clip streets, PROJ projection, **the only metres→centimetres conversion** |
|
||||
| `block_report.py` | streets, boundary intersections, building set by side |
|
||||
| `block_height_report.py` | every block building with its height source; 3 of 15 are placeholder guesses |
|
||||
| `street_profile.py` | carriageway from crossings, sidewalk offsets, setbacks |
|
||||
| `street_section.py` | DEM cross-sections, crown and gutters |
|
||||
| `elevation_probe.py` | 3DEP relief sampling |
|
||||
| `dem_stats.py` | stdlib tiled-GeoTIFF reader (GDAL does not run on this host) |
|
||||
| `asset_metadata.py` | writes and audits the `<asset>.geo.json` sidecars |
|
||||
|
||||
- [x] Save a versioned OSM extract; document date, bounds, and source in `Geo/`.
|
||||
- [x] Acquire separately licensed elevation data if needed. Needed and acquired: USGS 3DEP 1 m DEM in EPSG:26911, public domain, NAVD88, 984 KB committed (`Geo/manifests/2026-11-06-3dep-dem.md`); measured relief 3.94 m.
|
||||
- [x] Download the 3DEP 1 m DEM for the demo bounds, reproject it to EPSG:26911 with the recorded origin and vertical datum, and record the source, clip bounds, and checksum in `Geo/`.
|
||||
- [x] In QGIS, set a suitable local projected CRS (e.g. EPSG:26911) and record a local origin. EPSG:26911, origin and projected easting/northing are recorded in `Geo/manifests/local-origin.md` with PROJ 9.9.0 control points; QGIS 4.2.3 is installed for the DEM reprojection step.
|
||||
- [x] Verify the address, building footprints, and demo boundaries for 6840 Hollywood Blvd against source data.
|
||||
- [x] Import OSM blockouts through Blosm. Done 2026-11-06: `Art/blender/blockout/blockout-2026-11-06.blend` (86 meshes, scale 1:1 against OSM, re-framed into EPSG:26911 with a 0.0 cm affine residual); tooling for the cleaning pass lives in `Geo/tools/` (height provenance, block report) and `Art/blender/blockout/blosm_blockout.py`. The remaining **cleaning/detailing (height provenance for 3 of 15 buildings, untextured roofs/facades, Blosm `setupScript` façade styles) is now tracked in `0.1.2` (placeholder heights) and `0.1.4` (Proper building façades).**
|
||||
- [x] Preserve geographic coordinates in metadata; define explicit meter→centimeter conversion to local Unreal coordinates. Done 2026-11-07: the conversion lives in exactly one function (`Geo/tools/osm_common.py::to_unreal_local`) and every exporter must call it; `<asset>.geo.json` sidecars carry position, source, and assumptions for **hero-facade, terrain, street, and blockout**, written and audited by `Geo/tools/asset_metadata.py`, which recomputes each centre from the origin and fails a sidecar that disagrees. Props follow the same schema when they are imported. The frame is defined (`Geo/manifests/local-origin.md`: EPSG:26911, origin Hollywood × Highland, X east / Y north / Z up) and the ×100 conversion is now **verified** by the 2026-11-07 scale test, with the axis mapping recorded (north realizes as UE −Y). Left: build the production export preset for the actual site meshes using these settings.
|
||||
|
||||
### Review scene and player placement
|
||||
|
||||
Owner: this session. Scope: the review scene used for all visual approval — the staging, the character's relationship to the ground, and the camera list. Nothing in `Asset production` or `Gameplay` continues until these pass.
|
||||
|
||||
- [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-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.
|
||||
|
||||
### Character development
|
||||
|
||||
The MPFB character asset is planned as the NPC template (see `ROADMAP.md`). Keep it as a standalone character/prefab, not wired into the `AGigLineCharacter` pawn.
|
||||
|
||||
- [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`).
|
||||
- [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` (☑ approved 2026-11-07).
|
||||
- [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.
|
||||
- [x] Collect reference photography for manual façade work. Local only, never committed: `Art/reference/` is gitignored. **74 images across 13 folders**: hero façades to 4k, the El Capitan Theatre exterior series, premiere-night staging, Ovation Hollywood, the north side, the Lee Drug neighbour. **2026-11-08:** both open gaps closed from Commons — `el-capitan-entrance/` (Andreas Praefcke, CC BY 3.0: isolated hero entrance + entrance detail) fills the door-recess gap, and `el-capitan-night/` adds a night/marquee pair (CC BY / CC BY-SA, next-door theatre — proximity evidence only for the hero).
|
||||
- [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-hero-portals`, `review-hero-facade-front/oblique`). Next pass: banner and window placement, then materials.
|
||||
- [x] Model surrounding block frontage. **Done 2026-11-07, screenshots approved.** The five remaining south-side buildings verified for the block (`Geo/verification/2026-11-06-el-capitan-block.md`) are exported in place from the OSM blockout by `Tools/export_block_frontage.py` -> `Tools/ue_import_block_frontage.py` -> `/Game/Hollywood/Frontage/`, and staged by the demo builder: 6922, 6902, 6838 El Capitan Theatre, 6822 Budget, 6806-6820, 6800 Lee Drug. **Adding them exposed a pre-existing placement bug**: UE south is +Y (the south sidewalk is Y +718..+1447) but the hero facade sat at Y -1450 (north side) and X -12024..-9420, i.e. 26 m east of its own footprint and on the wrong side of the street; the two north-side buildings were likewise on the south side. The hero is now at X -13336 / Y +1307 (inside the frontage gap between 6902 and 6838) and the north buildings are back on the north side (Y -1802..-9431). The sun was raised to pitch -62 so both frontages read instead of one being silhouetted.
|
||||
- [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).
|
||||
- [x] Build sidewalks, roads, and collision meshes. Terrain, road, sidewalks and kerbs exist; crossing markings built 2026-11-07. **Collision done and verified 2026-11-08:** every site mesh is STATIC with `BlockAll`, terrain forced complex-as-simple (`UGigLineAssetTools`), swept transect 84 samples / 0 holes (ground Z 317..395). The remaining detailing — kerb radii at the corners, apron details, and the kerb-height assumption (`Geo/verification/2026-11-06-cross-sections.md`) — is tracked as `0.1.1` patch tasks (Sidewalk outer edge, Crossing ramp gradient, Kerb height).
|
||||
- [x] Materials and look development for all exported assets. **Done 2026-11-07, screenshots approved.** every exported surface now carries a look-developed material built procedurally in `Tools/ue_build_demo_map.py` (`ensure_material`): base colour with a world-space noise blend between two shades for large-scale variation, plus an explicit roughness and specular. Set is `M_Asphalt` 0.92, `M_Concrete` 0.88, `M_KerbConcrete` 0.85, `M_Ground` 0.98, `M_RoadPaint` 0.62, `M_FacadeStone` 0.72 (hero façade) and `M_Stucco` 0.86 (TCL, Tussaud's), assigned by mesh and by actor label. Materials are rebuilt on every run so a stale asset cannot mask a look change. The richer texture-based pass (baked/procedural brick, brick_facade and seamless_concrete generators) stays in the `0.1.4` façade patch.
|
||||
|
||||
### Gameplay
|
||||
|
||||
- [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`).
|
||||
- [x] Collision, reset, and pause functionality. Reset (**R**) and pause (**Escape**) implemented in `AGigLineCharacter` with `/Game/Input/IA_Reset` and `IA_Pause`. **Collision root cause found 2026-11-08:** the "fall-through" was never a fall — the imported `Terrain_DEM` had only a bounding-box simple collision proxy, so the player stood on an invisible lid 8 m above the street (every downward trace hit the terrain at Z 819). Fixed by forcing complex-as-simple collision on the terrain (`UGigLineAssetTools`, C++) and saving the asset; the demo spawns at `(-13336, -1150, 600)` and lands on the road at Z 456. **Verified 2026-11-08** by a scripted check (`-qaselftest`, core ticker so pause cannot freeze it): walk 761 cm in 2 s with Z steady, reset returns 0 cm from spawn, pause reports `IsGamePaused()` 1, unpause 0 — `RESULT ... PASS`. Writing it found a real bug: `ResetToStart()` teleported to the mid-air PlayerStart (Z 600), dropping the player 1.4 m on every reset; `StartLocation` is now captured on the first grounded frame. A manual smoke test is still worth doing before the release tag.
|
||||
- [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.
|
||||
|
||||
### Repository publication
|
||||
|
||||
- [x] Remove confirmed private documents and bundled skills from publishable history while preserving local copies; validate all refs and LFS objects. Rewritten 2026-11-07; original history is in a separate private local backup.
|
||||
- [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] 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`.
|
||||
- [x] Review ODbL obligations for each shipped derivative database or produced work before public release. **Done 2026-11-08** — full review recorded in `Docs/odbl-review.md`: the shipped streets/footprints/sidewalks are a Produced Work of the OpenStreetMap database; obligations held are on-screen attribution (`AGigLineHUD`), the ODbL link, and the committed source extract with provenance; share-alike applies to the data layer only (project code/art stay CC0). THIRD_PARTY_NOTICES and `Docs/licensing.md` updated.
|
||||
|
||||
### Release checks - active - 01a1b26b-3c94-707f-9665-2f6b4a79b564 (branch `qa-diagnostics-0.1.0`)
|
||||
|
||||
- [x] Player can traverse both sides of the demo without falling through geometry. **Verified 2026-11-08:** Blender pre-check plus an in-engine swept transect (`-qaselftest`) over the north sidewalk, carriageway and south sidewalk from X -14900 to -9420 — 84 samples, 0 holes, ground Z 317..395 (sidewalk 395, road 366, south walk 317). The player spawns at Z 456 and stays there for the whole run (`fall=0`, single Z).
|
||||
- [x] Building placement, street scale, and site identity checked against references. **Done 2026-11-08:** rendered current DemoMap content, probed world-space geometry (road 24.3 m vs ref 20.9–25.9 m; sidewalk centreline offsets 12.5/13.2 vs ref 12.6/13.6 m; hero frontage 26.0 m, setback ~13 m vs ref 25.75/14.5 m; frontage + north buildings in verified OSM positions), recorded PASS + deliberate deviations (flat blockout surfaces → `0.1.4`, kerb upstand → `0.1.1`, kerb-flush ramps → `0.1.1`) in `Docs/release-checks.md`, and fixed the mis-aimed north-buildings camera (was 9.5 km west → 85% sky; now frames the buildings). Final human verdict pending on `Screenshots/demo/*`.
|
||||
- [x] No blocking collision or packaging defects. **Done 2026-11-08:** extended `-qaselftest` — transect now 1456 samples / 16 rows including the kerb/road/sidewalk seam Ys (0 holes), plus a ground-referenced 30 m wall probe (0/35 blocking hits; no invisible walls). Walk/reset/pause all PASS on the packaged build; `GigLineShotActor` now skips under `-qaselftest`. Evidence in `Docs/release-checks.md` §`0.1.0` audit note.
|
||||
- [x] Remove TEMP QA diagnostics (`GigLine SIM` / `GigLine GROUND` log lines and the settle-timer log) from `GigLineCharacter.cpp` before the release tag, or gate them behind a cvar. **Done 2026-11-08:** SIM/GROUND probes were already removed in the input fix (PR #8); the remaining settle-timer + `GigLine IN:` input-setup logs are now gated behind the `gigline.SetupLogs` cvar (default 0 in `DefaultEngine.ini [ConsoleVariables]`, re-enable at runtime). Verified on the packaged build: 0 setup-log lines, `-qaselftest` still all PASS.
|
||||
- [ ] 60 FPS at 1440p on the dev workstation (Bazzite, Ryzen 7 7700X, 64 GB RAM, RTX 5070 Ti 16 GB) using a documented quality preset; record upscaling state; report performance without frame generation.
|
||||
- [ ] Fresh project checkout builds with the documented external engine installation.
|
||||
- [ ] Package Linux build with documented controls.
|
||||
- [ ] Tag `v0.1.0` and write `CHANGELOG.md` entry; then remove this section.
|
||||
|
||||
### Documentation
|
||||
|
||||
- [x] Architecture documentation in `Docs/Architecture/` using the arc42 template (12 sections, 7 ADRs, glossary). Markdown is the canonical format; all `.md` passes `prettier --check`. Conversion chain: asciidoctor → docbook5 → pandoc(gfm) → prettier.
|
||||
- [x] Doc toolchain installed: pandoc 3.13 (`~/.local/bin`), asciidoctor 2.0.26 (rpm-ostree, pending reboot), prettier 3.9.10 (npm global).
|
||||
|
||||
## 0.1.1 — Collision fixes (patch)
|
||||
|
||||
Suggested blender skills: **collision-proxy** (UCX/UHX naming, convex hulls, simple collider meshes — the core of the authoring pass), **qa-review** (validation checklists, viewport screenshots, ship/no-ship verdicts for the audit), **asset-optimization** (pre-export validation of every collider). Note: these skills assume MCP-driven Blender; use them as method guides for the headless scripts.
|
||||
|
||||
### Patch tasks
|
||||
|
||||
- [ ] **Sidewalk outer edge against terrain.** The pre-check measured a **15.8 cm** step where a walk sample crosses from `Terrain_DEM` onto `Sidewalk_South` (`Art/blender/README.md`, s≈207 m). Mostly hidden by buildings; visible wherever the frontage is missing. Fix by extending the sidewalk mesh to meet the terrain, or by lowering the outer lip.
|
||||
- [ ] **Crossing ramp gradient.** The kerb-flush transitions measure **10–13 cm over 1.5 m ≈ 10 %**, steeper than the 8 % a real ramp uses (`Geo/tools/street_section.py` output, s≈33, 39, 126 m). Grade the three ramp openings properly.
|
||||
- [x] **Collision authoring pass.** Terrain and site meshes use complex-as-simple / `BlockAll` (forced by `UGigLineAssetTools`, verified 2026-11-08 with 84-sample transect). Remaining: simple convex hulls per building (currently using default collision). Record the final settings in `Docs/build.md`.
|
||||
- [ ] **Kerb height is an assumption.** 0.15 m modelled, 0.13 m as built, and the 3DEP DEM cannot resolve a kerb at all. Check against the photographs and record the final figure.
|
||||
- [ ] Audit and fix any collision gaps or fall-through geometry found in `0.1.0` in the engine.
|
||||
- [ ] Regression-test traversal on both sides of the demo.
|
||||
- [ ] Verify no new packaging defects.
|
||||
- [ ] Tag `v0.1.1` and write `CHANGELOG.md` entry; then remove this section.
|
||||
- Release gate: a version is tagged only on the owner's explicit go-ahead once its release checks pass, not automatically when the checkboxes close.
|
||||
|
||||
## 0.1.2 — Scale and façade corrections (patch)
|
||||
|
||||
|
||||
Reference in new issue
Block a user