Esempio n. 1
0
        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);
                    }
                }
            }
        }