# Threejs Procedural Planets

> Scale procedural planetary bodies in Three.js r185 WebGPU/TSL. Use when global curvature needs a cube-sphere quadtree, a sustained ground view needs a tangent clipmap, an orbit-to-ground transition needs both, or a gas-giant cloud deck needs body-scale band fields.

- Skill: `linegel/threejs-procedural-planets` (Agent Skill, multi-file: 8 files)
- Install (CLI): `npx skillmds@latest add linegel/threejs-procedural-planets`
- Raw SKILL.md: https://api.skillmd.com/api/skills/linegel/threejs-procedural-planets/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: DevOps & Infra
- Author: linegel (https://skillmd.com/u/linegel)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/linegel/threejs-procedural-planets

---


# Procedural Planets

Choose the body-scale representation first. One set of planet-space causes must
drive geometry, normals, material identity, queries, diagnostics, water/coast
handoffs, and atmosphere inputs.

## Process

1. **Gate body scale.** Test whether curvature, horizon, global geodesy,
   orbit-to-ground transition, or atmosphere coupling is observable. A bounded
   local site belongs to procedural fields and geometry when tangent-plane
   sagitta, normal rotation, geodesic, horizon, and projected errors all pass.
   Read
   [body-model-mapping-and-lod.md](references/body-model-mapping-and-lod.md)
   when deriving the body-scale gate.

   **Complete when:** the accepted camera and data domain either proves a local
   approximation or names at least one body-scale observable that requires this
   skill.

2. **Freeze the body model and units.** Declare center, sphere radius or
   ellipsoid axes in meters, `metersPerWorldUnit`, height and sea-level datum,
   body/world transform, origin policy, surface-coordinate meaning, and
   atmosphere bottom/top geometry. When a sphere approximates an ellipsoid,
   read
   [body-model-mapping-and-lod.md](references/body-model-mapping-and-lod.md)
   and apply its position, normal, area, geodesic, horizon, atmosphere-altitude,
   and optical-depth error gate. Give each changing field one owner and one
   version.

   **Complete when:** every length and vector has units and a frame, surface
   altitude has one definition, render-origin changes leave physical field
   identity unchanged, and the spherical branch either passes every declared
   approximation gate or is rejected in favor of the ellipsoid.

3. **Select mapping and spatial representation.** Choose normalized,
   spherified, or verified equal-area cube mapping from distortion and inverse
   requirements. Choose a cube-face quadtree for arbitrary globe views, a
   tangent clipmap for sustained local views, or a hybrid with an explicit
   near/far handoff. A gas/cloud-deck body uses continuous wrapped band fields
   rather than solid-terrain displacement. Read
   [body-model-mapping-and-lod.md](references/body-model-mapping-and-lod.md)
   for a solid-body mapping, ellipsoid convention, quadtree, clipmap, or hybrid.
   Read [gas-cloud-deck.md](references/gas-cloud-deck.md) for a gas/cloud-deck
   body.

   **Complete when:** mapping Jacobian, seams, inverse/domain validity, camera
   domain, and near/far ownership all have falsifiable gates.

4. **Build error-bounded LOD and submission.** For the global branch, maintain
   six 2:1-balanced face quadtrees, continuous parent morph, and one of the 16
   four-edge transition masks. Reuse a shared indexed grid and submit compact
   patch records in instanced or indirect mask bins. For clipmaps, bound ring
   error, recentering, and far-field ownership. Evaluate physical-pixel error
   over the complete displaced support for every active view.

   A global patch identity is
   `(bodyId, mappingVersion, face, level, x, y)`. Frontier order, visibility,
   draw bin, allocation slot, and cache address are not identity. A clipmap cell
   identity is `(bodyId, mappingVersion, level, bodySpaceCellCoordinates)`.
   Reusing a physical slot binds a new identity and resets every slot-bound
   temporal or dynamic state; recentering changes slot bindings, not body-space
   field identity.

   Before allocating compute, storage, or indirect resources, run
   `await renderer.init()` and require
   `renderer.backend.isWebGPUBackend === true`. Otherwise keep planning on the
   CPU or report the native-WebGPU branch unavailable.

   **Complete when:** projected error, hysteresis, and submission bounds pass,
   plus every selected branch satisfies its own criterion:

   - **global:** 2:1 balance holds across face edges/corners, all 16 masks are
     crack-free, and production submission has no per-patch draw loop;
   - **clipmap:** rings cover the local domain, recentering preserves field
     coordinates, curvature/reconstruction error passes, and one far-body owner
     covers beyond the outer ring;
   - **hybrid:** near/far coverage has no gap and one composite owner in the
     overlap, composite position and normal remain continuous through the
     handoff, and overlap residency is bounded;
   - **gas/cloud deck:** wrapped-longitude seams, advection continuity, stable
     storm identity, and conservative advected bounds pass.

5. **Build shared causal fields.** Define common field functions for reference
   direction, displacement, tangent gradient, geology, craters, climate,
   hydrology, snow/ice, material causes, queries, and diagnostics. Direct,
   compute-cached, and CPU-visible paths use the same schema and identity
   constants. Cache only dirty patch causes, include cross-face filter support,
   and validate gradients independently before using analytic normals. Read
   [solid-fields-and-coast.md](references/solid-fields-and-coast.md) when
   implementing solid-body caches, crater fields, detail filtering, CPU/TSL
   parity, normals, materials, or coast data. Read
   [gas-cloud-deck.md](references/gas-cloud-deck.md) for gas-band fields.

   GPU patch min/max bounds use workgroup reduction plus deterministic merging,
   or a proven monotonic ordered-integer encoding with explicit sign, NaN, and
   decode-error rules. Do not rely on unsupported float atomics.

   **Complete when:** geometry and shading use the same height function, cache
   invalidation follows causes rather than cameras, parity covers every
   published channel, min/max reduction is legal and conservative, and metric
   value and normal errors pass their own gates.

6. **Publish narrow handoffs.** A field handoff states producer, consumer,
   owner, units, frame/origin, sample time or interval, represented support and
   filter, validity/staleness, version, and error. A planetary coast additionally
   publishes mean surface, seabed height, metric coast distance/frame, source
   resolution, and uncertainty. Atmosphere receives the same reference surface,
   transform, `metersPerWorldUnit`, altitude convention, shell geometry, sun
   frame, and scene-linear radiometric basis. Read
   [solid-fields-and-coast.md](references/solid-fields-and-coast.md) when a
   coast/water consumer is active. Read
   [surface-atmosphere-handoff.md](references/surface-atmosphere-handoff.md)
   when an atmosphere consumer is active.

   **Complete when:** each consumer names one authoritative producer, rejects
   invalid or stale data, and performs no frame-critical GPU readback.

7. **Bind materials and presentation.** Use `MeshStandardNodeMaterial` or
   `MeshPhysicalNodeMaterial` from shared field causes. Keep data textures
   linear, preserve declared color encodings, and hand HDR scene color to the
   one `RenderPipeline` output transform. Rebuild only dirty field tiles or LOD
   frontier state, keep in-flight cache resources immutable, and dispose retired
   buffers, textures, passes, and indirect state.

   **Complete when:** output conversion has one owner, direct and cached paths
   agree, origin rebases preserve the body, and repeated resize/replacement
   reaches a stable resource plateau.

8. **Verify the selected branches.** Capture orbit, horizon, and close views;
   unlit silhouette; flat albedo without atmosphere; grazing light; mapping,
   patch-error, transition-mask, normal, material, coast, and atmosphere
   diagnostics. Sweep split/merge boundaries and use multiple fixed seeds.

   **Complete when:** the scale and sphere/ellipsoid gates, mapping distortion,
   every selected branch criterion above, shared-field parity, derivative
   accuracy, atmosphere units, triangle/draw counts, cache bytes, timing, and
   zero runtime readbacks all have direct evidence.

## Ownership Boundary

- Use `$threejs-procedural-fields` and `$threejs-procedural-geometry` for local
  terrain whose accepted domain does not expose body curvature or global LOD.
- Use `$threejs-water-optics` for the time-varying free surface, currents,
  breaking, foam, and water optics; this skill owns the reference surface,
  seabed, and planetary coast analysis.
- Use `$threejs-sky-atmosphere-and-haze` for scattering and aerial perspective;
  this skill owns the surface-side geometry and units handoff.
- Use `$threejs-image-pipeline`, `$threejs-scalable-real-time-shadows`, and
  `$threejs-visual-validation` for shared output, shadows, and evidence.

This skill owns the body-scale surface representation, coupled planetary
fields, patch LOD/submission, query parity, and surface-side handoffs.

For work spanning multiple planet branches, use
[planet-field-and-atmosphere-systems.md](references/planet-field-and-atmosphere-systems.md)
as the branch index and common contract.

