using Godot; /// /// The island-falloff shaping functions (terrain-water task 11) — pure numeric /// functions of their inputs (D-035; a named future C++ candidate, kept standalone). /// /// SMOOTH CREST — the mountain spine's ridge axis is the line x = centre, and /// `1 - |x - cx|` peaks there with a slope discontinuity. Measured on the shipped /// terrain, that crease is the single largest slope step anywhere on the map once /// the by-design Trench walls are excluded (top 4 of 5999 columns). SmoothAbs /// rounds the crest without moving its height. /// /// COAST SHELF — the height curve is identity at and below sea level, so it never /// touched the SUBMARINE slope. Measured: land rises from the shoreline at /// 0.038 m/px while the seabed drops at 0.258 m/px — the shoreline is a shelf on /// the land side and a ramp on the sea side. CoastShelf compresses shallow depth /// so the shallows extend much further out, leaving deep water and the Trench /// essentially untouched. /// /// Every one of these is monotone in the sign of (sea - height): none of them can /// turn water into land or land into water on its own. The coast shelf therefore /// leaves the biome and water classification bit-identical, which is why it is /// separable from elongation in the batch. /// public static class IslandFalloff { // ---- centre-line crest ------------------------------------------------ // Rounding radius in normalized spine-width units (1.0 = MapSize/2 * IslandAxisX // ~ 4710 px at 8K with the default axis). 0.03 ~ 141 px: it cuts the crest's // 1-px kink by 99.3% (-7.64e-04 -> -5.41e-06 raw) while filling at most 3.9 m, // decaying under 0.5 m by ~1100 px from the axis. public const float CREST_EPSILON = 0.03f; /// /// A C¹ stand-in for |d|: exactly 0 with zero slope at d = 0, and converging to /// |d| within e²/(2|d|) away from it. Replaces the V-shaped crest of the spine /// with a rounded one WITHOUT lowering it — SmoothAbs(0) is 0, so the peak keeps /// its full height. /// public static float SmoothAbs(float d, float epsilon) { float a = Mathf.Abs(d); return a * a / Mathf.Sqrt(a * a + epsilon * epsilon); } // ---- coast shelf ------------------------------------------------------ // depth' = depth * (1 - STRENGTH * exp(-depth / SCALE_M)). // At the shoreline the seabed starts at (1 - STRENGTH) of its former gradient and // recovers smoothly, so the shallows widen and the deep ocean keeps its shape. // C^inf everywhere, and strictly positive for positive depth — it cannot move the // waterline by even one pixel. public const float SHELF_STRENGTH = 0.775f; // 0 = off, ->1 = a flat lagoon public const float SHELF_SCALE_M = 100f; // metres of depth over which it relaxes /// Remaps a positive depth in metres. Returns the new depth in metres. public static float CoastShelf(float depthMetres) { if (depthMetres <= 0f) return depthMetres; return depthMetres * (1f - SHELF_STRENGTH * Mathf.Exp(-depthMetres / SHELF_SCALE_M)); } }