コード例 #1
0
        protected override void OnPopulate()
        {
            VoidPtr entries  = BaseAddress + EntryOffset;
            VoidPtr defaults = BaseAddress + DefaultsOffset;

            for (int i = 0; i < (EntryOffset == 0 ? 0 : ((DefaultsOffset == 0 ? _offset : DefaultsOffset) - EntryOffset) / 4); i++)
            {
                MoveDefModelVisRefNode offset;
                (offset = new MoveDefModelVisRefNode()
                {
                    _name = "Reference" + (i + 1)
                }).Initialize(this, entries + i * 4, 4);

                if (offset.DataOffset == 0)
                {
                    continue;
                }

                VoidPtr offAddr = BaseAddress + offset.DataOffset;
                for (int c = 0; c < EntryCount; c++)
                {
                    MoveDefBoneSwitchNode Switch;
                    (Switch = new MoveDefBoneSwitchNode()
                    {
                        _name = "BoneSwitch" + c
                    }).Initialize(offset, offAddr + c * 8, 8);
                    int     sCount = Switch.Count;
                    VoidPtr gAddr  = BaseAddress + Switch.DataOffset;
                    for (int s = 0; s < sCount; s++)
                    {
                        MoveDefModelVisGroupNode Group;
                        (Group = new MoveDefModelVisGroupNode()
                        {
                            _name = "BoneGroup" + s
                        }).Initialize(Switch, gAddr + s * 8, 8);
                        int     gCount = Group.Count;
                        VoidPtr bAddr  = BaseAddress + Group.DataOffset;
                        for (int g = 0; g < gCount; g++)
                        {
                            new MoveDefBoneIndexNode().Initialize(Group, bAddr + g * 4, 4);
                        }
                    }
                }
            }
            if (Children.Count > 0)
            {
                for (int i = 0; i < DefaultsCount; i++)
                {
                    FDefModelDisplayDefaults *def = (FDefModelDisplayDefaults *)(defaults + i * 8);
                    for (int x = 0; x < ((DefaultsOffset == 0 ? _offset : DefaultsOffset) - EntryOffset) / 4; x++)
                    {
                        if (Children[x].Children.Count > 0)
                        {
                            (Children[x].Children[def->_switchIndex] as MoveDefBoneSwitchNode).defaultGroup = def->_defaultGroup;
                        }
                    }
                }
            }
        }
コード例 #2
0
        public override void OnRebuild(VoidPtr address, int length, bool force)
        {
            _lookupOffsets = new List <int>();

            int mainOff = 0, defOff = 0, offOff = 0, swtchOff = 0, grpOff = 0;

            foreach (MoveDefModelVisRefNode r in Children)
            {
                defOff += 4;
                foreach (MoveDefBoneSwitchNode b in r.Children)
                {
                    offOff += 8;
                    if (b.defaultGroup >= 0)
                    {
                        mainOff += 8;
                    }

                    foreach (MoveDefModelVisGroupNode o in b.Children)
                    {
                        swtchOff += 8;
                        grpOff   += o.Children.Count * 4;
                    }
                }
            }

            //bones
            //groups
            //switches
            //offsets
            //defaults
            //header

            bint *                    boneAddr    = (bint *)address;
            FDefListOffset *          groupLists  = (FDefListOffset *)((VoidPtr)boneAddr + grpOff);
            FDefListOffset *          switchLists = (FDefListOffset *)((VoidPtr)groupLists + swtchOff);
            bint *                    offsets     = (bint *)((VoidPtr)switchLists + offOff);
            FDefModelDisplayDefaults *defaults    = (FDefModelDisplayDefaults *)((VoidPtr)offsets + defOff);
            FDefModelDisplay *        header      = (FDefModelDisplay *)((VoidPtr)defaults + mainOff);

            _entryOffset = header;

            header->_entryOffset = (int)offsets - (int)_rebuildBase;

            _lookupOffsets.Add((int)header->_entryOffset.Address - (int)_rebuildBase);

            header->_entryCount = Children[0].Children.Count; //Children 1 child count will be the same

            int defCount = 0;

            foreach (MoveDefModelVisRefNode r in Children)
            {
                r._entryOffset = offsets;
                if (r.Children.Count > 0)
                {
                    *offsets = (int)switchLists - (int)_rebuildBase;
                    _lookupOffsets.Add((int)offsets - (int)_rebuildBase);
                }

                offsets++;
                foreach (MoveDefBoneSwitchNode b in r.Children)
                {
                    b._entryOffset = switchLists;
                    if (b.defaultGroup >= 0)
                    {
                        defCount++;
                        defaults->_switchIndex      = b.Index;
                        (defaults++)->_defaultGroup = b.defaultGroup;
                    }

                    switchLists->_listCount = b.Children.Count;
                    if (b.Children.Count > 0)
                    {
                        switchLists->_startOffset = (int)groupLists - (int)_rebuildBase;
                        _lookupOffsets.Add((int)switchLists->_startOffset.Address - (int)_rebuildBase);
                    }
                    else
                    {
                        switchLists->_startOffset = 0;
                    }

                    switchLists++;
                    foreach (MoveDefModelVisGroupNode o in b.Children)
                    {
                        o._entryOffset         = groupLists;
                        groupLists->_listCount = o.Children.Count;
                        if (o.Children.Count > 0)
                        {
                            groupLists->_startOffset = (int)boneAddr - (int)_rebuildBase;
                            _lookupOffsets.Add((int)groupLists->_startOffset.Address - (int)_rebuildBase);
                        }
                        else
                        {
                            groupLists->_startOffset = 0;
                        }

                        groupLists++;
                        foreach (MoveDefBoneIndexNode bone in o.Children)
                        {
                            bone._entryOffset = boneAddr;
                            *boneAddr++ = bone.boneIndex;
                        }
                    }
                }
            }

            if (defCount > 0)
            {
                header->_defaultsOffset = (int)offsets - (int)_rebuildBase;
                _lookupOffsets.Add((int)header->_defaultsOffset.Address - (int)_rebuildBase);
            }
            else
            {
                header->_defaultsOffset = 0;
            }

            header->_defaultsCount = defCount;
        }