Exemplo n.º 1
0
        public static WorldChunk CreateWorldChunk(ChunkLocation l, BlockWorld w)
        {
            WorldChunk c = pool.Get();

            c.SetUp(l, w);
            return(c);
        }
Exemplo n.º 2
0
        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);
                        }
                    }
                }
            }
        }
Exemplo n.º 3
0
        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);
            }
        }