Esempio n. 1
0
        /// <summary>
        /// Processes chunk data to create graphical data
        /// </summary>
        /// <param name="position">Position of chunk</param>
        /// <param name="chunk">Chunk to process</param>
        public void ProcessChunk(Point3 position, DataChunk chunk)
        {
            lock (Locker)
                Chunks[position] = chunk;
            Vector3               blockPos;
            DataBlock             block;
            BlockSides            sides;
            List <GraphicalBlock> toAdd = new List <GraphicalBlock>();

            for (int i = 0; i < chunk.Blocks.Length; i++)
            {
                block = chunk.Blocks[i];
                if (block == null)
                {
                    continue;
                }

                byte
                    x = (byte)((block.Position & 0x00F)),
                    z = (byte)((block.Position & 0x0F0) / 0x010),
                    y = (byte)((block.Position & 0xF00) / 0x100);

                blockPos = new Vector3(position.X * Constants.ChunkSize + x, position.Y * Constants.ChunkSize + y, position.Z * Constants.ChunkSize + z);
                sides    = CalculateBlockSides(chunk, block.Position);

                toAdd.Add(new GraphicalBlock(blockPos, sides, block.Material));
            }

            CheckLeftChunk(position, chunk, toAdd);
            CheckRightChunk(position, chunk, toAdd);
            CheckFrontChunk(position, chunk, toAdd);
            CheckBackChunk(position, chunk, toAdd);
            CheckTopChunk(position, chunk, toAdd);
            CheckBottomChunk(position, chunk, toAdd);

            Terrain.AddBlocks(position, toAdd);
        }