flux3d est un moteur 3D web orienté performance. Sa démo Hexacraft génère, streame et laisse terraformer une planète entière — voxels hexagonaux, rivières, 50 biomes, cavernes — sans jamais « charger » le monde.
Tout l'état initial de la planète — relief, rivières, lacs, biomes, cavernes — est une fonction pure de la graine. Seules les éditions du joueur sont stockées (des « diffs » épars). Conséquences : mémoire indépendante de la taille du monde, sauvegardes minuscules, et un déterminisme total qui rend chaque bug reproductible au pixel près.
La sphère est un pavage de Goldberg (hexagones + 12 pentagones) entièrement virtuel : indexOf, coordsOf, center, neighbors sont des formules, pas des tableaux. Passer d'une planète de 79 M à 1,27 Md de cellules ne coûte pas un octet de plus.
Chaque requête traverse le pipeline hiérarchique puis un mémo direct-mapped de 16 384 entrées (~115 Ko) : pur, jamais invalidé — les diffs court-circuitent avant. Le localisateur de cellules est une marche gloutonne O(1) amorti sur le graphe de voisinage.
Une cascade de grilles ×4 (44 → 176 → 704 → 2 816 → 11 264). Le streamer descend l'arbre de tuiles triangulaires : il raffine selon la distance au bord de tuile pour les gros niveaux, au centre pour la promotion finale — avec hystérésis pour ne jamais clignoter. Le niveau 176 couvre la planète entière, épinglé : il n'y a jamais de trou.
descend(). L'anneau vert = hystérésis (on dé-raffine plus loin qu'on ne raffine).Les vues grossières échantillonnent 5 points du niveau fin (médiane robuste) : mêmes hauteurs, mêmes biomes, même plan d'eau — un lac garde exactement le même niveau à tous les LOD, vérifié par test. Les niveaux parents sont dessinés sous les feuilles (abaissés de 7 crans) pour boucher les coutures.
Les niveaux fins ne vivent que dans des pools de slots GPU fixes (96 tuiles fines), générés à la demande, évincés en LRU, uploadés sous budget par frame. La demande est triée par distance : le plus proche d'abord, toujours.
Zéro tableau par cellule. Des structures SoA plates (typed arrays) pour tout ce qui est résident, des scratchs réutilisés à zéro allocation dans les chemins chauds, et un seul gros vertex buffer GPU à offsets fixes — l'anti-fragmentation par construction.
Exporter une planète terraformée n'écrit que les cellules éditées (Maps éparses → JSON). Un monde vierge : 0 octet de données.
La seule vraie construction à l'ouverture : l'hydrologie (~0,5 s, priority-flood sur 309 762 cellules, tas binaire plat) et l'échauffement du niveau planète-entière.
L'atlas de biomes (66 couches + mips complets) est généré au boot — aucun fichier image dans le projet. Fidèle au « from scratch ».
Chaque cellule possède son bloc de sommets à offset fixe dans le vertex buffer. Un coup de pinceau réécrit K blocs par writeBuffer ciblés — pas de rebuild de chunk, pas de latence. La nature (arbres, rochers, plantes) est un système d'entités instanciées : abattre un arbre retire une instance, le semis procédural rejouable fait le reste.
~200 Mo/s de génération de tuiles pendant l'orbite, lissés sous budget par frame — la caméra ne bloque jamais.
Creuser une fosse rabaisse automatiquement les vues parentes couvrantes (viewOver) : la sous-couche ne perce jamais dans l'excavation.
134 M de poches procédurales (bande d'un bruit 3D) + éditions : percer un plafond, combler un tunnel — mêmes diffs, même sauvegarde.
Un priority-flood (Barnes) comble les dépressions depuis la mer : chaque cellule connaît son exutoire — zéro plateau, zéro boucle. L'accumulation de flux trace 2 520 segments de rivières en 191 bassins versants ; les lits sont rendus monotones vers l'aval à l'init : chaque rivière descend, quel que soit le bruit fin. Le creusement s'applique dans heightOf : les vues LOD en héritent gratuitement.
Chaque cellule d'eau douce connaît le rayon de son plan (lac − 0,5 cran, rivière lit + 0,4) : identique à tous les niveaux de détail, jamais percé par la sphère de mer — celle-ci est maillée avec une flèche de corde ≤ 0,1 cran, adaptée au rayon de la planète. Le tout est verrouillé par des tests dédiés.
Axe polaire perpendiculaire au plan solaire : l'insolation ne dépend que de la latitude. T° = f(cos lat) − 0,55 °C/cran d'altitude. Humidité = 1 − aridité (le même champ qui module la pluie). Le HUD affiche le biome et la température du point que vous survolez.
Un interrupteur bascule la planète en carte des biomes : 50 aplats couleur, géométrie aplatie, éclairage neutre — la face nuit aussi lisible que la face jour. Les chunks sont reconstruits avec les mêmes 9 flottants par sommet.
Pas de cubes-sphère, pas de projection : un vrai pavage de Goldberg. Le piéton marche sur la sphère, la gravité est radiale, les pôles sont des cellules comme les autres.
10 suites Playwright pilotent un Chrome WebGPU headless : fidélité LOD au cran près, monotonie des rivières, invariants des plans d'eau, gradients climatiques, captures reproductibles par permalien (#az=…&el=…&r=…&sun=…).
Pipelines, WGSL, atlas, culling Hi-Z, tout est écrit à la main. Le harness du repo compare flux3d à three.js et Babylon sur les mêmes scènes.
×4 sur le rayon = une ligne de configuration. La cascade de LOD, la sphère d'eau, le streaming et les tests s'adaptent automatiquement — la taille des cellules, elle, ne bouge jamais (~1,8 m).