/// <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); }