//protected override int OnCalculateSize(bool force)
        //{

        //}

        protected internal override void PostProcess(VoidPtr mdlAddress, VoidPtr dataAddress, StringTable stringTable)
        {
            MDL0Material *header = (MDL0Material *)dataAddress;

            header->_mdl0Offset   = (int)mdlAddress - (int)dataAddress;
            header->_stringOffset = (int)stringTable[Name] + 4 - (int)dataAddress;

            header->_flag1     = _numTextures;
            header->_numLayers = _numLayers;
            header->_flag3     = _flag3;
            header->_flag4     = _flag4;
            header->_flag5     = _flag5;
            header->_flag6     = _flag6;
            header->_flag7     = _flag7;
            header->_flag8     = _flag8;
            header->_type      = _type;

            MDL0Data7Part4 *part4 = header->Part4;

            if (part4 != null)
            {
                ResourceGroup *group = part4->Group;
                group->_first = new ResourceEntry(0xFFFF, 0, 0, 0, 0);
                ResourceEntry *rEntry = group->First;

                for (int i = 0, x = 1; i < group->_numEntries; i++)
                {
                    MDL0Data7Part4Entry *entry = (MDL0Data7Part4Entry *)((int)group + (rEntry++)->_dataOffset);
                    ResourceEntry.Build(group, x++, entry, (BRESString *)stringTable[_part4Entries[i]]);
                    entry->ResourceStringAddress = stringTable[_part4Entries[i]] + 4;
                }
            }

            MDL0MatLayer *part3 = header->Part3;

            foreach (MDL0MaterialRefNode n in Children)
            {
                n.PostProcess(mdlAddress, part3++, stringTable);
            }
        }
Exemple #2
0
        protected internal override void PostProcess(VoidPtr mdlAddress, VoidPtr dataAddress, StringTable stringTable)
        {
            MDL0Bone *header = (MDL0Bone *)dataAddress;

            header->_mdl0Offset   = (int)mdlAddress - (int)dataAddress;
            header->_stringOffset = ((int)stringTable[Name] + 4) - (int)dataAddress;

            //Entry strings
            if (_entries.Count > 0)
            {
                ResourceGroup *pGroup = (ResourceGroup *)((byte *)header + header->_part2Offset + 4);
                ResourceEntry *pEntry = &pGroup->_first;
                int            count  = pGroup->_numEntries;
                (*pEntry++) = new ResourceEntry(0xFFFF, 0, 0, 0, 0);

                for (int i = 0; i < count; i++)
                {
                    MDL0Data7Part4Entry *entry = (MDL0Data7Part4Entry *)((byte *)pGroup + (pEntry++)->_dataOffset);
                    entry->_stringOffset = (int)stringTable[_entries[i]] + 4 - (int)entry;

                    ResourceEntry.Build(pGroup, i + 1, entry, (BRESString *)stringTable[_entries[i]]);
                }
            }
        }
Exemple #3
0
        protected internal override void OnRebuild(VoidPtr address, int length, bool force)
        {
            MDL0Bone *   header = (MDL0Bone *)address;
            MDL0BoneNode bone;
            int          index = 0, offset;

            header->_headerLen   = length;
            header->_index       = _entryIndex;
            header->_nodeId      = _nodeIndex;
            header->_flags       = (uint)_flags;
            header->_pad1        = 0;
            header->_pad2        = 0;
            header->_scale       = _bindState._scale;
            header->_rotation    = _bindState._rotate;
            header->_translation = _bindState._translate;
            header->_boxMin      = _bMin;
            header->_boxMax      = _bMax;

            header->_transform    = _bindMatrix;
            header->_transformInv = _inverseBindMatrix;

            //Sub-entries
            if (_entries.Count > 0)
            {
                header->_part2Offset = 0xD0;
                *(bint *)((byte *)address + 0xD0) = 0x1C + (_entries.Count * 0x2C);
                ResourceGroup *pGroup = (ResourceGroup *)((byte *)address + 0xD4);
                ResourceEntry *pEntry = &pGroup->_first + 1;
                byte *         pData  = (byte *)pGroup + pGroup->_totalSize;

                *pGroup = new ResourceGroup(_entries.Count);

                foreach (string s in _entries)
                {
                    (pEntry++)->_dataOffset = (int)pData - (int)pGroup;
                    MDL0Data7Part4Entry *p = (MDL0Data7Part4Entry *)pData;
                    *p = new MDL0Data7Part4Entry(1);
                    pData += 0x1C;
                }
            }
            else
            {
                header->_part2Offset = 0;
            }

            //Set first child
            if (_children.Count > 0)
            {
                header->_firstChildOffset = length;
            }
            else
            {
                header->_firstChildOffset = 0;
            }

            if (_parent != null)
            {
                index = _parent._children.IndexOf(this);

                //Parent
                if (_parent is MDL0BoneNode)
                {
                    header->_parentOffset = (int)_parent.WorkingUncompressed.Address - (int)address;
                }
                else
                {
                    header->_parentOffset = 0;
                }

                //Prev
                if (index == 0)
                {
                    header->_prevOffset = 0;
                }
                else
                {
                    //Link to prev
                    bone   = _parent._children[index - 1] as MDL0BoneNode;
                    offset = (int)bone.Header - (int)address;
                    header->_prevOffset      = offset;
                    bone.Header->_nextOffset = -offset;
                }

                //Next
                if (index == (_parent._children.Count - 1))
                {
                    header->_nextOffset = 0;
                }
            }
        }