Skip to content
Implementation

Océan

Une planète rocheuse avec liquidState: 'liquid' reçoit automatiquement une sphère liquide animée ancrée au niveau de la mer. Le slider modifie la couverture en runtime via body.liquid.setSeaLevel.

Couverture initiale vs runtime

Au build, liquidCoverage (0–1) est résolu en bande entière dans la simulation :

ts
const body = useBody({
  // ...
  liquidState:    'liquid',  // 'liquid' | 'frozen' | 'none' — déclare la présence
  liquidCoverage: 0.55,      // 55 % des tuiles seront sous l'eau
  liquidColor:    '#175da1', // teinte opaque (la chimie reste caller-owned)
}, DEFAULT_TILE_SIZE)

La nature de la substance (eau, méthane…) n'est jamais exposée à la lib — vous gardez ce mapping dans votre catalogue applicatif et passez seulement la couleur résolue.

Au runtime, vous bougez le niveau via :

ts
const core    = body.getCoreRadius()
const surface = body.getSurfaceRadius()

// `radius01` ∈ [0, 1] mappé entre noyau (0) et surface (1)
body.liquid.setSeaLevel(core + (surface - core) * radius01)

setSeaLevel(worldRadius) accepte un rayon monde : combinez-le avec body.getCoreRadius() / body.getSurfaceRadius() pour rester dans la bande de relief. Une valeur ≤ rayon du noyau cache automatiquement le shell liquide.

Vagues animées

La sphère liquide utilise liquidWaves.glsl — un FBM dérivé de la position monde et du temps. Trois uniforms pilotent le rendu :

UniformRôle
uTimeTemps en secondes (incrémenté par body.tick)
uWaveScaleÉchelle XY des vagues
uWaveAmountAmplitude (transparence + relief)

Tous trois ont des défauts raisonnables. Pour personnaliser, accédez au matériau via (body as any).liquidMaterial?.uniforms.

Pourquoi un shell séparé ?

Modélisée comme une sphère distincte plutôt qu'une bande de tuiles, l'océan :

  • garde une surface lisse même quand le mesh hex est actif,
  • supporte des vagues animées indépendantes du terrain,
  • peut être rendu en alpha-blend avec un shader de Fresnel.

Pour une glace solide qui suit le relief tuile par tuile, déclarez liquidState: 'frozen' et empilez vous-même un cap hex via buildSolidShell — voir la page dédiée Surface gelée pour le pattern complet.

Distribué sous la licence indiquée dans le dépôt.