Skip to content

cockpit: /ice Iceland scene — height-profile terrain palette, sky, Kurvenlineal breathing#88

Merged
AdaWorldAPI merged 2 commits into
mainfrom
claude/ice-iceland-scene
Jul 6, 2026
Merged

cockpit: /ice Iceland scene — height-profile terrain palette, sky, Kurvenlineal breathing#88
AdaWorldAPI merged 2 commits into
mainfrom
claude/ice-iceland-scene

Conversation

@AdaWorldAPI

Copy link
Copy Markdown
Owner

A dedicated /ice route rendering the Iceland helix bake with height-profile beautification — a sibling to /geo, gated so every anatomy scene (/body, /helix, /torso*, /fma*) stays byte-identical.

What's in

  • /ice route + a single pathScene() helper unifying the two scene resolvers (/geo→osm, /ice→iceland) so the bake-URL and LOD-disable paths can never disagree.
  • Height-profile terrain palette (geo-gated): colour driven by the decoded elevation position.y, normalized against the bake's actual measured [yMin,yMax] (the Iceland bake is true-scale — span ~0.0074 — so [-1,1] normalization would flatten it to all-water) with a sqrt curve for the skewed distribution (39% ocean at exactly 0, ~58% quantized lowland). Bands: ocean → coast/moss → rock → scree → glacier-ice, plus a subtle warm volcanic-highland accent.
  • Procedural sky dome — a BackSide gradient sphere (pale horizon → blue zenith), geo scenes only; no external asset (CSP-safe).
  • Aerial camera for geo scenes (oblique ~35°) so the terrain reads as a landscape under the sky, not edge-on.
  • The Kurvenlineal (helix::CurveRuler stride-4-over-17) ported to GLSL: a deterministic per-vertex phase that (a) synthesises relief detail where the sparse DEM bake has gaps and (b) breathes over time — the horizon gently undulates. Not bit-exact to the Rust CurveRuler (float hash vs u64 integer walk); faithful in spirit ("phase is convention, not data"), per the operator's steer to open marvelous visuals now and motivate the DEM-true improvement next.

Gating

Anatomy scenes: uGeo==0 → aColor*shade, uExag/uRuler/uTime==0/1 → position untouched, PAGE_BG background, fully on-demand rendering. Geo scenes add the palette, sky, aerial camera, and continuous rAF (for the breathing). Zero change to non-geo visuals or idle cost.

Verified

