
Documentation/World generation
Growing planets from tectonic plates
Most procedural terrain is noise dressed up as geography. REACT takes the slower road: it simulates a planet's geological history, then lets mountains, rivers and biomes fall out of the physics. This article walks through the whole pipeline, from drifting plates to the quadtree that renders the result.
- 11 min
- 4 figures
- Updated June 2026
6,371 km
planet radius
12
tectonic plates
200
erosion steps
0.3 m
finest detail
The standard way to make procedural terrain is to stack a few octaves of Perlin or simplex noise and call the result mountains. It works on screenshots and fails on globes. Real continents are not statistically uniform: mountain belts run in long arcs along plate boundaries, river systems drain into basins that exist for structural reasons, and the west side of a mountain range is often soaked while the east side is desert. Noise has none of that causality, so noise planets feel like texture, not place.
REACT therefore generates terrain the way the Earth did: it simulates a compressed geological history, around 140 million years of it, and treats the elevation map as the output of that history rather than the input.
World generation runs once, offline, when a planet is created. It is a six stage pipeline, and each stage consumes exactly what the previous one produced. On a desktop machine the whole thing takes about 70 seconds for an Earth-sized world.
Plate seeding
The sphere is split into 12 plates with a Voronoi partition, each given a rotation axis and speed.
Plate motion
Plates drift in coarse time steps. Boundaries are classified as convergent, divergent or transform.
Uplift field
Collisions fold crust into mountain belts. Rifts open trenches and mid-ocean ridges.
Fluvial erosion
200 steps of stream power erosion carve valleys and build drainage networks.
Climate
Latitude, altitude, prevailing wind and rain shadow give temperature and rainfall maps.
Biomes
Temperature and rainfall select biomes, which drive ground material, forests and snow lines.
Boundary classification is where the planet's large features are decided. Each pair of neighboring plates is classified by their relative motion, and each class produces a different uplift signature, the same taxonomy a geology textbook uses:
| Boundary | Relative motion | What forms | Earth analogue |
|---|---|---|---|
| Convergent | plates collide head on | folded mountain belts on land, deep trenches at sea | the Himalaya, the Mariana Trench |
| Divergent | plates pull apart | rift valleys on land, mid-ocean ridges underwater | the East African Rift, the Mid-Atlantic Ridge |
| Transform | plates slide past each other | long fault lines, offset ridgelines and rivers | the San Andreas Fault |
The sea floor follows the same discipline. Continental shelves, slopes, abyssal plains, mid-ocean ridges and trenches are generated in the proportions Harris and colleagues measured when they mapped the geomorphology of Earth's actual oceans, so diving off a REACT coast crosses the same sequence of provinces a real submersible would.
The interesting consequence is that nothing downstream is arbitrary. If you find a desert in a REACT world, there is a mountain range upwind of it that stole its rain. If you follow a river upstream, you arrive at the highlands the simulation built during a plate collision.
Note
Generation is fully deterministic. The same seed reproduces the same planet bit for bit, including every river bend, which is what makes saves tiny: a world is a seed plus the player's changes.
Raw uplift produces mountain belts in the right places, but they come out as smooth ridges. What makes terrain look real is erosion. REACT uses the stream power law, the standard model in geomorphology for how rivers cut into bedrock:
Eq 01
each symbol, explained —
Erosion rate grows with the drainage area flowing through a point (more water, more cutting) and the local slope (steeper, faster). REACT uses m = 0.5 and n = 1, the commonly fitted values.
Each erosion step computes flow directions over the current terrain, accumulates drainage area, erodes by the formula above, and deposits part of the sediment downstream. Run that 200 times against continuing uplift and the two processes reach an equilibrium: peaks stay sharp where uplift is active, while older ranges decay into rounded hills with broad foothills.
world/erosion.cpp (simplified)
for (int step = 0; step < w_erosion_steps; ++step) {
ComputeFlowDirections(height, flow); // steepest descent per cell
AccumulateDrainage(flow, area); // upstream area, O(n) sweep
ApplyUplift(height, uplift, dt); // tectonics keep pushing
// stream power law: E = K * A^m * S^n (m = 0.5, n = 1)
ErodeStreamPower(height, area, K, 0.5f, 1.0f, dt);
DepositSediment(height, flow, 0.35f); // 35% settles downstream
}Erosion runs on a 4,096 by 2,048 spherical grid on the GPU. That is far too coarse to walk on, which is what the next section is about: the simulation provides the large structure, and detail is synthesized underneath it at render time, conditioned on what the geology says each spot should be made of.
A planet is too large for any fixed mesh. REACT maps six quadtrees onto the faces of a cube projected onto the sphere, and subdivides each one toward the camera. Every node, leaf or not, carries the same 33 by 33 vertex patch, so the triangle count per node is constant and the detail level is set purely by how deep the tree splits.
Geomorphing blends each patch toward its parent before a split or merge, so the surface never pops. Positions are computed camera relative in double precision on the CPU and only then handed to the GPU in floats, which is what keeps the geometry stable when you are standing on a beach 6,371 km from the planet's origin.
Known issue
Hairline cracks can appear for one frame between patches of different LOD when the camera teleports rather than moves. The skirt geometry hides them in normal play; a proper stitch for the teleport case is on the list.
The budget below is the part that makes planetary scale practical: because each quadtree level covers four times the area of the one below it, the triangle count per distance ring stays roughly flat. You spend your triangles where the player is looking, and the whole rest of the planet costs less than the nearest kilometer.
All of this machinery exists for one reason: places with history feel different to play in. A valley in REACT is somewhere a river decided to be over millions of simulated years. When a story scene is staged in that valley, the geography is load bearing, and the player can feel that even if they never know why.
It is also the studio's proof of headroom. The first game is not a planet sim; it is a story-driven title in hand-built scenes. But an engine that streams a whole world with no loading screens runs those scenes with an enormous margin, and this system is where that margin was earned.
The terrain system is tuned through console variables, all adjustable live in the in-engine console. The interesting ones:
| Variable | Default | Description |
|---|---|---|
| w_plates | 12 | Number of tectonic plates seeded at generation. More plates means smaller continents and more coastline. |
| w_erosion_steps | 200 | Erosion iterations during generation. Doubling roughly doubles generation time and ages the terrain. |
| t_quadtree_depth | 20 | Maximum subdivision depth. Each level halves the cell size; 20 levels reach 0.3 m detail. |
| t_split_factor | 1.5 | A cell subdivides when the camera is closer than this multiple of its size. Lower is cheaper and visibly coarser. |
| t_geomorph | 1 | Blend patches toward their parent before LOD transitions. Disable to see the popping it prevents. |
| t_freeze_lod | 0 | Debug: stop quadtree updates so you can fly out and inspect the subdivision around the previous camera position. |
Further reading
- [01]Cordonnier, G., Braun, J., Cani, M.-P., Benes, B., Galin, E., Peytavie, A., Guerin, E. (2016). Large Scale Terrain Generation from Tectonic Uplift and Fluvial Erosion. Computer Graphics Forum (Eurographics).
- [02]Braun, J., Willett, S. D. (2013). A very efficient O(n), implicit and parallel method to solve the stream power equation. Geomorphology, vol. 180.
- [03]Harris, P. T., Macmillan-Lawler, M., Rupp, J., Baker, E. K. (2014). Geomorphology of the Oceans. Marine Geology, vol. 352.
- [04]Ulrich, T. (2002). Rendering Massive Terrains using Chunked Level of Detail Control. SIGGRAPH Course Notes.
- [05]Whittaker, R. H. (1975). Communities and Ecosystems. Macmillan, 2nd edition.