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