Esempio n. 1
0
        private void ComputeBlocks(World world, Chunk chunk, Chunk.ChunkPart chunkPart, int partNumber, ChunkPosition chunkPosition)
        {
            if (chunkPart.Blocks != null)
            {
                StaticReferences.BlocksToClean.Add(chunkPart.Blocks);
            }
            chunkPart.Blocks = new Blocks3D();
            var partNumberMultipliedBy16 = partNumber << 4;

            var siblingChunks = _worldManager.GetSiblingChunks(world, chunkPosition);

            if (StaticReferences.ParallelMode)
            {
                var blockInfos = new List <BlockInfo> [256];
                Parallel.For(0, 256, (i) =>
                {
                    var x = (byte)(i % 16);
                    var z = (byte)(i / 16);

                    var bInfos = new List <BlockInfo>(64);
                    for (short y = (short)partNumberMultipliedBy16; y < partNumberMultipliedBy16 + 16; y++)
                    {
                        var chunkBlockInfo = _chunkManager.GetBlockInformation(chunk, x, (byte)y, z);
                        if (chunkBlockInfo.Id == 0)
                        {
                            continue;
                        }
                        BlockInfo?blockInfo;
                        if (ComputeBlockInfo(chunk, chunkPosition, siblingChunks, x, z, y, chunkBlockInfo, out blockInfo))
                        {
                            bInfos.Add((BlockInfo)blockInfo);
                        }
                    }
                    blockInfos[i] = bInfos;
                });
                for (int i = 0; i < 256; i++)
                {
                    chunkPart.Blocks.BlockInfos.AddRange(blockInfos[i]);
                }
            }
            else
            {
                for (byte x = 0; x < 16; x++)
                {
                    for (byte z = 0; z < 16; z++)
                    {
                        for (short y = (short)partNumberMultipliedBy16; y < partNumberMultipliedBy16 + 16; y++)
                        {
                            var chunkBlockInfo = _chunkManager.GetBlockInformation(chunk, x, (byte)y, z);
                            if (chunkBlockInfo.Id == 0)
                            {
                                continue;
                            }
                            BlockInfo?blockInfo;
                            if (ComputeBlockInfo(chunk, chunkPosition, siblingChunks, x, z, y,
                                                 chunkBlockInfo, out blockInfo))
                            {
                                chunkPart.Blocks.BlockInfos.Add((BlockInfo)blockInfo);
                            }
                        }
                    }
                }
            }
            chunkPart.Invalidated = false;
        }