コード例 #1
0
ファイル: HKX.cs プロジェクト: FloorBelow/dstools
            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);
            }
コード例 #2
0
ファイル: HKX.cs プロジェクト: FloorBelow/dstools
            // 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);
            }
コード例 #3
0
ファイル: HKX.cs プロジェクト: FloorBelow/dstools
            // 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;
                    }
                }
            }
コード例 #4
0
ファイル: HKX.cs プロジェクト: FloorBelow/dstools
            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;
                }
            }