Luminids water pass with river and terrain
Water starting to settle into the terrain

Water has been one of the oldest pain points in Luminids.

I spent well over 100 hours across multiple iteration cycles pushing it toward something that felt right. For a while I had the strange combination of green checks and bad screenshots. Parts of the system looked healthy on paper. In the game, rivers would vanish, lakes would behave strangely, and whole areas would fall apart the moment you moved through them.

That gap was the issue.

The reports were telling me one story. The world was telling me another.

Setting the north star

Before I changed the architecture, I wrote down what water actually needed to be in Luminids.

Rivers needed to read clearly and stay inside their channels. Lakes needed to fill properly and sit cleanly in their basins. Ocean needed to feel present where it belonged. The whole thing needed to stay stable across the biome rings and hold up in actual gameplay, not just in isolated tests.

Writing that down cut through a lot of the noise.

I was dealing with overlapping versions of a water system.

The older authored path was still hanging around. The newer field runtime was partly in place. Validation could go green while the player-facing render path still looked wrong. That explained a lot of the confusion.

Water pass showing channel readability
Clearer channels, stronger agreement with the land
Water pass showing terrain and water shape
Holding together from gameplay distance

Changing the architecture

At that point I stopped trying to patch the old shape of the problem and changed the architecture instead.

The big shift was simple: give the hydro field one job, be the source of truth.

Instead of letting separate water bodies and the terrain bake pull against each other, I pushed everything toward one shared source of truth. The field owns the truth, the renderer reads from it, and the rest of the game hooks into the same system.

That was the turning point.

It also made the debugging much cleaner. Suddenly the right questions were obvious:

  • Is the field correct?
  • Is the renderer reading it properly?
  • Is the shader helping the world read better?
  • Is the validation actually testing what the player sees?

Simple on paper. Huge in practice.

What was actually blocking it

Even after the pivot, the first pass still looked broken. The final blockers were smaller than the architectural problem, but they stacked on top of each other in a nasty way.

Three things were really doing the damage:

  • a legacy sweeper in the world runtime was hiding the new renderer
  • the mesher was taking an expensive sampling path and burning huge frame time
  • the custom shader was making the water read as a dark ribbon instead of actual water

Once those moved, the rest became much easier to read.

This was the moment it finally landed.

Before
1461 ms
average frame time
After
9.08 ms
average frame time
Result
110 FPS
estimated from 0.7 FPS

Average frame time dropped from 1461 ms to 9.08 ms. Estimated FPS moved from 0.7 to 110. Water was finally visible on screen, the world became responsive again, and the system stopped fighting itself.

That was the first point where this felt like a real breakthrough rather than another temporary fix.

Making it feel like Luminids

Getting the renderer working was the breakthrough.

Making it feel like it belonged in Luminids was the real craft phase.

After that I pushed through a whole series of passes that made the water feel like part of the world instead of a layer sitting on top of it.

Biome-aware styling was a big one. Rivers and lakes now carry some of the identity of the ring they move through. A river in meadow space feels different from a river in tundra or volcanic highlands. That matters in Luminids because atmosphere is never just decoration. It is part of how the world communicates.

Then came softer carvings, cleaner shore bands, stronger bank materials, and more believable lake floors. I widened and deepened rivers in the harsher outer biomes where the earlier versions were too small to really read from standing height. I added pool and riffle variation so the river floor has more life without breaking the surface.

One of the stranger bugs was lakes. In some cases the surface was effectively sloping by tens of metres across its own footprint. On flatter terrain you could get away with that for a while. In highland, tundra, and volcanic rings it broke the illusion instantly. Fixing lake surfaces so each basin respects a true level waterline changed those spaces overnight.

From there I pushed into outlet corridors so lakes could start feeling connected to the wider water system, then baked those outlets into the carve so the terrain and the water finally agreed with each other.

Biome-aware water styling pass
Water beginning to carry each biome
Water carving and shore band pass
Softer carving and cleaner shorelines
Lake basin and waterline pass
Lake basins settling into a truer waterline
River depth and bank material pass
More depth, stronger banks, better readability
Water mood and surface pass
The surface starting to carry the right mood
Underwater and depth mood pass
Underwater beginning to feel like its own space

Underwater got a full rethink too. Earlier versions were moving in the right direction. The feeling still was not there. So underwater became its own proper visual layer with biome-aware colour, depth, density, and mood. Plains water feels calmer. Tundra stays clearer and colder. Volcanic water feels heavier. Going below the surface now feels like entering a different part of the world.

Then came rapids and foam.

I wanted movement to appear where the land earns it. Meadow rivers stay soft and calm. Mountain, tundra, and volcanic drops pick up more whitewater and energy. After that I tuned the foam again so it reads as flowing patches and streaks instead of visual noise.

That kind of restraint matters. Luminids works best when motion feels meaningful.

Where it landed

What I like most about where the system sits now is that water has stopped feeling like an isolated feature.

Terrain
Settled into the land

It sits with the terrain instead of floating above it.

Biome identity
Carries the biome

It carries more of the biome it moves through.

Atmosphere
Supports the calm

It supports the calm when the world needs space to breathe.

Movement
Motion where earned

It carries movement when the land calls for it.

Readability
Clear from every view

It reads better from above, on the ground, and underneath the surface.

Diagnosis
Built to inspect

It is easier to test, debug, and improve without guessing.

That last point matters a lot. I have much better probes, much better visibility into what the system is doing, and a far healthier separation between truth, rendering, and polish. That gives me a stronger base for every future pass.

Water readable from above
Reading clearly from above
Ground-level water readability
Holding up at ground level
Rapids and foam pass
Rapids showing up where the land earns them
Flowing patches and streaks
Foam reading more like flow
Shoreline transition pass
Cleaner transitions at the shoreline
Water and terrain atmosphere pass
Water supporting the rhythm of the world
Water visibility and terrain detail pass
Water and terrain reading together
Water polish and atmosphere pass
Calm, clear, and alive
Water final readability pass
Terrain, biome, and atmosphere working together
Current Luminids water system landing shot
Where the current water pass has landed

What comes next

There is still more I want to do here.

Waterfalls and rapids can go further. Lake outlets can keep evolving. There is still room for more polish in how shorelines transition and how far water carries into the distance.

But the foundation is finally right.

This is the first time the water in Luminids has felt like it truly belongs to the world.

More soon.

Nick