cd cockpit && npm run build (tsc + vite) clean across every iteration. Static frames (headless swiftshader) confirmed the sky gradient, aerial framing, and Iceland silhouette; the Kurvenlineal breathing is live (it's literally what makes the animated canvas never idle).

Honest limitation (follow-on in this PR)

The existing iceland.helix.soa.gz is a sparse, OSM-style point bake (137K discrete "structures", quantized elevation, no feature layers) — so the beautification paints a faint scatter, not solid terrain. A follow-on commit replaces the bake with a real Iceland DEM heightfield (added as a new file, existing bake preserved) so the palette + relief + breathing land on a solid landscape. The shader work here needs zero change when that lands.

🤖 Generated with Claude Code


Generated by Claude Code

claude added 2 commits July 6, 2026 15:42
Add a dedicated /ice route rendering the EXISTING Iceland helix bake
(iceland_latest = iceland.helix.soa.gz, already in the manifest) through
the same BodyHelix Signed360 decoder — equivalent to /helix?scene=iceland,
but a home with height-profile beautification. Client-side render only:
no re-bake, no new network fetch.

What changed:
- Route: /ice → <BodyHelix /> in main.tsx, next to /geo.
- Scene-helper unification: the path→scene mapping (/geo→osm, /ice→iceland)
  now lives in ONE pathScene() helper, read by BOTH fetchSoa() (which bake
  to load) and isGeoScene (whether to disable server LOD + light the geo
  beautification), so the two resolvers can never disagree — the file's own
  comment demanded this. `?scene=<name>` still overrides.
- Height-profile terrain palette (geo-scene-gated via a uGeo uniform):
  colour is driven by per-vertex elevation (display.y), normalized against
  the ACTUAL measured [uYMin,uYMax] (the Iceland bake is true-scale, not
  exaggerated — span ~0.0074 with 39% ocean at exactly 0 and a heavily
  quantized lowland plateau, so [-1,1] normalization would flatten it to
  all-water) with a sqrt curve to spread the skewed highland tail. Bands:
  ocean (deep blue) → coast/moss-tundra (the dominant quantized lowland) →
  brown rock → grey scree → white/pale ice cap, plus a subtle warm
  "volcano" accent in the mid-high band. Water is separated cleanly at the
  exact-0 ocean vs first-land boundary.
- Colour is HEIGHT-ONLY on purpose: the decoded Signed360 normal is bimodal
  for the geo bake (measured 77% |n.y|≈0 / 23% ≈1), so it is not a usable
  continuous slope — classifying rock/scree/volcano from it would produce a
  binary patchwork. The shade lighting term still uses the normal for form.
- Geo relief: a uExag geometry-raise so the true-scale island reads as
  terrain off the y=0 sea plane, plus a 3/4 default camera for geo scenes.
- Procedural sky dome (geo only): a large BackSide sphere with a vertical
  horizon→zenith gradient shader, rendered first (renderOrder −1, depthWrite
  off) so terrain paints over it. No external asset (CSP blocks CDNs).
- Gating leaves anatomy byte-identical: uGeo==0 → exactly the pre-existing
  `aColor * shade` and uExag==1 → position unchanged; the sky dome and geo
  camera are added only when isGeoScene; non-geo scenes keep PAGE_BG.

Honest note: true volcano / lava-field / glacier feature classification
needs a DEM re-bake carrying feature layers; the warm "volcano" band here
is a deliberately-subtle height-derived accent approximation.

Verified: `npm run build` (tsc + vite) passes clean; a headless
swiftshader-WebGL Playwright screenshot of /ice shows the sky gradient and
the Iceland relief with elevation-varied colour; /helix keeps its unchanged
title and same graceful behaviour (its body bake is a release-only asset,
absent locally).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012jEwwaT5JZ5x8qWvcnaMYC
Wires the helix::CurveRuler stride-4-over-17 phase (the sculpt crate's
kurvenlineal) into the geo terrain shader as a GLSL port. Not bit-exact to
the Rust CurveRuler (it walks a u64 place with integer mixing; here we hash
floats), but faithful in spirit: a deterministic bipolar phase regenerated
from each vertex's lattice address — "phase is convention, not data".

Two effects, geo-scenes only (anatomy stays byte-identical: uRuler/uTime 0):
- synthesised relief detail where the sparse DEM bake has gaps, so the
  terrain reads as a living surface instead of a flat scatter;
- breathing: uTime advances every frame and modulates the phase, so the
  horizon gently breathes — a mental horizon that motivates the next,
  DEM-true improvement (per the operator's steer).

Geo scenes now render continuously (rAF) to animate; anatomy stays fully
on-demand (uTime 0, dirty-gating untouched — no idle cost). Builds clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012jEwwaT5JZ5x8qWvcnaMYC
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, you can upgrade your account or add credits to your account and enable them for code reviews in your settings.

@coderabbitai

coderabbitai Bot commented Jul 6, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@AdaWorldAPI, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 11 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: d442327a-c02e-4dc0-afc7-544af6cc8d44

📥 Commits

Reviewing files that changed from the base of the PR and between e045829 and b959fc7.

📒 Files selected for processing (2)
  • cockpit/src/BodyHelix.tsx
  • cockpit/src/main.tsx

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@AdaWorldAPI AdaWorldAPI merged commit f58df77 into main Jul 6, 2026
5 checks passed
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.

2 participants