Implemented population center generator
This commit is contained in:
		@@ -12,7 +12,8 @@ namespace TransportGame.MapViewer
 | 
			
		||||
        {
 | 
			
		||||
            None = 0,
 | 
			
		||||
            Elevation = 1,
 | 
			
		||||
            All = Elevation 
 | 
			
		||||
            Population = 2,
 | 
			
		||||
            All = Elevation | Population
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
@@ -36,7 +37,7 @@ namespace TransportGame.MapViewer
 | 
			
		||||
 | 
			
		||||
        private readonly Color WaterColor = Colors.Navy;
 | 
			
		||||
        private readonly Color ElevationTerrainColor = Colors.White;
 | 
			
		||||
        private readonly Color TerrainColor = Colors.Gray;
 | 
			
		||||
        private readonly Color TerrainColor = Colors.Silver;
 | 
			
		||||
 | 
			
		||||
        public MapRenderer()
 | 
			
		||||
        {
 | 
			
		||||
@@ -57,14 +58,24 @@ namespace TransportGame.MapViewer
 | 
			
		||||
                Bitmap24 bitmap = new Bitmap24(Convert.ToInt32(map.Width * Scale), Convert.ToInt32(map.Height * Scale));
 | 
			
		||||
 | 
			
		||||
                // First layer - cells
 | 
			
		||||
                DrawCells(bitmap, map, (layers & Layers.Elevation) > 0);
 | 
			
		||||
                DrawPixels(bitmap, map, (layers & Layers.Elevation) > 0, (layers & Layers.Population) > 0);
 | 
			
		||||
 | 
			
		||||
                // Done
 | 
			
		||||
                return bitmap;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void DrawCells(Bitmap24 bitmap, Map map, bool elevation)
 | 
			
		||||
        private Color AlphaBlend(Color top, Color dst)
 | 
			
		||||
        {
 | 
			
		||||
            float A = top.ScA + dst.ScA * (1 - top.ScA);
 | 
			
		||||
            float R = (top.ScR * top.ScA + dst.ScR * (1 - top.ScA)) / A;
 | 
			
		||||
            float G = (top.ScG * top.ScA + dst.ScG * (1 - top.ScA)) / A;
 | 
			
		||||
            float B = (top.ScB * top.ScA + dst.ScB * (1 - top.ScA)) / A;
 | 
			
		||||
 | 
			
		||||
            return Color.FromScRgb(A, R, G, B);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void DrawPixels(Bitmap24 bitmap, Map map, bool elevation, bool population)
 | 
			
		||||
        {
 | 
			
		||||
            for (int x = 0; x < bitmap.Width; x++)
 | 
			
		||||
                for (int y = 0; y < bitmap.Height; y++)
 | 
			
		||||
@@ -76,17 +87,24 @@ namespace TransportGame.MapViewer
 | 
			
		||||
                    if (map.IsWater(mapX, mapY))
 | 
			
		||||
                        bitmap[x, y] = WaterColor;
 | 
			
		||||
 | 
			
		||||
                    // Draw elevation
 | 
			
		||||
                    else if (elevation)
 | 
			
		||||
                    {
 | 
			
		||||
                        float alpha = map.Heightmap[mapX, mapY]; // map.Heights range is [0,1]
 | 
			
		||||
                        bitmap[x, y] = Color.Multiply(ElevationTerrainColor, alpha);
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    // Draw terrain
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
                        bitmap[x, y] = TerrainColor;
 | 
			
		||||
                        // Draw elevation
 | 
			
		||||
                        if (elevation)
 | 
			
		||||
                        {
 | 
			
		||||
                            float alpha = map.Heightmap[mapX, mapY]; // map.Heights range is [0,1]
 | 
			
		||||
                            bitmap[x, y] = Color.Multiply(ElevationTerrainColor, alpha);
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        // No elevation, just put a terrain color
 | 
			
		||||
                        else bitmap[x, y] = TerrainColor;
 | 
			
		||||
 | 
			
		||||
                        // Population
 | 
			
		||||
                        if (population)
 | 
			
		||||
                        {
 | 
			
		||||
                            Color popColor = Color.FromScRgb(map.GetPopulation(mapX, mapY) * 0.7f, 1, 0, 1);
 | 
			
		||||
                            bitmap[x, y] = AlphaBlend(popColor, bitmap[x, y]);
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -61,9 +61,7 @@
 | 
			
		||||
                <StackPanel Orientation="Vertical">
 | 
			
		||||
                    <CheckBox IsChecked="{Binding LayersAll}">(All)</CheckBox>
 | 
			
		||||
                    <CheckBox IsChecked="{Binding LayerElevation}">Elevation</CheckBox>
 | 
			
		||||
                    <CheckBox>Roads</CheckBox>
 | 
			
		||||
                    <CheckBox>Buildings</CheckBox>
 | 
			
		||||
                    <CheckBox>Vegetation</CheckBox>
 | 
			
		||||
                    <CheckBox IsChecked="{Binding LayerPopulation}">Population</CheckBox>
 | 
			
		||||
                    
 | 
			
		||||
                    <Button Name="buttonRender" Grid.Column="1" Content="Render" Click="buttonRender_Click" />
 | 
			
		||||
                    
 | 
			
		||||
 
 | 
			
		||||
@@ -109,10 +109,10 @@ namespace TransportGame.MapViewer
 | 
			
		||||
        {
 | 
			
		||||
            get
 | 
			
		||||
            {
 | 
			
		||||
                if (LayerElevation)
 | 
			
		||||
                if (LayerElevation && LayerPopulation)
 | 
			
		||||
                    return true;
 | 
			
		||||
 | 
			
		||||
                if (!LayerElevation)
 | 
			
		||||
                if (!LayerElevation && !LayerPopulation)
 | 
			
		||||
                    return false;
 | 
			
		||||
 | 
			
		||||
                return null;
 | 
			
		||||
@@ -122,12 +122,13 @@ namespace TransportGame.MapViewer
 | 
			
		||||
                if (value.HasValue)
 | 
			
		||||
                {
 | 
			
		||||
                    LayerElevation = value.Value;
 | 
			
		||||
                    LayerPopulation = value.Value;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Gets or sets the layer elevation layer flag
 | 
			
		||||
        /// Gets or sets the elevation layer flag
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public bool LayerElevation
 | 
			
		||||
        {
 | 
			
		||||
@@ -148,6 +149,28 @@ namespace TransportGame.MapViewer
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Gets or sets the population layer flag
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public bool LayerPopulation
 | 
			
		||||
        {
 | 
			
		||||
            get
 | 
			
		||||
            {
 | 
			
		||||
                return _layers.HasFlag(MapRenderer.Layers.Population);
 | 
			
		||||
            }
 | 
			
		||||
            set
 | 
			
		||||
            {
 | 
			
		||||
                if (value) _layers |= MapRenderer.Layers.Population;
 | 
			
		||||
                else _layers &= ~MapRenderer.Layers.Population;
 | 
			
		||||
 | 
			
		||||
                if (PropertyChanged != null)
 | 
			
		||||
                {
 | 
			
		||||
                    PropertyChanged(this, new PropertyChangedEventArgs("LayerPopulation"));
 | 
			
		||||
                    PropertyChanged(this, new PropertyChangedEventArgs("LayersAll"));
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        #endregion
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
 
 | 
			
		||||
@@ -6,6 +6,7 @@ using System.Text;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using System.Xml.Serialization;
 | 
			
		||||
using TransportGame.Model;
 | 
			
		||||
using TransportGame.Utils;
 | 
			
		||||
 | 
			
		||||
namespace TransportGame.MapViewer.Storage
 | 
			
		||||
{
 | 
			
		||||
@@ -13,16 +14,7 @@ namespace TransportGame.MapViewer.Storage
 | 
			
		||||
    {
 | 
			
		||||
        public static Map Read(string file)
 | 
			
		||||
        {
 | 
			
		||||
            XmlSerializer serializer = new XmlSerializer(typeof(Map));
 | 
			
		||||
            Map map;
 | 
			
		||||
 | 
			
		||||
            using (StreamReader reader = new StreamReader(file))
 | 
			
		||||
            {
 | 
			
		||||
                map = (Map)serializer.Deserialize(reader);
 | 
			
		||||
                reader.Close();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return map;
 | 
			
		||||
            return SerializationHelper.DeserializeXml<Map>(file);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user