city-generation/Game/Assets/Scripts/Generator/TerrainGenerator.cs

72 lines
2.1 KiB
C#
Raw Normal View History

2015-03-13 15:36:12 +00:00
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Xml.Serialization;
using TransportGame.Business;
using TransportGame.Model;
using TransportGame.Noise;
using TransportGame.Utils;
using TransportGame.Utils.Algorithms;
using UnityEngine;
namespace TransportGame.Generator
{
public class TerrainGenerator
{
2015-03-23 19:17:09 +00:00
/// <summary>
/// Gets or sets the underlying noise generator
/// </summary>
2015-03-13 15:36:12 +00:00
public NoiseGenerator Noise { get; set; }
private System.Random random = new System.Random();
2015-03-23 19:17:09 +00:00
2015-03-13 15:36:12 +00:00
public TerrainGenerator()
{
Noise = new PerlinNoiseGenerator();
if (ConfigurationManager.TerrGenConfig == null)
throw new Exception("Not initialized!");
2015-03-13 15:36:12 +00:00
Noise.Octaves = ConfigurationManager.TerrGenConfig.NoiseOctaves;
Noise.NonLinearPower = ConfigurationManager.TerrGenConfig.NoiseNonLinearPower;
Noise.Scale = ConfigurationManager.TerrGenConfig.ElevationScale;
}
public Map Generate(int width, int height)
{
// Create map
Map map = new Map(width, height);
// Pick a random biome
map.Biome = PickBiome();
Logger.Info("Picked biome: {0}", map.Biome.Name);
// Generate elevation
GenerateElevation(map);
// Generate water level
float waterAmount = random.NextSingle(map.Biome.Moisture.Minimum, map.Biome.Moisture.Maximum);
2015-03-19 10:34:58 +00:00
map.WaterLevel = Mathf.Pow(waterAmount, ConfigurationManager.TerrGenConfig.WaterNonLinearPower) * map.Biome.Height;
2015-03-13 15:36:12 +00:00
return map;
}
private Biome PickBiome()
{
int biomeCount = BiomeManager.Biomes.Count();
int biome = random.Next(biomeCount);
return BiomeManager.Biomes.ElementAt(biome);
}
private void GenerateElevation(Map map)
{
for (int x = 0; x < map.Width; ++x)
for (int y = 0; y < map.Height; ++y)
2015-05-20 08:26:46 +00:00
map.Heightmap[x, y] = Noise.Generate(x, y, 0, 1);
2015-03-13 15:36:12 +00:00
}
}
}