Exemple #1
0
 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);
 }
Exemple #2
0
        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);
        }
Exemple #3
0
        /// <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);
        }