private void GenerateNoiseMap(int octaves, float persistence) { float z = Rand.Range(0.0f, 1.0f, Rand.RandSync.Server); Noise = new float[generationParams.NoiseResolution, generationParams.NoiseResolution]; float min = float.MaxValue, max = 0.0f; for (int x = 0; x < generationParams.NoiseResolution; x++) { for (int y = 0; y < generationParams.NoiseResolution; y++) { Noise[x, y] = (float)PerlinNoise.OctavePerlin( (double)x / generationParams.NoiseResolution, (double)y / generationParams.NoiseResolution, z, generationParams.NoiseFrequency, octaves, persistence); min = Math.Min(Noise[x, y], min); max = Math.Max(Noise[x, y], max); } } float radius = generationParams.NoiseResolution / 2; Vector2 center = Vector2.One * radius; float range = max - min; float centerDarkenRadius = radius * generationParams.CenterDarkenRadius; float edgeDarkenRadius = radius * generationParams.EdgeDarkenRadius; for (int x = 0; x < generationParams.NoiseResolution; x++) { for (int y = 0; y < generationParams.NoiseResolution; y++) { //normalize the noise to 0-1 range Noise[x, y] = (Noise[x, y] - min) / range; float dist = Vector2.Distance(center, new Vector2(x, y)); if (dist < centerDarkenRadius) { float angle = (float)Math.Atan2(y - center.Y, x - center.X); float phase = angle * generationParams.CenterDarkenWaveFrequency + Noise[x, y] * generationParams.CenterDarkenWavePhaseNoise; float currDarkenRadius = centerDarkenRadius * (0.6f + (float)Math.Sin(phase) * 0.4f); if (dist < currDarkenRadius) { float darkenAmount = 1.0f - (dist / currDarkenRadius); Noise[x, y] = MathHelper.Lerp(Noise[x, y], Noise[x, y] * (1.0f - generationParams.CenterDarkenStrength), darkenAmount); } } if (dist > edgeDarkenRadius) { float darkenAmount = Math.Min((dist - edgeDarkenRadius) / (radius - edgeDarkenRadius), 1.0f); Noise[x, y] = MathHelper.Lerp(Noise[x, y], 1.0f - generationParams.EdgeDarkenStrength, darkenAmount); } } } }