Пример #1
0
        public void Update()
        {
            int maxLoadChunks = 5;
            int maxMeshChunks = 1;

            int loadedChunks = 0;
            while (chunkLoadQueue.Count > 0 && loadedChunks < maxLoadChunks)
            {
                // load chunk
                var coords = chunkLoadQueue.Dequeue();
                var chunk = new VoxelChunk(coords.Item1, coords.Item2, ChunkWidth, ChunkHeight, ChunkDepth);

                // generate terrain
                for (int x = 0; x < ChunkWidth; x++)
                {
                    for (int z = 0; z < ChunkDepth; z++)
                    {
                        int h = (int)(ChunkHeight * (0.5 + 0.5 * noise.Evaluate((coords.Item1 * ChunkWidth + x) * 0.009, (coords.Item2 * ChunkDepth + z) * 0.009)));

                        for (int y = 0; y < h; y++)
                        {
                            chunk[x, y, z] = Extensions.ColorFromHSV(110, 0.94, (h / (double)ChunkHeight)*0.4+0.55).ToShortColor(); // (ushort)(ChunkCount + 1);
                        }
                    }
                }

                chunksToMesh.Add(coords, chunk);
            }

            List<Tuple<int, int>> meshedChunks = new List<Tuple<int, int>>();
            int chunksMeshed = 0;
            foreach (var kvp in chunksToMesh)
            {
                var coords = kvp.Key;
                int x = coords.Item1;
                int z = coords.Item2;

                if (ChunkMeshedOrLoaded(x - 1, z) && ChunkMeshedOrLoaded(x + 1, z) && ChunkMeshedOrLoaded(x, z - 1) && ChunkMeshedOrLoaded(x, z + 1))
                {
                    var chunk = kvp.Value;
                    chunk.BuildMesh();
                    meshedChunks.Add(coords);
                    chunksMeshed++;
                    if (chunksMeshed >= maxMeshChunks)
                        break;
                }
            }

            foreach (var coords in meshedChunks)
            {
                var chunk = chunksToMesh[coords];
                chunksToMesh.Remove(coords);
                chunks.Add(coords, chunk);
            }
            //Console.WriteLine("loaded chunks: {0}  meshed chunks: {1}", loadedChunks, chunksMeshed);
        }