public MDLShapePacket(DhBinaryReader br) { DataOffset = br.ReadU32(); DataSize = br.ReadU32(); Unknown = br.ReadS16(); MatrixCount = br.ReadU16(); MatrixIndices = br.ReadU16s(10); PacketData = new List <ShapePacketData>(); Data = br.ReadAt(DataOffset, (int)DataSize); }
public static VirtDirectory LoadRarc(byte[] data) { if (Yay0.IsCompressed(data)) { data = Yay0.Decompress(data); } DhBinaryReader br = new DhBinaryReader(data, DhEndian.Big); if (br.ReadStr(4) != "RARC") { throw new InvalidDataException("No valid RARC signature was found!"); } List <RarcNode> nodes = new List <RarcNode>(); List <RarcEntry> entries = new List <RarcEntry>(); // read header // RARC here br.Skip(4); br.Skip(4); var dataOffset = br.ReadU32() + 0x20; br.Skip(4); br.Skip(4); br.Skip(4); br.Skip(4); // read infoblock var NodeCount = br.ReadU32(); var NodeOffset = br.ReadU32() + 0x20; var EntryCount = br.ReadU32(); var EntryOffset = br.ReadU32() + 0x20; br.Skip(4); var StringTableOffset = br.ReadU32() + 0x20; br.Skip(2); br.Skip(2); br.Skip(4); br.Goto(EntryOffset); // read entries for (int i = 0; i < EntryCount; i++) { RarcEntry entry = new RarcEntry() { Id = br.ReadU16(), NameHash = br.ReadU16(), Type = br.ReadU16(), NameOffset = br.ReadU16(), DataOffset = br.ReadU32(), DataLength = br.ReadU32() }; if (entry.Type == 0x1100) { entry.Data = br.ReadAt(dataOffset + entry.DataOffset, (int)entry.DataLength); } entry.MemoryPointer = br.ReadU32(); entry.Name = br.ReadStrAt(StringTableOffset + entry.NameOffset); entries.Add(entry); } br.Goto(NodeOffset); // read nodes for (int i = 0; i < NodeCount; i++) { RarcNode rarcNode = new RarcNode() { Id = br.ReadStr(4), NameOffset = br.ReadU32(), NameHash = br.ReadU16(), EntryCount = br.ReadU16(), FirstEntryIndex = br.ReadU32() }; rarcNode.Name = br.ReadStrAt(StringTableOffset + rarcNode.NameOffset); rarcNode.Entries = entries.GetRange((int)rarcNode.FirstEntryIndex, (int)rarcNode.EntryCount); nodes.Add(rarcNode); } List <VirtDirectory> virtDirectories = new List <VirtDirectory>(nodes.Count); foreach (RarcNode rarcNode in nodes) { virtDirectories.Add(new VirtDirectory(rarcNode.Name, Guid.Empty)); } for (int i = 0; i < nodes.Count; i++) { RarcNode rarcNode = nodes[i]; for (int y = 0; y < nodes[i].Entries.Count; y++) { if (rarcNode.Entries[y].Name == "." || rarcNode.Entries[y].Name == "..") { continue; } if (rarcNode.Entries[y].Type == (ushort)NodeType.Directory) { var virtDirectory = virtDirectories[(int)rarcNode.Entries[y].DataOffset]; virtDirectory.ParentGuid = virtDirectories[i].Guid; virtDirectory.Name = rarcNode.Entries[y].Name; virtDirectories[i].Children.Add(virtDirectory); } else { VirtFile virtFile = new VirtFile(rarcNode.Entries[y].Name, virtDirectories[i].Guid, rarcNode.Entries[y].Data); virtDirectories[i].Children.Add(virtFile); } } } return(virtDirectories.Count > 0 ? virtDirectories[0] : null); }
/// <summary> /// Reads BTI using a BinaryReader. (BinTexture Format) /// </summary> /// <param name="br">The BinaryReader to use.</param> public BTI(DhBinaryReader br, uint textureHeader) { // Set Width. Width = br.ReadU16(); // Set Height. Height = br.ReadU16(); // Set Texture Format. Format = (TextureFormat)br.Read(); // Set Alpha Flag. AlphaFlag = br.Read(); // Set WrapS. WrapS = WrapMode.ClampToEdge; // Set WrapT. WrapT = WrapMode.ClampToEdge; // Set Palette Format. PaletteFormat = PaletteFormat.RGB565; // Set Palette Count. PaletteCount = 0; // Set Palette Offset. PaletteOffset = 0; // Set Unknown 1. (Padding?) Unknown1 = 0; // Set MinFilterMode. MinFilterMode = FilterMode.Linear; // Set MagFilterMode. MagFilterMode = FilterMode.Linear; // Set MinLOD. MinLOD = 0; // Set MagLOD. MagLOD = 1; // Set MipMap Count. MipMapCount = 0; // Set LodBias. LodBias = 0; // Skip 2 bytes of padding. br.Skip(2); // Set Data Offset. DataOffset = br.ReadU32(); // Read data. int length = 0; switch (Format) { case TextureFormat.C4: length = Width * Height * 8; break; case TextureFormat.C8: length = Width * Height * 8; break; default: length = Width * Height * 4; break; } Data = br.ReadAt((textureHeader) + DataOffset, length); }