// Use this for initialization void Start() { Hexasphere hexasphere = new Hexasphere(radius, 30); var verts = new List <Vector3>(); var tris = new List <int>(); var i = 0; foreach (Region region in hexasphere.Regions) { foreach (Tile tile in region.GetTiles()) { foreach (var point in tile.Boundary) { var height = Mathf.Max(TerrainHeight - NoiseGenerator.getDensity(point.AsVector(), 0, TerrainHeight, octaves: 3, persistence: 0.85f), 0); verts.Add(point.Project(height).AsVector()); } tris.Add(i); tris.Add(i + 1); tris.Add(i + 2); tris.Add(i + 2); tris.Add(i + 3); tris.Add(i + 4); tris.Add(i + 4); tris.Add(i); tris.Add(i + 2); if (tile.Boundary.Count > 5) { tris.Add(i + 4); tris.Add(i + 5); tris.Add(i); } i += tile.Boundary.Count; } } var mesh = new Mesh() { vertices = verts.ToArray(), triangles = tris.ToArray() }; mesh.RecalculateNormals(); GetComponent <MeshFilter>().mesh = mesh; }
public void GenerateTerrain(SimplexNoiseGenerator noiseGenerator, int terrainHeight, int heightLimit, int planetRadius) { var chunkHeight = Mathf.CeilToInt(heightLimit / Chunk.CHUNK_HEIGHT); Chunks = new Chunk[chunkHeight]; for (var i = 0; i < chunkHeight; i++) { Chunks[i] = new Chunk(Center + Center.normalized * Chunk.CHUNK_HEIGHT * i, Tiles.Count, i, this); } for (var i = 0; i < Tiles.Count; i++) { var tile = Tiles[i]; var height = Mathf.Max(terrainHeight - noiseGenerator.getDensity(tile.Center.AsVector(), 0, terrainHeight, octaves: 3, persistence: 0.60f, multiplier: planetRadius / 2), 0); for (var j = 0; j < Chunks.Length; j++) { for (var h = 0; h < Chunk.CHUNK_HEIGHT; h++) { if (j == 0 && h == 0) { Chunks[j].SetBlock(i, h, 1, false); } else if (j * Chunk.CHUNK_HEIGHT + h < height) { Chunks[j].SetBlock(i, h, 2, false); } else { Chunks[j].SetBlock(i, h, 0, false); } } Chunks[j].CheckForEmptiness(); } } }