Skip to content

Commit 951760d

Browse files
authored
Merge pull request #6 from Aurtechmx/feat/v0.4.7
Feat/v0.4.7
2 parents b1ab2d6 + 01135fe commit 951760d

127 files changed

Lines changed: 5637 additions & 845 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CHANGELOG.md

Lines changed: 82 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,85 @@
22

33
The format is based on Keep a Changelog and the project follows Semantic Versioning.
44

5+
## [0.4.7] - 2026-06-15
6+
7+
A correctness and honesty pass across the load, export, and analysis paths,
8+
alongside a few accessibility and workflow additions.
9+
10+
### Added
11+
12+
- **Colourblind-safe classification palette.** A checkbox in the Classes panel
13+
recolours the classes with an Okabe-Ito categorical palette (ground orange,
14+
vegetation as lightness steps of bluish-green, buildings vermillion, water
15+
blue) that stays distinguishable under the common colour-vision deficiencies.
16+
The class label and count stay on every row, so colour is never the only cue.
17+
- **Annotation grouping.** The Annotations panel and the PDF report now open
18+
with a one-line summary of the notes — totals, the per-category breakdown, and
19+
how many areas they fall across — so a dense set reads at a glance.
20+
- **Workflow recorder.** Record a sequence of camera moves and tool actions and
21+
replay it (on the same scan), with a settings popup for the file format,
22+
save destination, start/stop shortcut, replay speed, a pre-record countdown,
23+
which action families are captured, and loop replay. Records actions only —
24+
never scan data.
25+
- **Signal-tier cue on the Dataset Intelligence card.** A quiet coloured dot
26+
marks each row's qualitative tier; terrain complexity stays neutral (it is
27+
descriptive, not a quality) and a missing signal is muted. The colourblind
28+
toggle also re-themes these status dots and the confidence chip.
29+
- **Recommended-view chip.** After a scan loads, a small dismissible chip
30+
suggests the best camera preset (top-down for a wide classified surface,
31+
oblique for a colour scan, isometric otherwise); one click applies it.
32+
- **Profile stations on the cloud and in the report.** A cross-section profile
33+
drops small station markers along the section line in 3D, and the PDF report
34+
now draws the profile as a sharp vector chart, not just the station text.
35+
- **More accessible report PDFs.** The document title is announced instead of
36+
the filename, and the document language is tagged for correct pronunciation.
37+
38+
### Fixed
39+
40+
- **Empty files are rejected with a clear message.** A file that decodes to
41+
zero points is no longer opened into a blank, unframable scene; it is
42+
rejected at the parse stage with a message explaining there are no points to
43+
display. A point cloud with no points now reports a finite bounding box
44+
rather than an infinite one, so nothing downstream can target a degenerate
45+
camera.
46+
- **Reprojection never ships non-finite coordinates.** A transform whose output
47+
falls outside the target projection's valid area (proj4 returns Infinity or
48+
NaN without raising an error) is now treated as a failed transform: the
49+
coordinates are left in their source system and the converter reports how many
50+
points were affected, instead of writing a file with NaN coordinates.
51+
- **Contour map sheet reports an unmeasured interpolation honestly.** When there
52+
are no contours to measure, the legend reads "Interpolated fraction — not
53+
measured" instead of a fabricated "0% interpolated".
54+
- **Measured areas read the same in the PDF report as on screen.** The report's
55+
area formatting is single-sourced from the live measurement overlay, so a
56+
polygon documents itself in the same units (m² / ft² / acre) the user saw
57+
while measuring.
58+
- **Point density reads "—" when it is unknown.** With neither a measured
59+
density nor the point count and bounds to derive one, the dataset card no
60+
longer shows a confident "Sparse"; it shows "—", matching how terrain
61+
complexity and ground visibility already report a missing signal.
62+
- **Disposal.** The colour-recompute throttle's trailing timer is cleared when a
63+
viewer is torn down, and a streaming (COPC) cloud now closes its underlying
64+
file/range reader when detached, so neither lingers after teardown.
65+
- **Load errors are described precisely.** A typed load failure now keeps its
66+
category as it crosses from the decode worker to the main thread, so the
67+
message shown is the exact one for the failure rather than a best-effort guess.
68+
- **Foot-based coordinate overrides.** When a coordinate system is assigned by
69+
hand, its linear unit is resolved from the CRS registry rather than assumed to
70+
be metres, so a foot-based system scales measurements correctly.
71+
72+
### Changed
73+
74+
- **Large text scans load on tighter memory.** The XYZ/CSV loader releases its
75+
intermediate buffers as it builds the final arrays, lowering peak memory by a
76+
full copy of the cloud on the largest files.
77+
78+
- **One byte-size formatter** is shared across the stage, batch converter, debug
79+
overlay, and streaming panels, so a file size reads identically everywhere.
80+
- **The unit test suite is split into four buckets** (`test:unit`,
81+
`test:terrain`, `test:ui`, `test:slow`) that together cover the whole suite,
82+
so it can run in parallel.
83+
584
## [0.4.6] - 2026-06-14
685

