Beispiel #1
0
        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));
                }
            }
        }
Beispiel #2
0
        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));
                }
            }
        }
Beispiel #3
0
        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;
                }
            }
        }
Beispiel #4
0
        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;
                }
            }
        }
Beispiel #5
0
        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);
        }