Ejemplo n.º 1
0
        /// <summary>
        /// Obtient une valeur de bruit combinée des bruits passés en paramètres, selon une certaine formule magique :p
        /// </summary>
        /// <param name="reparitionNoise"></param>
        /// <param name="noiseHigh"></param>
        /// <param name="noiseLow"></param>
        /// <returns></returns>
        public static float GetMultiNoiseValue(NoiseBase repartitionNoise, NoiseBase noiseHigh, NoiseBase noiseLow,
                                               float x, float y, float z)
        {
            if (repartitionNoise is WhiteNoise)
            {
                return(repartitionNoise.GetValue(x, y, z));
            }
            else
            {
                if (s_cache.ContainsKey(new Vector3(x, y, z)))
                {
                    return(s_cache[new Vector3(x, y, z)]);
                }
            }

            // Noise modélisant les endroits où sont placés les continents.
            float continentNoise = s_continentNoise.GetValue(x, y, z);
            // Noise modélisant les endroits où sont placées les montagnes.
            float mountainsRepNoise = s_mountainsRepNoise.GetValue(x, y, z);
            // Noise modélisant les montagnes.
            float mountainsNoise = s_mountainsNoise.GetValue(x, y, z);
            // Noise modélisant les détails de la surface au sol.
            float ridgesNoise = s_ridgesNoise.GetValue(x, y, z);
            float bumpNoise   = s_bumpNoise.GetValue(x, y, z);
            // Noise permettant la répartition des reliefs ridges / bump.
            float reliefRepartitionNoise = s_reliefRepartitionNoise.GetValue(x, y, z);
            // Noise modélisant la taille des plages.
            float beachNoise = s_beachHeightNoise.GetValue(x, y, z);

            float adjustedContinentNoise = continentNoise - 0.3f; // 0.3f

            // 0.02 pour des côtes, 0.1 pour des plages
            float beachValue = Math.Min(0.050f, Math.Max((beachNoise + 0.5f) / 500.0f, 0.020f));


            // "Coupe" les continents lorsqu'ils dépassent la taille de la plage.
            float continentValue = Math.Min(adjustedContinentNoise, beachValue);
            float continent      = continentValue * 1000;

            // Mountains
            float interpMin           = 0.0f;
            float interpMax           = 0.5f;
            float interpValue         = Math.Min(interpMax, Math.Max(interpMin, adjustedContinentNoise));
            float mountainsModulation = lerp(interpMin, interpMax, interpValue) * Math.Max(0, mountainsRepNoise);
            // Crée des montagnes seulement là où le bruit de répartition est élevé.
            float mountains = mountainsModulation * mountainsNoise * 2400;

            mountains = MountainShapeFunc(40, 80, 1, mountains);

            // Ridges
            float ridges = Math.Max(0f, ridgesNoise) * 75; // 250
            float bumps  = Math.Max(0f, bumpNoise) * 50;   // 125
            float relief = lerp(bumps, ridges, Math.Max(0, Math.Min(1, reliefRepartitionNoise))) * 5;

            // Valeur finale du bruit.
            float value = continent + relief + mountains; // + relief + mountains; // +relief

            s_cache[new Vector3(x, y, z)] = value * World.Planet.AltitudeScale;
            return(value * World.Planet.AltitudeScale);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Génère une heighmap à partir d'un bruit Ridged Multifratcal.
        /// Version parrallélisée.
        /// </summary>
        /// <param name="size"></param>
        /// <returns></returns>
        public static unsafe float[,] GenerateMultiNoiseSleep(int size, NoiseParameters repartitionNoiseParams,
                                                              NoiseParameters noiseHighParams,
                                                              NoiseParameters noiseLowParams)
        {
            Random rand = new Random();

            float[,] heightmap = new float[size, size];

            // Création des bruits.
            NoiseBase repartitionNoise = repartitionNoiseParams.CreateNoise();
            NoiseBase noiseHigh        = noiseHighParams.CreateNoise();
            NoiseBase noiseLow         = noiseLowParams.CreateNoise();


            // Donne une liste de tâches à effectuer pour chaque core.
            int taskSize  = size;
            int taskStart = 0;
            int taskEnd   = taskSize;

            for (int x = taskStart; x < taskEnd; x++)
            {
                for (int y = 0; y < size; y++)
                {
                    float sx = LinearInterp(repartitionNoiseParams.NoiseStart.X, repartitionNoiseParams.NoiseEnd.X, x / (float)(size - 1));
                    float sy = LinearInterp(repartitionNoiseParams.NoiseStart.Y, repartitionNoiseParams.NoiseEnd.Y, y / (float)(size - 1));

                    // Obtention des valeurs des bruits.
                    float repartition = repartitionNoise.GetValue(sx, sy, 0);
                    float valueHigh   = noiseHigh.GetValue(sx, sy, 0);
                    float valueLow    = noiseLow.GetValue(sx, sy, 0);

                    // Interpolation linéaire entre value low et value high de coefficient donné par le bruit de
                    // répartition.
                    float value = (float)Math.Log(Math.Max(0.8, 1 + valueLow)) * 5 + valueHigh * 25 + repartition * 3;
                    heightmap[x, y] = value;
                }
            }

            return(heightmap);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Génère une heighmap à partir d'un bruit Ridged Multifratcal.
        /// </summary>
        /// <param name="size"></param>
        /// <returns></returns>
        public static float[,] Generate(int size, NoiseParameters parameters)
        {
            NoiseBase noise = parameters.CreateNoise();
            Random    rand  = new Random();

            float[,] heightmap = new float[size, size];


            for (int x = 0; x < size; x++)
            {
                for (int y = 0; y < size; y++)
                {
                    float value = (float)noise.GetValue(
                        LinearInterp(parameters.NoiseStart.X, parameters.NoiseEnd.X, x / (float)(size - 1)),
                        LinearInterp(parameters.NoiseStart.Y, parameters.NoiseEnd.Y, y / (float)(size - 1)),
                        0.0f);
                    heightmap[x, y] = value;
                }
            }

            return(heightmap);
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Obtient une valeur de bruit combinée des bruits passés en paramètres, selon une certaine formule magique :p
        /// </summary>
        /// <param name="reparitionNoise"></param>
        /// <param name="noiseHigh"></param>
        /// <param name="noiseLow"></param>
        /// <returns></returns>
        public static float GetMultiNoiseValue(NoiseBase repartitionNoise, NoiseBase noiseHigh, NoiseBase noiseLow, 
            float x, float y, float z)
        {
            if (repartitionNoise is WhiteNoise)
                return repartitionNoise.GetValue(x, y, z);
            else
            {
                if (s_cache.ContainsKey(new Vector3(x, y, z)))
                    return s_cache[new Vector3(x, y, z)];
            }

            // Noise modélisant les endroits où sont placés les continents.
            float continentNoise = s_continentNoise.GetValue(x, y, z);
            // Noise modélisant les endroits où sont placées les montagnes.
            float mountainsRepNoise = s_mountainsRepNoise.GetValue(x, y, z);
            // Noise modélisant les montagnes.
            float mountainsNoise = s_mountainsNoise.GetValue(x, y, z);
            // Noise modélisant les détails de la surface au sol.
            float ridgesNoise = s_ridgesNoise.GetValue(x, y, z);
            float bumpNoise = s_bumpNoise.GetValue(x, y, z);
            // Noise permettant la répartition des reliefs ridges / bump.
            float reliefRepartitionNoise = s_reliefRepartitionNoise.GetValue(x, y, z);
            // Noise modélisant la taille des plages.
            float beachNoise = s_beachHeightNoise.GetValue(x, y, z);

            float adjustedContinentNoise = continentNoise - 0.3f; // 0.3f

            // 0.02 pour des côtes, 0.1 pour des plages
            float beachValue = Math.Min(0.050f, Math.Max((beachNoise + 0.5f) / 500.0f, 0.020f));

            // "Coupe" les continents lorsqu'ils dépassent la taille de la plage.
            float continentValue = Math.Min(adjustedContinentNoise, beachValue);
            float continent = continentValue * 1000;

            // Mountains
            float interpMin = 0.0f;
            float interpMax = 0.5f;
            float interpValue = Math.Min(interpMax, Math.Max(interpMin, adjustedContinentNoise));
            float mountainsModulation = lerp(interpMin, interpMax, interpValue) * Math.Max(0, mountainsRepNoise);
            // Crée des montagnes seulement là où le bruit de répartition est élevé.
            float mountains = mountainsModulation * mountainsNoise * 2400;
            mountains = MountainShapeFunc(40, 80, 1, mountains);

            // Ridges
            float ridges = Math.Max(0f, ridgesNoise) * 75; // 250
            float bumps = Math.Max(0f, bumpNoise) * 50; // 125
            float relief = lerp(bumps, ridges, Math.Max(0, Math.Min(1, reliefRepartitionNoise))) * 5;

            // Valeur finale du bruit.
            float value = continent + relief + mountains; // + relief + mountains; // +relief
            s_cache[new Vector3(x, y, z)] = value * World.Planet.AltitudeScale;
            return value * World.Planet.AltitudeScale;
        }