3D gamut viewer (SceneKit) #28

Open
opened 2026-09-08 17:43:57 +01:00 by gronod · 0 comments
Owner

Summary

Native SceneKit CIELAB viewer. Fix spec 18 §10 traps; do not clone them.

Spec refs

docs/18-gamut-viewer.md (all), 23-assets.md. #179 #185 #112 #225.

Scope

In: .gam parser, SceneKit scene, sRGB overlay, controls.
Out: Metal rewrite, Three.js port, WebGL at boot.

Implementation notes

Parser: two CGATS BEGIN_DATA blocks — vertices VERTEX_NO L a b (discard index, push-order), then faces 0-based concatenated. Strip # comments incl. inline. Non-numeric/arity/plausibility/empty-file warnings. Native faces > convex hull. Vertex-only → hull fallback (dedup by coord key). ASCII only.
Scene: X=a* ±128, Y=L* 0–100, Z=b* ±128. Camera home (180,120,180) lookAt (0,50,0), orbit + damping.
Axis scaffold at (0,50,0). Profile mesh vertex colours Lab→sRGB (D50→D65 Bradford, γ, clamp) opacity 0.88 double-sided.
sRGB reference = bundled REAL sRGB.gam (issue 3), faint fill + edge outline ~15°.
Controls: visibility + opacity per layer; R resets camera on a focusable container.
Load on Stage 5 entry + post-verify. Do not allocate the scene at app launch.
Fix, do not replicate: opacity-inference bug, label-visibility bug, dead keybinding (doc 18 §10).

Rewrite invariants

#179 dual-table + (a,L,b) layout. #185 axes/edges/vertex-colour. #112 density stays 10 (producer). #225 no 3D at boot.

Dependencies

Blocks-on: 3 (asset), 24 (.gam).
Unblocks: none.

Test

  • CI/mock: dual-table / comments / OOB verts / stub→hull fixtures. Parser must run without AppKit window (no window at module load — #212 class).
  • Hardware: N/A.

Acceptance criteria

  • Parser fixtures pass.
  • sRGB overlay renders from the real bundled file.
## Summary Native SceneKit CIELAB viewer. Fix spec 18 §10 traps; do not clone them. ## Spec refs docs/18-gamut-viewer.md (all), 23-assets.md. #179 #185 #112 #225. ## Scope In: `.gam` parser, SceneKit scene, sRGB overlay, controls. Out: Metal rewrite, Three.js port, WebGL at boot. ## Implementation notes Parser: two CGATS `BEGIN_DATA` blocks — vertices `VERTEX_NO L a b` (discard index, push-order), then faces 0-based concatenated. Strip `#` comments incl. inline. Non-numeric/arity/plausibility/empty-file warnings. Native faces > convex hull. Vertex-only → hull fallback (dedup by coord key). ASCII only. Scene: X=a* ±128, Y=L* 0–100, Z=b* ±128. Camera home (180,120,180) lookAt (0,50,0), orbit + damping. Axis scaffold at (0,50,0). Profile mesh vertex colours Lab→sRGB (D50→D65 Bradford, γ, clamp) opacity 0.88 double-sided. sRGB reference = bundled REAL `sRGB.gam` (issue 3), faint fill + edge outline ~15°. Controls: visibility + opacity per layer; R resets camera on a **focusable** container. Load on Stage 5 entry + post-verify. Do not allocate the scene at app launch. Fix, do not replicate: opacity-inference bug, label-visibility bug, dead keybinding (doc 18 §10). ## Rewrite invariants #179 dual-table + (a,L,b) layout. #185 axes/edges/vertex-colour. #112 density stays 10 (producer). #225 no 3D at boot. ## Dependencies Blocks-on: 3 (asset), 24 (`.gam`). Unblocks: none. ## Test - CI/mock: dual-table / comments / OOB verts / stub→hull fixtures. Parser must run without AppKit window (no `window` at module load — #212 class). - Hardware: N/A. ## Acceptance criteria - [ ] Parser fixtures pass. - [ ] sRGB overlay renders from the real bundled file.
gronod added this to the M6 — Gamut, Stage 0, CGATS, release milestone 2026-09-08 17:43:57 +01:00
gronod added the
Priority
High
2
Project/ICCery-v2Feature/BackendFeature/UI
labels 2026-09-08 17:43:57 +01:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: gronod/iccery-v2-mac#28