A planet at Star Citizen scale, built by hand. A 1000 km radius, one world unit to one metre, flyable end to end from orbit down to sub-metre ground detail, with no loading screen. No UE5, no Godot, no engine.
My own window, my own maths, my own image loader, my own font atlas. An engine would have solved every problem in this project for me, and taken everything I learned from them along with it.
What is already there
Terrain
A cube-sphere with a per-face quadtree LOD, frustum culling and geomorphing. The height field has two bands: a continental band at a fixed eight octaves, so the coastline can never move, plus a detail band whose octave count grows with the LOD level. The normaliser stays fixed, otherwise adding an octave would rescale the ones already there.
Plate tectonics
The landmarks do not come from noise. Ten Fibonacci-distributed plate seeds, and of some 24 boundaries exactly four carry a mountain range. They are chosen by their on-land length rather than by a hash, because by hash one range lay entirely in the sea and another 93 per cent. Each range is a belt of one to three parallel ridges, 62 to 118 km wide.
Materials and atmosphere
Six triplanar-projected ground textures in one sampler array, blended through eight one-byte vertex weights. Selection follows the climate zones of elevation, slope, latitude and moisture, the same four quantities the palette uses, so a material boundary and a colour boundary are the same line on the ground. Plus an HDR offscreen target with tonemapping, Rayleigh scattering with aerial perspective, and reversed-Z with an infinite far plane.
Ship and editor
A flight model with flight assist, a cockpit with switches, landing gear, landing and a quantum drive to six outposts. Creative mode carries a tool-style UI for every runtime parameter with a live rebuild. Planets are text files, and one table feeds the editor, the writer and the reader so the three cannot drift apart.
Measured, not estimated
| Quantity | Value |
|---|---|
| Land height | p50 537 m, p90 1485 m, max 6478 m |
| Relief over a 2 km radius | p50 261 m, p90 1030 m, max 3619 m |
| Slope | p50 6.8°, p90 27.0° |
| Mountain belts | 5.1 % of the land |
| Finest LOD level | 18, cells of about 0.48 m |
| Frame rates without the validation layer | 104 to 252 fps |
| Assertions in the headless test | 463 |
For scale on the relief figures: the Alps sit at roughly 800 m, the Himalaya at roughly 1500 m.
What I learned from it
Decisions belong in Vulkan-free headers. Everything that determines the terrain sits in headers without a single Vulkan dependency. That is why a headless test binary can pin them down, and why a claim about the planet can be measured rather than merely looked at.
Every threshold sits on a measured quantile. Never on what looks sensible on a scale from zero to one. This is the rule I broke most often and paid for most dearly. An fBm with a gain of 0.38 does not fill the range, it stacks around the middle. A band that seems reasonable on paper gives one variant 99 per cent of the area and makes the other unreachable.
A test that can pass on eight samples does not measure what it claims. Three of my own tests were built that way. The crest-walk test covered 64 km of a 1287 km range and satisfied its tolerance band on that basis. The distance walked is now part of the assertion.