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); } }
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; } } }