2026-09-06
Gap: Waterfall geometry didn't match the rock
This work closed two problems: the water sheet over each waterfall didn't match the rock beneath it, and no white-water effect existed at riverbanks.
Gap: Waterfall geometry didn't match the rock
The water sheet stood near the rock face rather than on it, missed the riverbanks at its edges, and formed a six-sided polygon at the lip instead of a curve: the mesh sampled the rock's curve at seven points.
The sheet was rebuilt as an exact mirror of the rock, using the same carve numbers, resized to span bank to bank, with extra lip geometry where the curve bends most; river, sheet, and whitewater now combine into one continuous mesh.
The sheet lands within 0.35 m of the rock at the median site; a visual review found the lip reads as a smooth curve, not a flat plate with seams.
Dead end: small, tooth-like bumps along each lip traced to the terrain's crest edge, built from flat grid cells reading as a staircase from a low angle; logged for later work.
Gap: No white-water effect at riverbanks
Every foam effect in the water shader triggered on the water's own speed or turbulence; none read distance to shore, so riverbanks showed no reaction to the current running past them.
A new coordinate, each point's distance to the nearest bank, feeds a shader effect drawing a band of white water along the bank, brightening with current speed.
The first build had three bugs: a phantom trigger on stretches missing the new coordinate, fixed with a flag; a waterline 1.3 m inside the mesh's nominal edge, fixed by reading rendered water depth; and the effect at under 5% of final pixel brightness, fixed by compositing on top.
Dead end: a half-meter band width shipped, but wider settings showed a checkerboard tiling pattern, first suspected as the rock's own grid.
Same band and camera, only the swirl-pattern size changed. The tiling
doubles with it, proof it belongs to the effect, not the rock.
The cause was a value hashed per grid cell, drawing a hard line at each boundary; a continuous noise field replaced it, removing tiling at every width tested. Wider widths work but remain unshipped; the half-meter default looked better.