public void Read(HKX hkx, HKXSection section, BinaryReaderEx br, HKX.HKXVariation variation)
 {
     ClassNames          = new List <HKXClassName>();
     OffsetClassNamesMap = new Dictionary <uint, HKXClassName>();
     while (br.ReadUInt16() != 0xFFFF)
     {
         br.Position -= 2;
         uint stringStart = (uint)br.Position + 5;
         var  className   = new HKXClassName(br);
         ClassNames.Add(className);
         OffsetClassNamesMap.Add(stringStart, className);
     }
 }
 public void WriteData(BinaryWriterEx bw, HKX hkx, HKX.HKXVariation variation)
 {
     /*uint absoluteOffset = (uint)bw.Position;
      * bw.FillUInt32("absoffset" + SectionID, absoluteOffset);
      * foreach (var obj in Objects)
      * {
      *  obj.Write(hkx, this, bw, absoluteOffset, variation);
      * }
      *
      * // Local fixups
      * bw.FillUInt32("locoffset" + SectionID, (uint)bw.Position - absoluteOffset);
      * foreach (var loc in LocalReferences)
      * {
      *  loc.Write(bw);
      * }
      * while ((bw.Position % 16) != 0)
      * {
      *  bw.WriteByte(0xFF); // 16 byte align
      * }
      *
      * // Global fixups
      * bw.FillUInt32("globoffset" + SectionID, (uint)bw.Position - absoluteOffset);
      * foreach (var glob in GlobalReferences)
      * {
      *  glob.Write(bw);
      * }
      * while ((bw.Position % 16) != 0)
      * {
      *  bw.WriteByte(0xFF); // 16 byte align
      * }
      *
      * // Virtual fixups
      * bw.FillUInt32("virtoffset" + SectionID, (uint)bw.Position - absoluteOffset);
      * foreach (var virt in VirtualReferences)
      * {
      *  virt.Write(bw);
      * }
      * while ((bw.Position % 16) != 0)
      * {
      *  bw.WriteByte(0xFF); // 16 byte align
      * }
      *
      * bw.FillUInt32("expoffset" + SectionID, (uint)bw.Position - absoluteOffset);
      * bw.FillUInt32("impoffset" + SectionID, (uint)bw.Position - absoluteOffset);
      * bw.FillUInt32("endoffset" + SectionID, (uint)bw.Position - absoluteOffset);*/
 }
 public void WriteHeader(BinaryWriterEx bw, HKX.HKXVariation variation)
 {
     bw.WriteFixStr(SectionTag, 19);
     bw.WriteByte(0xFF);
     bw.ReserveUInt32("absoffset" + SectionID);
     bw.ReserveUInt32("locoffset" + SectionID);
     bw.ReserveUInt32("globoffset" + SectionID);
     bw.ReserveUInt32("virtoffset" + SectionID);
     bw.ReserveUInt32("expoffset" + SectionID);
     bw.ReserveUInt32("impoffset" + SectionID);
     bw.ReserveUInt32("endoffset" + SectionID);
     if (variation == HKX.HKXVariation.HKXBloodBorne || variation == HKX.HKXVariation.HKXDS3)
     {
         bw.WriteUInt32(0xFFFFFFFF);
         bw.WriteUInt32(0xFFFFFFFF);
         bw.WriteUInt32(0xFFFFFFFF);
         bw.WriteUInt32(0xFFFFFFFF);
     }
 }
 public void Write(HKX hkx, HKXSection section, BinaryWriterEx bw, uint sectionBaseOffset, HKX.HKXVariation variation)
 {
     foreach (var cls in ClassNames)
     {
         cls.Write(bw, sectionBaseOffset);
     }
     while ((bw.Position % 16) != 0)
     {
         // Write padding bytes to 16 byte align
         bw.WriteByte(0xFF);
     }
 }
            internal HKXSection(BinaryReaderEx br, HKX.HKXVariation variation)
            {
                SectionTag = br.ReadFixStr(19);
                br.AssertByte(0xFF);
                AbsoluteDataStart   = br.ReadUInt32();
                LocalFixupsOffset   = br.ReadUInt32();
                GlobalFixupsOffset  = br.ReadUInt32();
                VirtualFixupsOffset = br.ReadUInt32();
                ExportsOffset       = br.ReadUInt32();
                ImportsOffset       = br.ReadUInt32();
                EndOffset           = br.ReadUInt32();

                // Read Data
                br.StepIn(AbsoluteDataStart);
                SectionData = br.ReadBytes((int)LocalFixupsOffset);
                br.StepOut();

                // Local fixups
                LocalFixups = new List <LocalFixup>();
                br.StepIn(AbsoluteDataStart + LocalFixupsOffset);
                for (int i = 0; i < (GlobalFixupsOffset - LocalFixupsOffset) / 8; i++)
                {
                    if (br.ReadUInt32() != 0xFFFFFFFF)
                    {
                        br.Position -= 4;
                        LocalFixups.Add(new LocalFixup(br));
                    }
                }
                br.StepOut();

                // Global fixups
                GlobalFixups = new List <GlobalFixup>();
                br.StepIn(AbsoluteDataStart + GlobalFixupsOffset);
                for (int i = 0; i < (VirtualFixupsOffset - GlobalFixupsOffset) / 12; i++)
                {
                    if (br.ReadUInt32() != 0xFFFFFFFF)
                    {
                        br.Position -= 4;
                        GlobalFixups.Add(new GlobalFixup(br));
                    }
                }
                br.StepOut();

                // Virtual fixups
                VirtualFixups = new List <VirtualFixup>();
                br.StepIn(AbsoluteDataStart + VirtualFixupsOffset);
                for (int i = 0; i < (ExportsOffset - VirtualFixupsOffset) / 12; i++)
                {
                    if (br.ReadUInt32() != 0xFFFFFFFF)
                    {
                        br.Position -= 4;
                        VirtualFixups.Add(new VirtualFixup(br));
                    }
                }
                br.StepOut();

                if (variation == HKX.HKXVariation.HKXBloodBorne || variation == HKX.HKXVariation.HKXDS3)
                {
                    br.AssertUInt32(0xFFFFFFFF);
                    br.AssertUInt32(0xFFFFFFFF);
                    br.AssertUInt32(0xFFFFFFFF);
                    br.AssertUInt32(0xFFFFFFFF);
                }
            }
Ejemplo n.º 6
0
 public void Read(PackFileDeserializer hkx, HKXSection section, BinaryReaderEx br, HKX.HKXVariation variation)
 {
     ClassNames          = new List <HKXClassName>();
     OffsetClassNamesMap = new Dictionary <uint, HKXClassName>();
     while (br.ReadByte() != 0xFF)
     {
         br.Position -= 1;
         uint stringStart = (uint)br.Position + 5;
         var  className   = new HKXClassName(br);
         ClassNames.Add(className);
         OffsetClassNamesMap.Add(stringStart, className);
         if (br.Position == br.Length)
         {
             break;
         }
     }
 }