internal override void GenerateColorMap(int height)
        {
            var width = 2 * height;

            if (HasAtmosphere && TemperatureNoiseMap == null)
            {
                GenerateTemperatureMap(height);
            }
            else if (HeightNoiseMap == null)
            {
                GenerateHeightMap(height);
            }
            var builder = new SphereNoiseMapBuilder();

            builder.SetDestSize(width, height);
            builder.SetBounds(-90, 90, -180, 180);
            ColorNoiseMap        = new NoiseMap();
            builder.SourceModule = ColorNoiseModule;
            builder.DestNoiseMap = ColorNoiseMap;
            builder.Build();

            for (var x = 0; x < width; x++)
            {
                for (var y = 0; y < height; y++)
                {
                    var value = ColorNoiseMap.GetValue(x, y);
                    value = (value - MinHeight) / (MaxHeight - MinHeight);
                    ColorNoiseMap.SetValue(x, y, value);
                }
            }
        }
        private void GenerateTemperatureMap(int height)
        {
            var width = 2 * height;

            if (HeightNoiseMap == null)
            {
                GenerateHeightMap(height);
            }
            var builder = new SphereNoiseMapBuilder();

            builder.SetDestSize(width, height);
            builder.SetBounds(-90, 90, -180, 180);
            TemperatureNoiseMap  = new NoiseMap();
            builder.SourceModule = TemperatureNoiseModule;
            builder.DestNoiseMap = TemperatureNoiseMap;
            builder.Build();

            MinTemperature = 1000000.0f;
            MaxTemperature = 0.0f;

            var solarHeat = Pow(SurfaceTemperature, 4);
            var extraHeat = Pow(GeothermalTemperature, 4) + Pow(GreenhouseTemp, 4);
            var coldness  = 1 - (float)Random.Uniform("coldness", Pow(extraHeat / (solarHeat + extraHeat), 0.25), 1);

            if (HasAtmosphere)
            {
                for (var x = 0; x < width; x++)
                {
                    for (var y = 0; y < height; y++)
                    {
                        var heat        = extraHeat + solarHeat * 2 * Sin(PI * y / height);
                        var temperature = (float)Pow(heat, 0.25);
                        temperature *= 1 - coldness * HeightNoiseMap.GetValue(x, y);
                        if (temperature < MinTemperature)
                        {
                            MinTemperature = temperature;
                        }
                        else if (temperature > MaxTemperature)
                        {
                            MaxTemperature = temperature;
                        }
                        temperature *= 1 + 0.05f * (TemperatureNoiseMap.GetValue(x, y) - 1);
                        TemperatureNoiseMap.SetValue(x, y, temperature);
                    }
                }
            }
        }
        private void GenerateTemperatureMap(int height)
        {
            var width   = 2 * height;
            var builder = new SphereNoiseMapBuilder();

            builder.SetDestSize(width, height);
            builder.SetBounds(-90, 90, -180, 180);
            TemperatureNoiseMap  = new NoiseMap();
            builder.SourceModule = TemperatureNoiseModule;
            builder.DestNoiseMap = TemperatureNoiseMap;
            builder.Build();

            var min = 10.0f;
            var max = -10.0f;

            for (var x = 0; x < width; x++)
            {
                for (var y = 0; y < height; y++)
                {
                    var value = TemperatureNoiseMap.GetValue(x, y);
                    if (value < min)
                    {
                        min = value;
                    }
                    else if (value > max)
                    {
                        max = value;
                    }
                }
            }

            for (var x = 0; x < width; x++)
            {
                for (var y = 0; y < height; y++)
                {
                    var value = TemperatureNoiseMap.GetValue(x, y);
                    value  = (value - min) / (max - min);
                    value  = 0.75f + 0.25f * value;
                    value *= (float)EffectiveTemperature;
                    TemperatureNoiseMap.SetValue(x, y, value);
                }
            }
        }
        private void GenerateHeightMap(int height)
        {
            var width   = 2 * height;
            var builder = new SphereNoiseMapBuilder();

            builder.SetDestSize(width, height);
            builder.SetBounds(-90, 90, -180, 180);
            HeightNoiseMap       = new NoiseMap();
            builder.SourceModule = HeightNoiseModule;
            builder.DestNoiseMap = HeightNoiseMap;
            builder.Build();

            MinHeight = 10.0f;
            MaxHeight = -10.0f;
            for (var x = 0; x < width; x++)
            {
                for (var y = 0; y < height; y++)
                {
                    var value = HeightNoiseMap.GetValue(x, y);
                    if (value < MinHeight)
                    {
                        MinHeight = value;
                    }
                    else if (value > MaxHeight)
                    {
                        MaxHeight = value;
                    }
                }
            }

            for (var x = 0; x < width; x++)
            {
                for (var y = 0; y < height; y++)
                {
                    var value = HeightNoiseMap.GetValue(x, y);
                    value = (value - MinHeight) / (MaxHeight - MinHeight);
                    HeightNoiseMap.SetValue(x, y, value);
                }
            }
        }
