public static WorldChunk CreateWorldChunk(ChunkLocation l, BlockWorld w) { WorldChunk c = pool.Get(); c.SetUp(l, w); return(c); }
public ChunkTower(int x, int y, int z, FastNoise noise) { float[,,] noisecache = new float[WorldChunk.Size, WorldChunk.Size *Height + 1, WorldChunk.Size]; for (int bx = 0; bx < WorldChunk.Size; bx++) { for (int by = 0; by < WorldChunk.Size * Height + 1; by++) { for (int bz = 0; bz < WorldChunk.Size; bz++) { noisecache[bx, by, bz] = 0.5f - ((float)(y * WorldChunk.Size + by) / 40) + noise.GetSimplexFractal(x * WorldChunk.Size + bx, y * WorldChunk.Size + by, z * WorldChunk.Size + bz); } } } chunks = new Chunk[Height]; for (int i = 0; i < chunks.Length; i++) { chunks[i] = new WorldChunk(); if (i > 0) { chunks[i].SetNeighbor(Direction.PositiveY, chunks[i - 1]); } for (int bx = 0; bx < WorldChunk.Size; bx++) { for (int by = 0; by < WorldChunk.Size; by++) { for (int bz = 0; bz < WorldChunk.Size; bz++) { chunks[i].SetBlockDirect(bx, by, bz, noisecache[bx, i * WorldChunk.Size + by + 1, bz] > 0 ? Blocks.Stone : noisecache[bx, i * WorldChunk.Size + by, bz] > 0 ? Blocks.Grass : Blocks.Air); } } } } }
private void LoadChunks() { while (currentlyLoading.Count <= MaxLoadTasks && chunkLoadQueue.Count > 0) { ChunkLocation l = chunkLoadQueue.Dequeue(); if (GetDistanceSquared(l) > UnloadDistance * UnloadDistance) { continue; } currentlyLoading.Add(l); WorldChunk chunk = WorldChunk.CreateWorldChunk(l, this); Task.Run(() => { generator.FillChunk(chunk); loadedChunks.Enqueue(chunk); }); } while (!loadedChunks.IsEmpty) { loadedChunks.TryDequeue(out WorldChunk chunk); for (int d = 0; d < 6; d++) { chunk.SetNeighbor(d, GetChunk(chunk.Location.GetAdjecent(d))); } chunk.SetMeshUpdates(true); chunkMap.Add(chunk.Location, chunk); currentlyLoading.Remove(chunk.Location); } }