private void ReadCompressedData(BinaryReader br, DataOffsetStruct dos) { var inData = new byte[dos.LengthCompressed]; if (br.Read(inData, 0, inData.Length) != inData.Length) { throw new Exception($"Failed to read compressed data for texture: 0x{dos.Hash:X8}"); } var outData = Compression.Decompress(inData).ToArray(); using (var dcr = new BinaryReader(new MemoryStream(outData))) { // Seek to TextureInfo dcr.BaseStream.Seek(-156, SeekOrigin.End); var texture = ReadTexture(dcr); // Seek to D3DFormat dcr.BaseStream.Seek(-12, SeekOrigin.End); texture.Format = dcr.ReadUInt32(); // Seek to data dcr.BaseStream.Seek(0, SeekOrigin.Begin); if (dcr.BaseStream.Read(texture.Data, 0, texture.Data.Length) != texture.Data.Length) { throw new Exception( $"Failed to read data for texture 0x{texture.TexHash:X8} ({texture.Name})"); } } }
public override void Read(BinaryReader br) { int length = (int)(_header.Length / 0x18); for (int i = 0; i < length; i++) { DataOffsetStruct dos = new DataOffsetStruct(); dos.Hash = br.ReadUInt32(); dos.Offset = br.ReadUInt32(); dos.Length = br.ReadUInt32(); dos.RealLength = br.ReadUInt32(); dos.Flags = br.ReadInt32(); dos.Padding = br.ReadInt32(); _data[dos.Hash] = dos; } }
protected override void WriteData(BinaryWriter bw) { ArrayList list = new ArrayList(_data.Count); foreach (DictionaryEntry de in _data) { list.Add((de.Value as DataOffsetStruct).Hash); } list.Sort(); foreach (uint hash in list) { DataOffsetStruct dos = _data[hash] as DataOffsetStruct; bw.Write(dos.Hash); bw.Write(dos.Offset); bw.Write(dos.Length); bw.Write(dos.RealLength); bw.Write(dos.Flags); bw.Write(dos.Padding); } }