Skip to content

cockpit/GeoHelix: Garmin-as-surfel step 1 — continuous residue + smoothed normals#94

Merged
AdaWorldAPI merged 1 commit into
mainfrom
claude/geo-shader-lighting
Jul 8, 2026
Merged

cockpit/GeoHelix: Garmin-as-surfel step 1 — continuous residue + smoothed normals#94
AdaWorldAPI merged 1 commit into
mainfrom
claude/geo-shader-lighting

Conversation

@AdaWorldAPI

Copy link
Copy Markdown
Owner

Follow-up to the merged #93 (sunset + hypsometric + auto-scaled relief), on the same GeoHelix fork so it carries zero risk to the /helix anatomy body. This is step 1 of "treat Garmin as the surfel the body already has" — the client-side half, sharpening the surface texture on the already-live /garmin/grand-canyon render.

A clean one-commit diff (30 +/15 − on cockpit/src/GeoHelix.tsx); #93 merged via a merge-commit so main shares this branch's base and nothing already-merged re-appears.

What changed

  • Smoothed normals (±2 stencil). The per-vertex terrain normal is now a central difference over a ±2 neighbourhood (r±2, c±2) instead of ±1. On steep canyon walls the ±1 stencil picks up single-cell quantization steps and reads as faceted grain; the wider stencil averages that out, so lit slopes read as slopes, not a comb. True-scale is preserved (the gradient is still in display units) — only the smoothing window widened.
  • Continuous corner value-noise residue. The within-KIND helix::CurveRuler brightness (the ±18 % "surfel sparkle" the anatomy body carries per-vertex) was, in the old path, sampled per grid cell — so it stepped discontinuously at every cell boundary (the seam artifact). It's now a proper value-noise: the golden-spiral residue is evaluated at integer lattice corners (mix17-hashed, cached) and smoothstep-trilinear-interpolated between them, so it's C1-continuous across cells and isotropic (3D hash, no directional bias). sweet = 0.90 + 0.18·res.

This mirrors geo/src/kurvenlineal.rs's inter-family fix from #91 (corner value-noise, not per-cell step) on the decode side, so the client and the bake reconstruct the residue the same way.

Verify

  • npx tsc --noEmit — clean (exit 0).
  • Client-only GeoHelix.tsx change (not hub-client/), so no changelog entry required.
  • /garmin/grand-canyon renders the recognizable canyon (mesa, gorge, side-canyons, Stream-KIND drainage, sunset light); the within-KIND texture is now continuous across cell seams rather than stepped.

Not in this PR (follow-ups, in order)

  1. OSM ⊕ Garmin drape — its own PR: OSM semantic features (roads / trails / rivers / labels) draped onto the Garmin height surface, aligned via the shared HHTL address space (design spine: Garmin owns height + terrain material · OSM owns semantic features · HHTL owns alignment · Renderer owns fusion).
  2. Iceland height dequantize — bake-side, for the /garmin/iceland ver-8 grid's needle field (F16 height quantization over Iceland's tiny true-scale span).

🤖 Generated with Claude Code

https://claude.ai/code/session_012jEwwaT5JZ5x8qWvcnaMYC


Generated by Claude Code

…thed normals

Toward "treat Garmin as the surfel the body has": upgrade the ver-8 grid decode's
per-vertex surfel quality so terrain reads like the /helix body's surfel field
rather than a quantized heightfield carpet.

- CONTINUOUS residue: the within-kind CurveRuler brightness texture was applied
  per-CELL (one value per floor(pos·detail) cell → stepped at every boundary, the
  intra-family discontinuity). Now it's the inter-family CONTINUOUS version —
  the stride-4-over-17 value sampled at integer lattice CORNERS and
  smoothstep-interpolated between them (value-noise), matching
  geo/src/kurvenlineal.rs. The surfel texture flows across cells instead of
  blocking.
- SMOOTHED normals: widen the central-difference gradient stencil from ±1 to ±2
  so the shading stops catching every one-cell quantization stair (the "light on
  every numeric step" needle look) — WITHOUT touching the geometry.

Verified: /garmin/grand-canyon screenshot — the plateau reads as a smooth mesa,
the walls as clean cliffs with the dendritic side-canyons resolved, the drainage
network crisp. tsc + vite build clean.

Note: this is the surfel-QUALITY half. The OSM⊕Garmin overlay (drape OSM
features onto the Garmin surfel via the shared HHTL address) and a bake-side
height dequantize for Iceland's steep coastal cliffs are the remaining pieces of
the "Garmin as surfel" arc.

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

coderabbitai Bot commented Jul 8, 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: 42 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: da93d202-1f65-4f20-8afb-b889494dcdef

📥 Commits

Reviewing files that changed from the base of the PR and between b5c3cd8 and 3d54328.

📒 Files selected for processing (1)
  • cockpit/src/GeoHelix.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.

@cursor

cursor Bot commented Jul 8, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_d20b25ab-4fe9-42bc-b024-122cdc24d65b)

@AdaWorldAPI AdaWorldAPI merged commit c75253a into main Jul 8, 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