How Rune Soul Builds Its Rivers

A world generator that produces flat, textureless terrain isn’t a world — it’s a placeholder. The details are what make a place feel real. Rivers are one of those details.

Over the past few weeks I’ve been building and polishing Rune Soul’s river system. It’s now in a state I’m willing to talk about.

How it works

Rivers in Rune Soul aren’t hand-placed. They’re extracted from the heightmap — the same data that defines mountains, valleys, and coastlines. Water flows downhill, pools in low points, and carves paths through the terrain automatically.

The system reads intensity values from the heightmap to determine where water flows, builds polyline paths through that data, then renders them as ribbon meshes that sit flush against the terrain surface. Terrain is carved around each river so it naturally sits in a channel rather than floating on the landscape.

Lakes are handled separately — they’re voxel water volumes that fill low-lying regions and connect to the river network where the terrain allows.

What’s been hard

The tricky part isn’t generating rivers — it’s generating rivers that look right.

Early versions had rivers that zigzagged on rough slopes, terminated abruptly with a sharp point, and clumped into headwater stubs in mountain regions. Fixing each of those required working closer to the terrain data: smoothing the Y axis across the polyline to kill the rollercoaster effect, filtering out paths that were too short to be meaningful, and adding a proper taper so rivers narrow naturally as they approach their source.

There was also a regression. I built a two-pass centering system intended to position rivers more precisely within their valleys. It worked in isolation, then broke when flow-direction filtering was added at the same time. Spent a session untangling which change caused what. The two-pass approach is reverted for now — the simpler single-pass version is more stable and nearly as accurate.

That’s game development. Some of the most instructive sessions are the ones where you end up exactly where you started.

Why this matters for the game

Rune Soul’s world is generated fresh for each playthrough. Rivers determine where fertile land sits, where early settlements make sense, and eventually where you’ll route trade and infrastructure as your kingdom grows. A river system that generates convincingly is foundational — it shapes every session.

It’s not done. Fork confluences still have centering issues. Rivers don’t yet vary in width by volume. Cross-region seams need addressing. But the core is solid and the world looks like it has geography.

More soon.