786
Phase 1 of the design audit (visual-only; verdict-as-hero, two-tier surfaces,
@@ -13,8 +92,8 @@ otherwise. The interior floor plan remains an experimental PREVIEW, now backed b
1392
an explicit wall-graph reconstruction and flood-fill room segmentation with
1493
claim-accurate labels throughout. Plus nine label-vs-value drift fixes (incl.
1594
foot-CRS / geographic-unit correctness and the edge-risk wording) and mobile
16-
touch-target / safe-area improvements. Three more high-visibility, low-risk wins
17-
round it out: the plumbed-but-headless floor-plan export knobs get a small
95+
touch-target / safe-area improvements. Three more visible improvements:
96+
the plumbed-but-headless floor-plan export knobs get a small
1897
UI (still an experimental PREVIEW), the last flagged capture-quality
1998
label-vs-value drift ("Coverage … % of footprint" → "Bounding area filled") is
2099
closed, and the streaming loader's indeterminate text becomes an honest
@@ -964,7 +1043,7 @@ onboarding tour.
9641043

9651044
### Added
9661045

967-
- (2026-06-12 amendment) Floor Plan Preview sheet quick wins — presentation
1046+
- (2026-06-12 amendment) Floor Plan Preview sheet refinements — presentation
9681047
and threading over data the pipeline already computes (the wall-graph /
9691048
room-segmentation engine itself stays scheduled for 0.4.6; the export
9701049
remains a labelled, experimental preview):

CITATION.cff

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ authors:
1212
- name: "Aurtech"
1313
license: MIT
1414
repository-code: "https://github.com/aurtechmx/openlidarviewer"
15-
version: 0.4.6
16-
date-released: "2026-06-13"
15+
version: 0.4.7
16+
date-released: "2026-06-15"
1717
keywords:
1818
- lidar
1919
- point-cloud

CONTRIBUTING.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,13 @@ npm test
3939
npm run build
4040
```
4141

42+
`npm test` runs the whole unit suite. It is large, so it is also split into
43+
four coverage-complete buckets you can run individually (and CI runs in
44+
parallel): `npm run test:unit`, `test:terrain`, `test:ui`, and `test:slow`.
45+
The buckets always union to the full suite — a newly added test defaults into
46+
`unit`; `npm run test:buckets:verify` asserts that partition holds. Playwright
47+
specs run via `npm run test:e2e`.
48+
4249
Add or update tests with your change. The algorithmic core is test-first
4350
(Vitest), and the renderer is covered by Playwright. Keep the module
4451
boundaries intact: one file per format or concern, and analysis modules must

README.md

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -115,15 +115,16 @@ OpenLiDARViewer does not claim survey-grade measurement or support for every LiD
115115
- A "Project ready" summary card on load, with a suggested navigation mode
116116

117117
### Annotation, sessions & reporting
118-
- Annotations — drop categorised, titled markers with notes, browse and search them in a panel, capture the camera viewpoint with each, and undo/redo changes
118+
- Annotations — drop categorised, titled markers with notes, browse and search them in a panel, capture the camera viewpoint with each, and undo/redo changes; the panel and the PDF report open with a grouping summary (totals, per-category counts, and how many areas the notes fall across)
119119
- Inspection sessions — export measurements, annotations, and named views to one JSON file and reload them later
120-
- Workflow recorder — temporarily disabled in 0.4.5 while its shortcut and replay-file experience get a design pass (see the CHANGELOG); `.olvworkflow` recording/replay will return in a later release
120+
- Workflow recorder — record and replay `.olvworkflow` files of camera moves and tool actions, with a settings popup for file format, save destination, start/stop shortcut, replay speed, a pre-record countdown, captured action families, and loop replay; records actions only, never scan data, so a recipient needs the same scan open to replay
121121
- Multi-page PDF technical reports — six built-in templates with branding and unit-system awareness
122122
- Visual Export Studio — orthographic RGB, height map, intensity, classification, depth, normal, and contour map exports
123123
- Screenshot export that burns in placed measurements and annotations as inspection evidence
124124

125125
### Interface & accessibility
126126
- Theme system — Dark, Light, High-contrast — with a persisted preference
127+
- A colourblind-safe (Okabe-Ito) classification palette, toggled from the Classes panel, so ground, vegetation, buildings, and water stay distinguishable under the common colour-vision deficiencies; the class label and count stay on every row
127128
- Command palette (`Cmd-K` / `Ctrl-K`) for keyboard-first access to every tool, mode, theme, and export
128129
- Searchable shortcut sheet (`?`) listing every keybinding
129130
- An onboarding tour that walks new users through the empty state, tool dock, and Inspector
@@ -160,10 +161,10 @@ score, surface models (DSM, canopy height, slope, multi-directional
160161
hillshade), a single top-level Terrain Assessment verdict, evidence-graded
161162
contour export (GeoJSON / SVG / DXF), a printable map sheet, and a
162163
georeferenced DEM package (ASCII Grid + GeoTIFF). A DTM quality gate
163-
governs whether a professional contour export is offered, and the panel is
164+
governs whether terrain-product export is enabled, and the panel is
164165
explicit that its products are for analysis — not survey certification. The
165166
per-cell confidence is calibrated against measured hold-out error, not
166-
asserted: treat terrain products and DEM exports as deliverable-ready only
167+
asserted: treat terrain products and DEM exports as export-ready only
167168
when the Terrain Assessment reads Good, and as preview otherwise.
168169

169170
See [`docs/terrain-intelligence.md`](docs/terrain-intelligence.md)
@@ -404,27 +405,35 @@ COPC streaming — local and remote — ships in v0.3.0 and is hardened across v
404405

405406
## What's in this release
406407

407-
The current release is **v0.4.5**. The full, dated history is in
408+
The current release is **v0.4.7**. The full, dated history is in
408409
[CHANGELOG.md](CHANGELOG.md); the highlights below are a reverse-chronological
409410
summary.
410411

412+
### v0.4.7 — Accessibility, workflow & honesty fixes
413+
- A **colourblind-safe (Okabe-Ito) classification palette** toggle, an **annotation grouping** summary (totals, per-category counts, areas) in the panel and the PDF report, and a quiet **signal-tier cue** on the Dataset Intelligence card
414+
- The **workflow recorder** returns — record and replay `.olvworkflow` camera/tool sequences with a settings popup (file format, save destination, start/stop shortcut, replay speed, pre-record countdown, capture scope, loop)
415+
- Correctness and honesty fixes: empty files are rejected with a clear message instead of a blank scene; reprojection never ships non-finite coordinates; NAD83↔WGS84-family identity shifts are flagged; measured areas read the same in the report as on screen; unknown signals show "—" rather than a fabricated value
416+
417+
### v0.4.6 — Navigation, design audit & honesty hardening
418+
- Six axis-aligned **standard views** (Top / Bottom / Front / Back / Left / Right) plus an **Orthographic toggle** (a near-parallel long-lens projection) for distortion-free measuring; **icon + label toolbars** across the dock, measurement bar, Layers and Export; a header **full-screen toggle**; and a mobile bottom-sheet reflow
419+
- Phase 1 of the **design audit** (visual-only: verdict-as-hero, two-tier surfaces, quieter typography, all themes re-verified WCAG AA) and an equivalence-gated **WebGPU compute seam** where the CPU stays the reference and the GPU must prove per-session equivalence before it is trusted
420+
- Contour **map-sheet (PDF) fixes** (title/legend overlap, scale-bar unit match, ungeoreferenced sheets drop the graticule and north arrow) and label-vs-value drift fixes
421+
411422
### v0.4.0 – v0.4.5 — Terrain Intelligence + the honesty pipeline
412423
- Confidence-aware **DTM and contour pipeline** behind the **Analyse panel** — ground classification, a gridded DTM with per-cell confidence and hold-out RMSE validation, a 0–100 terrain quality score, surface models (DSM, canopy height, slope, multi-directional hillshade), and a single top-level Terrain Assessment verdict (0.4.0–0.4.4)
413-
- Evidence-graded **contour export** (GeoJSON / SVG / DXF), a printable map sheet, and a georeferenced **DEM package** (ASCII Grid + GeoTIFF), all gated behind a DTM quality check so a professional export is only offered when the surface earns it
424+
- Evidence-graded **contour export** (GeoJSON / SVG / DXF), a printable map sheet, and a georeferenced **DEM package** (ASCII Grid + GeoTIFF), all gated behind a DTM quality check so a terrain-product export is only offered when the surface passes the quality gate
414425
- One **readiness engine** behind every export verdict, a colourblind-safe **Confidence** colour overlay (twin of Coverage), and **profile intelligence** — summary, station table, CSV, sampler controls (0.4.5)
415426
- **True measurement units** on foot-CRS scans, **workflow presets** in the Visuals Studio, and an accessible **onboarding tour** (0.4.5)
416427
- Interior **floor plan** reconstruction — **experimental preview**: a wall-graph + room-segmentation sketch from interior scans, with claim-accurate "preview" labelling throughout; not a survey product
417-
- **Note:** the **workflow recorder** (`.olvworkflow` record/replay) is temporarily disabled in 0.4.5 while its shortcut and replay-file experience get a design pass — it returns in a later release
418428

419-
### v0.3.9 — Premium interaction surface + terrain foundation
429+
### v0.3.9 — Refined interaction surface + terrain foundation
420430
- Smart camera presets — Top, Iso, Oblique, Planar
421431
- Theme system — Dark, Light, High-contrast — with a persisted preference
422432
- Command palette (`Cmd-K` / `Ctrl-K`) for keyboard-first access to every tool, mode, theme, and export
423433
- Workflow recorder — save and replay `.olvworkflow` files of camera moves and tool actions
424434
- Onboarding tour + searchable shortcut sheet (`?`)
425435
- Terrain Intelligence (`src/terrain/`) — honesty-contracted terrain type contracts and the informational Dataset Intelligence card
426436
- Dataset Intelligence card — Point Density, Terrain Complexity, Ground Visibility, Streaming Coverage, Terrain Confidence; honest `` when no signal is available
427-
- Inspector mini-dashboards — sparklines and gauges for live scan telemetry
428437
- Mobile touch model — twist + pinch + pan decomposition with dead zones; opt-in 3-finger zoom for advanced users
429438
- Mobile Scan Intelligence bottom-sheet — peek + tap-to-toggle; tool-dock overflow "More" disclosure
430439
- A coordinate bridge with `CrsService`, UTM + lat/lon inspector readouts, and a streaming-aware Visuals Studio with white balance + auto-balance gated to streaming COPC
@@ -436,7 +445,7 @@ summary.
436445
- FLAI integration — additional curated COPC URLs verified through a CORS + LAS-header probe
437446
- Polygon completion workflow — click first vertex to close, with visual feedback
438447

439-
### v0.3.7 — Premium graphics + new LiDAR capabilities
448+
### v0.3.7 — Rendering quality + new LiDAR capabilities
440449
- EDL + SSAO combined ambient occlusion
441450
- Hillshade overlay colour mode
442451
- Local-density adaptive point sizing

RELEASE_NOTES_v0.4.6.md

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
# OpenLiDARViewer v0.4.6
2+
3+
A redesigned, icon-driven interface, standard CAD-style views, and a
4+
GPU terrain-compute path — all still browser-native, local-first, nothing
5+
uploaded.
6+
7+
## Highlights
8+
9+
- **Six standard views + parallel projection** — snap the camera straight at a
10+
face with Top / Bottom / Front / Back / Left / Right, and toggle an
11+
orthographic (parallel) projection that removes perspective so walls and
12+
floors read flat for measuring. Lives beside the Orbit / Walk / Fly controls.
13+
- **Icon-driven tool surfaces** — the bottom dock, the measurement toolbar, the
14+
Layers list, and the Export panel get a consistent line-icon set, each keeping
15+
its visible text label. Inspect and Probe are drawn as distinct tools. A
16+
full-screen toggle sits in the header. On phones, every panel folds into one
17+
bottom sheet with View / Analyse / Layers tabs, and the measurement tools
18+
reflow into a left-edge rail.
19+
- **GPU terrain compute (equivalence-gated)** — terrain derivative and scatter
20+
passes can run on WebGPU, but the CPU stays the reference: the GPU path must
21+
pass a per-session equivalence probe before it is trusted, and falls back to
22+
the CPU silently otherwise. Correctness first, speed where it is proven.
23+
- **Interior floor plan — experimental PREVIEW** — the wall trace is rebuilt from
24+
an explicit wall graph with flood-fill room segmentation and classified
25+
doorways, and a "Floor plan confidence" summary reports rooms, walls, openings,
26+
and the share of wall evidence that was interpolated. It is an approximate
27+
sketch for inspection, not a measured floor plan.
28+
- **Design pass** — the Analyse verdict (Good / Preview / Limited / Blocked) is
29+
the unmistakable hero of the panel, the stacked side panels read in two tiers
30+
of emphasis, typography is quieter, and the mobile layout reflows for
31+
thumb-friendly targets. Dark, Light, and High-contrast themes are checked for
32+
WCAG AA contrast.
33+
- **Map sheet & honest labels** — the printable contour map sheet no longer
34+
overlaps its title with the legend on long filenames, the contour-interval unit
35+
matches the scale bar (m / ft), and an ungeoreferenced sheet drops the E/N
36+
graticule and north arrow rather than implying a compass frame it does not
37+
have. Several label-vs-value drift fixes land alongside it.
38+
39+
## Polish
40+
41+
- The streaming loader shows a determinate resident-node progress bar instead of
42+
indeterminate text.
43+
- "Solo" in the Layers list is disabled when only one class is present.
44+
- The `?debug` overlay labels the load total as wall-clock time, reports the
45+
CPU / GPU terrain compute path, and no longer prints a misleading "0 draw
46+
calls" on backends that do not report it.
47+
- Floor-plan export options (wall snapping, adaptive band) get a small UI; the
48+
preview stays an experimental PREVIEW.
49+
- Input-escaping hardening across the new icon controls — labels never carry
50+
markup; only trusted static icons are injected.
51+
52+
Measurement and the floor-plan preview are for visual inspection and research,
53+
not survey-grade use. Treat any output as survey-grade only after validating it
54+
against survey-grade data and procedures.
55+
56+
See [CHANGELOG.md](./CHANGELOG.md) for the full list.
57+
58+
## Deploy
59+
60+
Static files — host anywhere (GitHub Pages, Netlify, any CDN). The deploy zip
61+
extracts with web-safe permissions (644 files / 755 directories) and carries
62+
`index.html` plus `assets/` at the archive root.

0 commit comments

Comments
 (0)