private static void ReadAnimsBG(GFPackage.Entry File, BinaryReader Reader, GFMotionPack MotPack) { if (File.Length < 0x80) { return; } Reader.BaseStream.Seek(File.Address, SeekOrigin.Begin); GFPackage.Header Header = GFPackage.GetPackageHeader(Reader.BaseStream); foreach (GFPackage.Entry Entry in Header.Entries) { if (Entry.Length < 4) { continue; } Reader.BaseStream.Seek(Entry.Address, SeekOrigin.Begin); uint MagicNum = Reader.ReadUInt32(); if (MagicNum == GFMotionConstant) { Reader.BaseStream.Seek(-4, SeekOrigin.Current); MotPack.Add(new GFMotion(Reader, MotPack.Count)); } } }
private static void ReadAnimsBG(GFPackage.Entry file, BinaryReader reader, GFMotionPack motPack) { if (file.Length < 0x80) { return; } reader.BaseStream.Seek(file.Address, SeekOrigin.Begin); var header = GFPackage.GetPackageHeader(reader.BaseStream); foreach (var entry in header.Entries) { if (entry.Length < 4) { continue; } reader.BaseStream.Seek(entry.Address, SeekOrigin.Begin); var magicNum = reader.ReadUInt32(); if (magicNum == GFMotionConstant) { reader.BaseStream.Seek(-4, SeekOrigin.Current); motPack.Add(new GFMotion(reader, motPack.Count)); } } }
private static void ReadModelsBG(GFPackage.Entry File, BinaryReader Reader, GFModelPack MdlPack) { if (File.Length < 0x80) { return; } Reader.BaseStream.Seek(File.Address, SeekOrigin.Begin); GFPackage.Header Header = GFPackage.GetPackageHeader(Reader.BaseStream); foreach (GFPackage.Entry Entry in Header.Entries) { if (Entry.Length < 4) { continue; } Reader.BaseStream.Seek(Entry.Address, SeekOrigin.Begin); uint MagicNum = Reader.ReadUInt32(); switch (MagicNum) { case GFModelConstant: Reader.BaseStream.Seek(-4, SeekOrigin.Current); MdlPack.Models.Add(new GFModel(Reader, $"Model_{MdlPack.Models.Count}")); break; case GFTextureConstant: uint Count = Reader.ReadUInt32(); string Signature = string.Empty; for (int i = 0; i < 8; i++) { byte Value = Reader.ReadByte(); if (Value < 0x20 || Value > 0x7e) { break; } Signature += (char)Value; } Reader.BaseStream.Seek(Entry.Address, SeekOrigin.Begin); if (Signature == "texture") { MdlPack.Textures.Add(new GFTexture(Reader)); } else { MdlPack.MaterialShaders.Add(new GFShader(Reader)); } break; } } }
private static void ReadModelsBG(GFPackage.Entry file, BinaryReader reader, GFModelPack mdlPack) { if (file.Length < 0x80) { return; } reader.BaseStream.Seek(file.Address, SeekOrigin.Begin); var header = GFPackage.GetPackageHeader(reader.BaseStream); foreach (var entry in header.Entries) { if (entry.Length < 4) { continue; } reader.BaseStream.Seek(entry.Address, SeekOrigin.Begin); var magicNum = reader.ReadUInt32(); switch (magicNum) { case GFModelConstant: reader.BaseStream.Seek(-4, SeekOrigin.Current); mdlPack.Models.Add(new GFModel(reader, $"Model_{mdlPack.Models.Count}")); break; case GFTextureConstant: var count = reader.ReadUInt32(); var signature = string.Empty; for (var i = 0; i < 8; i++) { var value = reader.ReadByte(); if (value < 0x20 || value > 0x7e) { break; } signature += (char)value; } reader.BaseStream.Seek(entry.Address, SeekOrigin.Begin); if (signature == "texture") { mdlPack.Textures.Add(new GFTexture(reader)); } else { mdlPack.Shaders.Add(new GFShader(reader)); } break; } } }
private static H3D IdentifyAndOpen(Stream Stm, H3DDict <H3DBone> Skeleton) { H3D Output = null; if (GFPackage.IsValidPackage(Stm)) { GFPackage.Header PackHeader = GFPackage.GetPackageHeader(Stm); switch (PackHeader.Magic) { //case "AL": Output = GFAreaLOD.OpenAsH3D(FS, PackHeader, 1); break; //case "AD": Output = GFPackedTexture.OpenAsH3D(FS, PackHeader, 1); break; //case "BG": Output = GFL2OverWorld.OpenAsH3D(FS, PackHeader, Skeleton); break; case "BS": Output = GFBtlSklAnim.OpenAsH3D(Stm, PackHeader, Skeleton); break; //case "CM": Output = GFCharaModel.OpenAsH3D(FS, PackHeader); break; //case "GR": Output = GFOWMapModel.OpenAsH3D(FS, PackHeader); break; case "MM": Output = GFOWCharaModel.OpenAsH3D(Stm, PackHeader); break; case "PC": if (PackHeader.Entries.Length == 5 || PackHeader.Entries.Length == 3) { Output = GFPkmnModel.OpenAsH3D(Stm, PackHeader, Skeleton); } else { goto default; } break; //case "LL": //default: //case "PT": Output = GFPackedTexture.OpenAsH3D(FS, PackHeader, 0); break; //case "PK": //case "PB": // Output = GFPkmnSklAnim.OpenAsH3D(FS, PackHeader, Skeleton); break; default: Output = new H3D(); for (int i = 0; i < PackHeader.Entries.Length; i++) { GFPackage.Entry Entry = PackHeader.Entries[i]; //Need to read to memory for correct absolute seeks Stm.Seek(Entry.Address, SeekOrigin.Begin); byte[] Buf = new byte[Entry.Length]; Stm.Read(Buf, 0, Buf.Length); using (MemoryStream MS = new MemoryStream(Buf)) { H3D EntryH3D = FormatIdentifier.IdentifyByMagic(MS, Skeleton, null); if (EntryH3D != null) { Output.Merge(EntryH3D, true); } else { MS.Seek(0, SeekOrigin.Begin); if (GFPackage.IsValidPackage(MS)) { H3D SubContainer = IdentifyAndOpen(MS, Skeleton); if (SubContainer != null) { Output.Merge(SubContainer); } } } } } break; } } return(Output); }