Example #1
0
    // 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;
    }
Example #2
0
        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();
                }
            }
        }