//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); } }
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]]); } } }
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; } } }