Beispiel #5
0
        public Bitmap Render()
        {
            NoiseMap noise = new NoiseMap(this.Map.MapWidth, this.Map.MapHeight);

            // Copy map data to noise map.
            for (int z = 0; z < noise.Height; z++)
            {
                for (int x = 0; x < noise.Width; x++)
                {
                    noise.SetValue(x, z, this.Map.HeightMap[x, z] * this.Map.Resolution);
                }
            }

            this.Renderer.NoiseMap = noise;

            BitmapAdaptater adapter = new BitmapAdaptater(noise.Width, noise.Height);

            this.Renderer.Image = adapter;
            this.Renderer.Render();
            this.Image = adapter.Bitmap;
            return(this.Image);
        }
        internal override void GenerateColorMap(int height)
        {
            var width = 2 * height;

            var builder = new SphereNoiseMapBuilder();

            ColorNoiseMap        = new NoiseMap();
            builder.SourceModule = ColorNoiseModule;
            builder.SetDestSize(width, height);
            builder.DestNoiseMap = ColorNoiseMap;
            builder.SetBounds(-90, 90, -180, 180);
            builder.Build();

            HeightNoiseMap       = new NoiseMap();
            builder.SourceModule = HeightNoiseModule;
            builder.SetDestSize(1, height);
            builder.DestNoiseMap = HeightNoiseMap;
            builder.SetBounds(-90, 90, 0, 0.000001);
            builder.Build();

            var min    = 1000.0f;
            var max    = -1000.0f;
            var factor = 0.3f;
            var values = new float[height];

            for (var y = 0; y < height; y++)
            {
                var value = (1 - factor) * HeightNoiseMap.GetValue(0, y) + factor * HeightNoiseMap.GetValue(0, height - y);
                values[y] = value;
                if (value < min)
                {
                    min = value;
                }
                else if (value > max)
                {
                    max = value;
                }
            }
            for (var y = 0; y < height; y++)
            {
                var value = values[y];
                value     = (value - min) / (max - min);
                values[y] = value;
            }

            min = 1000.0f;
            max = -1000.0f;
            for (var x = 0; x < width; x++)
            {
                for (var y = 0; y < height; y++)
                {
                    var value = ColorNoiseMap.GetValue(x, y);
                    if (value < min)
                    {
                        min = value;
                    }
                    else if (value > max)
                    {
                        max = value;
                    }
                }
            }

            var turbulence = (float)Sqrt(0.003 * Mass / EarthMass);
            var d          = turbulence * 0.03f;

            for (var x = 0; x < width; x++)
            {
                for (var y = 0; y < height; y++)
                {
                    var value = ColorNoiseMap.GetValue(x, y);
                    value = (value - min) / (max - min);
                    value = (1 - 2 * d) * y / height + d + d * value;
                    var i = (int)(value * height);
                    if (i < 0)
                    {
                        i = 0;
                    }
                    if (i > height - 1)
                    {
                        i = height - 1;
                    }
                    value = values[i];
                    var a = (float)Sin(PI * y / height);
                    a     *= a * a;
                    value *= a;
                    value *= turbulence;
                    ColorNoiseMap.SetValue(x, y, value);
                }
            }
        }