public void Read(HKX hkx, HKXSection section, BinaryReaderEx br, uint size, HKXVariation variation) { SectionOffset = (uint)br.Position; Bytes = br.ReadBytes((int)size); DataSize = size; // Resolve references where this object is a source var localSources = FindLocalFixupSources(section); LocalReferences = new List <HKXLocalReference>(); foreach (var src in localSources) { if (src.Reference == null) { var reference = new HKXLocalReference(); reference.Section = section; reference.SourceLocalOffset = src.Src - SectionOffset; reference.SourceObject = this; section.LocalReferences.Add(reference); src.Reference = reference; } else { var reference = src.Reference; reference.SourceLocalOffset = src.Src - SectionOffset; reference.SourceObject = this; } LocalReferences.Add(src.Reference); } // Resolve references where this object is a global source var globalSources = FindGlobalFixupSources(section); GlobalReferences = new List <HKXGlobalReference>(); foreach (var src in globalSources) { if (src.Reference == null) { var reference = new HKXGlobalReference(); reference.SrcSection = section; reference.SourceLocalOffset = src.Src - SectionOffset; reference.SourceObject = this; section.GlobalReferences.Add(reference); src.Reference = reference; } else { var reference = src.Reference; reference.SrcSection = section; reference.SourceLocalOffset = src.Src - SectionOffset; reference.SourceObject = this; section.GlobalReferences.Add(reference); } GlobalReferences.Add(src.Reference); } ResolveDestinations(hkx, section); }
// Finds and resolves a local reference internal HKXLocalReference ResolveLocalReference(HKXSection section, uint offset) { LocalFixup fu = ResolveLocalFixup(section, offset); if (fu != null) { var reference = new HKXLocalReference(); reference.SourceObject = this; reference.SourceLocalOffset = offset; reference.Section = section; section.LocalReferences.Add(reference); fu.Reference = reference; return(reference); } return(null); }
// Find all references to this object and link them internal void ResolveDestinations(HKX hkx, HKXSection section) { var localDestinations = FindLocalFixupDestinations(section); foreach (var dest in localDestinations) { if (dest.Reference == null) { var reference = new HKXLocalReference(); reference.Section = section; reference.DestLocalOffset = dest.Dst - SectionOffset; reference.DestObject = this; section.LocalReferences.Add(reference); dest.Reference = reference; } else { var reference = dest.Reference; reference.DestLocalOffset = dest.Dst - SectionOffset; reference.DestObject = this; } } var globalDestinations = FindGlobalFixupDestinations(hkx, section); foreach (var dest in globalDestinations) { if (dest.Reference == null) { var reference = new HKXGlobalReference(); reference.DestSection = section; reference.DestLocalOffset = dest.Dst - SectionOffset; reference.DestObject = this; dest.Reference = reference; } else { var reference = dest.Reference; reference.DestSection = section; reference.DestLocalOffset = dest.Dst - SectionOffset; reference.DestObject = this; } } }
public override void Read(HKX hkx, HKXSection section, HKXObject source, BinaryReaderEx br, HKXVariation variation) { SourceObject = source; // Placeholder replaced with data pointer upon load in C++ uint pointerOffset = (uint)br.Position - source.SectionOffset; if (hkx.Header.PointerSize == 8) { br.AssertUInt64(0); } else { br.AssertUInt32(0); } Size = br.ReadUInt32(); uint capAndFlags = br.ReadUInt32(); Capacity = capAndFlags & 0x00FFFFFF; Flags = (byte)((capAndFlags & 0xFF000000) >> 24); // Resolve pointer to array data LocalFixup fu = source.ResolveLocalFixup(section, pointerOffset); if (fu != null) { Data = new HKXLocalReference(); Data.SourceLocalOffset = pointerOffset; Data.SourceObject = source; Data.DestLocalOffset = 0; var data = new HKArrayData <T>(); br.StepIn(fu.Dst); data.Read(hkx, section, br, variation, Size); Data.DestObject = data; Data.Section = section; br.StepOut(); section.LocalReferences.Add(Data); fu.Reference = Data; } }