@Override
public void process(GeneratingRegion region) {
// will give funny results for regions that are not exactly chunk sized, but it is better than sinking in the water on spawn
Vector3i centerChunkPos = new Vector3i(ChunkConstants.CHUNK_REGION.center());
if (region.getRegion().encompasses(centerChunkPos)) {
SurfaceHeightFacet facet = region.getRegionFacet(SurfaceHeightFacet.class);
SeaLevelFacet seaLevelFacet = region.getRegionFacet(SeaLevelFacet.class);
float seaLevel = (float) seaLevelFacet.getSeaLevel();
// update the surface height so that it spikes up to sea level
Vector2i middlePos = new Vector2i(centerChunkPos.x, centerChunkPos.z);
for (Vector2i pos : facet.getWorldRegion()) {
float originalValue = facet.getWorld(pos);
if (seaLevel > originalValue) {
// the surface is below sea level
float scaleTowardsSeaLevel = (float) pos.gridDistance(middlePos) / (float) (ChunkConstants.SIZE_X / 2);
if (scaleTowardsSeaLevel < 1f) {
facet.setWorld(pos, TeraMath.lerp(originalValue, seaLevel, 1f - scaleTowardsSeaLevel));
}
}
}
}
}