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

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

            if (_decal != null)
            {
                header->_secondaryOffset = (int)stringTable[_decal.Name] + 4 - (int)dataAddress;
            }
            else
            {
                header->_secondaryOffset = 0;
            }

            //header->_unk1 = _unk1;
            header->_unk2     = _unk2;
            header->_unk3     = _unk3;
            header->_unk4     = _unk4;
            header->_unk5     = _unk5;
            header->_layerId1 = _layerId1;
            header->_layerId2 = _layerId2;
            header->_unk8     = _unk8;
            header->_unk9     = _unk9;
            header->_unk10    = _unk10;
            header->_unk11    = _unk11;
            header->_float    = _float;
        }
        protected override bool OnInitialize()
        {
            MDL0MatLayer *header = Header;

            _unk2     = header->_unk2;
            _unk3     = header->_unk3;
            _unk4     = header->_unk4;
            _unk5     = header->_unk5;
            _layerId1 = header->_layerId1;
            _layerId2 = header->_layerId2;
            _unk8     = header->_unk8;
            _unk9     = header->_unk9;
            _float    = header->_float;
            _unk10    = header->_unk10;
            _unk11    = header->_unk11;

            if (header->_stringOffset != 0)
            {
                _name    = header->ResourceString;
                _texture = Model._textures.FindOrCreate(_name);
                _texture._texRefs.Add(this);
            }
            if (header->_secondaryOffset != 0)
            {
                string name = header->SecondaryTexture;
                _decal = Model._textures.FindOrCreate(name);
                _decal._decRefs.Add(this);
            }

            return(false);
        }
        protected override void OnPopulate()
        {
            MDL0MatLayer *part3 = Header->Part3;

            for (int i = 0; i < Header->_numTextures; i++)
            {
                new MDL0MaterialRefNode().Initialize(this, part3++, MDL0MatLayer.Size);
            }
        }
        //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);
            }
        }