3D: местность за краем участка -- холмы, река и горы продолжаются без шва и плавно уходят в равнину; край больше не обрезан

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Alexander
2026-11-06 16:57:29 +01:00
co-authored by Claude Opus 5.5
parent af7150a006
commit a72a8941ff
3 changed files with 81 additions and 13 deletions
+16 -3
View File
@@ -39,9 +39,22 @@ public sealed class City3DLayout
return hills;
}
static float RiverX(float z) => 37f + 3f * Mathf.Sin(z * 0.17f);
static bool IsRiver(float x, float z) => Mathf.Abs(x - RiverX(z)) < 1.3f;
static bool IsMountain(float x, float z) => x < 9f && z > 34f || x < 4f && z > 24f;
public static float RiverX(float z) => 37f + 3f * Mathf.Sin(z * 0.17f);
public static bool IsRiver(float x, float z) => Mathf.Abs(x - RiverX(z)) < 1.3f;
public static bool IsMountain(float x, float z) => x < 9f && z > 34f || x < 4f && z > 24f;
// Местность за краем участка (только вид, стройки нет): те же холмы, река и горы продолжаются без шва,
// к дальнему краю (SkirtCells) плавно опускаются до общей равнины SkirtFloor (06.11: при отдалении край участка
// выглядел обрезанным -- холмы и река обрывались уступом)
public const int SkirtCells = 60;
public const float SkirtFloor = -0.7f;
public static float SkirtHeight(float x, float z)
{
float outside = Mathf.Max(0f, Mathf.Max(Mathf.Max(-x, x - Size), Mathf.Max(-z, z - Size)));
float fade = 1f - Mathf.SmoothStep(0f, 1f, Mathf.InverseLerp(SkirtCells - 20f, SkirtCells, outside));
return Mathf.Lerp(SkirtFloor, HeightAt(x, z), fade);
}
public static City3DLayout Create(PlacementRules rules = null)
{