public ValveVertexLightingFile(Stream stream)
        {
            using (var reader = new BinaryReader(stream))
            {
                var version = reader.ReadInt32();

                Debug.Assert(version == 2);

                var checksum  = reader.ReadInt32();
                var vertFlags = reader.ReadUInt32();
                var vertSize  = reader.ReadUInt32();
                var vertCount = reader.ReadUInt32();
                var meshCount = reader.ReadInt32();

                reader.ReadInt64(); // Unused
                reader.ReadInt64(); // Unused

                var meshHeaders = new List <VhvMeshHeader>();
                LumpReader <VhvMeshHeader> .ReadLumpFromStream(stream, meshCount, meshHeaders);

                _samples = new VertexData4[meshHeaders.Max(x => x.Lod) + 1][][];

                for (var i = 0; i < _samples.Length; ++i)
                {
                    _samples[i] = new VertexData4[meshHeaders.Count(x => x.Lod == i)][];
                }

                foreach (var meshHeader in meshHeaders)
                {
                    stream.Seek(meshHeader.VertOffset, SeekOrigin.Begin);

                    var samples   = _samples[meshHeader.Lod];
                    var meshIndex = Array.IndexOf(samples, null);

                    if (vertFlags == 2)
                    {
                        samples[meshIndex] = LumpReader <VertexData2> .ReadLumpFromStream(stream, meshHeader.VertCount, x => x.GetVertexColor());
                    }
                    else
                    {
                        samples[meshIndex] = LumpReader <VertexData4> .ReadLumpFromStream(stream, meshHeader.VertCount, x => x.GetVertexColor());
                    }
                }
            }
        }
        public ValveVertexLightingFile(Stream stream)
        {
            using (var reader = new BinaryReader(stream))
            {
                var version    = (int)reader.ReadByte();
                var baseOffset = 0;

                if (version == 0)
                {
                    // First 3 bytes are missing :(
                    version    = 2;
                    baseOffset = -3;
                }
                else
                {
                    version |= reader.ReadByte() << 8;
                    version |= reader.ReadUInt16() << 16;
                }

                if (version != 2)
                {
                    throw new NotSupportedException($"Vertex lighting file version {version:x} is not supported.");
                }

                var checksum  = reader.ReadInt32();
                var vertFlags = reader.ReadUInt32();
                var vertSize  = reader.ReadUInt32();
                var vertCount = reader.ReadUInt32();
                var meshCount = reader.ReadInt32();

                var unused0 = reader.ReadInt64(); // Unused
                var unused1 = reader.ReadInt64(); // Unused

                var meshHeaders = new List <VhvMeshHeader>();
                LumpReader <VhvMeshHeader> .ReadLumpFromStream(stream, meshCount, meshHeaders);

                _samples = new VertexData4[meshHeaders.Max(x => x.Lod) + 1][][];

                for (var i = 0; i < _samples.Length; ++i)
                {
                    _samples[i] = new VertexData4[meshHeaders.Count(x => x.Lod == i)][];
                }

                foreach (var meshHeader in meshHeaders)
                {
                    stream.Seek(meshHeader.VertOffset + baseOffset, SeekOrigin.Begin);

                    var samples   = _samples[meshHeader.Lod];
                    var meshIndex = Array.IndexOf(samples, null);

                    if (vertFlags == 2)
                    {
                        samples[meshIndex] = LumpReader <VertexData2> .ReadLumpFromStream(stream, meshHeader.VertCount, x => x.GetVertexColor());
                    }
                    else
                    {
                        samples[meshIndex] = LumpReader <VertexData4> .ReadLumpFromStream(stream, meshHeader.VertCount, x => x.GetVertexColor());
                    }
                }
            }
        }