Skip to content

Preserve E57 intensity limits and scanner grid frames - #64

Open
boazeggs wants to merge 75 commits into
OpenAEC-Foundation:mainfrom
boazeggs:codex/e57-reader-validation
Open

boazeggs wants to merge 75 commits into
OpenAEC-Foundation:mainfrom
boazeggs:codex/e57-reader-validation

Conversation

@boazeggs

@boazeggs boazeggs commented Nov 6, 2026

Copy link
Copy Markdown
Contributor

The additional E57 checks found two real interoperability failures in the Riegl fixture:

  • Raw Float32 intensity records survived export, but a scalar intensity maximum encoded as ScaledInteger(32767, scale=1/32767) was rewritten without its scale. Its physical value changed from 1.0 to 32767, and PDAL read the first normalised intensity as 0 instead of 8190.
  • Replacing the original sensor index bounds with smaller derived bounds changed 873 positions in CloudCompare's last scan, by up to 19.11 m, despite identical raw point records and poses.

Resolve scaled and mixed limit pairs to physical doubles before normalising or writing. Preserve original point records/prototypes, and retain the original sensor grid frame—including absent bounds—in filtered and scan-preserving scene exports. Reuse the existing complete-packet iterator for valid alignment packets in the scene path. Version cached normalised samples only for affected sources; plain-limit E57 cache keys, including the 199M-point BLK2GO fixture, remain unchanged. A changed/invalid source remains a cache miss, with normal reader error handling.

Refs #32 and #42. This follow-up should land with the integration before declaring the E57 acceptance work complete. It builds on #63 at 0962214392f806bdf4c95bcafaecce081bfd2276 (and includes #62/#53). The incremental fix is ff9b5307b84122845c3c443b3d5267878e3f4160; previous review heads remain unchanged. Normal merge commits preserve all earlier PR heads as ancestors.

Validation:

  • 1,486 workspace tests passed, 0 failed, 12 ignored, including six new focused regressions for physical intensity, 12-bit RGB/recolouring, mixed types, malformed limits, grid preservation in filtering/scenes and selective cache invalidation. The existing changed-source cache regression also passes.
  • Workspace/all-target and minimal-core Clippy pass with warnings denied; Rustfmt, Python syntax and diff checks pass. The shared raw-field validator is an unchanged extraction.
  • Actual identity exports of the 471-point / six-photo BLK2GO section and the 1,095,702-point / five-scan / five-photo Riegl source pass pye57/libE57, PDAL 2.10.2 and an E57-enabled CloudCompare build.
  • libE57 verifies supported point values/prototypes, physical limits, index bounds, station poses, photo bytes/calibration and remapped associations. Complete PDAL and CloudCompare point text is byte-identical before/after export. Original vendor SHA-256 hashes remain unchanged.

Repeatable probe, package pins, tool hashes and recorded before/after evidence.

These are three external applications sharing the C++ libE57 family, independently of the native Rust decoder; this does not establish three independently implemented external decoders. CloudCompare loads the five spherical photos as ordinary images with an unsupported-camera message; their calibration is verified through libE57. PDAL's exposed intensity/RGB is uint16 and CloudCompare's coordinates are float32, so raw records/schema are checked separately. The broader #32 tracker remains open. Vendor files and reader binaries are not redistributed.

Previously affected exports need regeneration from their original source; the discarded scale cannot safely be inferred from a bad export.

DutchSailor and others added 30 commits May 22, 2026 09:37
Combines two tracks into one v0.4.0 release:
- Spoor B: replace in-memory pipeline with COPC streaming + CCCoreLib FFI kernel
- Spoor A: full adoption of @openaec/ui design tokens and components

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
First of five plans derived from the v0.4.0 design spec. This plan handles
only the UI rebrand: install @openaec/ui from GitHub, rename --theme-* to
--oaec-* throughout, remove the multi-theme switcher, single dark theme.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Create src/styles/openaec-overrides.css with composite canvas-grid and ribbon-gradient tokens
- Import openaec-overrides.css between components.css and globals.css in main.tsx
- Strip all four multi-theme blocks from globals.css; replace with single [data-theme="light"] block using --oaec-* tokens
- Update @theme block RHS from --theme-* to --oaec-*
- Rename all remaining --theme-* references in utility sections to --oaec-* equivalents
- Replace hardcoded hex brand colours (#1d4ed8, #2563eb, #fff) with --oaec-accent / --oaec-accent-hover / --oaec-accent-text

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Remove the unscoped 'Input controls - Dark theme' block (~63 lines) from
Ribbon.css — .ribbon-input-group, .ribbon-input-label, .ribbon-color-input,
and the unscoped .ribbon-input/.ribbon-input-row rules were dead code
overridden by the scoped .ribbon-transform-inputs block. Clean stale hex
fallbacks from that scoped block (var(--oaec-bg-input, #0f172a) →
var(--oaec-bg-input), etc.). Update ErrorBoundary inline styles in main.tsx
to match the OpenAEC palette (#1a1a2e→#36363E, #ff6b6b/#ffa07a→#f87171,
#4a90d9→#D97706, #888→rgba(250,250,249,0.6)).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…stem

Plan 1 of 5 toward v0.4.0. Replaces multi-theme styling (--theme-*) with
@openaec/ui tokens (--oaec-*), removes the theme switcher UI and state,
adopts the OpenAEC dark palette with orange accent as the single theme.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds the missing orange File tab as leftmost ribbon-tab (matches the OpenAEC
standard from open-2d-studio); for v1 it triggers the Import handler. Overrides
five tokens in openaec-overrides.css to match the canonical style-book values
(@openaec/ui v0.1.0 is out of sync upstream): panels darker not lighter, borders
neutral grey not orange-tinted, secondary/muted text as warm neutrals.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…rt/Export/About)

Implements the OpenAEC-standard backstage pattern from open-2d-studio. The
orange File tab in the ribbon now opens a full-viewport overlay with a sidebar
(Open / Import / Export / About) and a main content panel per active view.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
After the Authenticode and OpenPGP signing, sign-updates.sh writes a
minisign .sig beside the Windows setup and each AppImage with the
repository's updater key, and the .sig files go on the release. Once the
release is public, a last job makes latest.json with the release kit of
the installer: it checks every signature against UPDATER_PUBKEY and the
tag against native/Cargo.toml, and attaches latest.json last. The OpenAEC
Installer then checks the signature before a silent update
(OpenAEC-Foundation/OpenAEC-Blueprint#33).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants