private ServerChunk CreateServerChunk( IChunkSizePolicy chunkSizePolicy, long x, long y, long z, Func<long, long, int> heightMapFunc) { var size = chunkSizePolicy.ChunkCellWidth * chunkSizePolicy.ChunkCellHeight * chunkSizePolicy.ChunkCellDepth; var chunk = new ServerChunk(x, y, z) { Cells = new Cell[size] }; for (var xx = 0; xx < chunkSizePolicy.ChunkCellWidth; xx++) { for (var yy = 0; yy < chunkSizePolicy.ChunkCellHeight; yy++) { for (var zz = 0; zz < chunkSizePolicy.ChunkCellDepth; zz++) { var i = xx + (yy * chunkSizePolicy.ChunkCellWidth) + (zz * chunkSizePolicy.ChunkCellWidth * chunkSizePolicy.ChunkCellHeight); chunk.Cells[i].HeightMap = heightMapFunc(xx, zz); } } } return chunk; }
private void ThreadedUpdate() { this.m_ChunkGenerator.InputConnect(); this.Octree = this.m_ChunkOctreeFactory.CreateChunkOctree<ServerChunk>(); while (true) { ChunkRequest request; if (!this.m_RequestedChunks.TryDequeue(out request)) { Thread.Sleep(10); continue; } var existing = this.Octree.Get(request.X, request.Y, request.Z); if (existing == null) { var chunk = new ServerChunk(request.X, request.Y, request.Z); this.Octree.Set(chunk); this.m_ChunkGenerator.Generate( chunk, () => { }); } } }