//Initialize should only be called from parent group during parse. //Bones need not be imported/exported anyways protected override bool OnInitialize() { MDL0Bone *header = Header; //SetSizeInternal(header->_headerLen); ////Assign true parent using parent header offset //int offset = header->_parentOffset; ////Offsets are always < 0, because parent entries are listed before children //if (offset < 0) //{ // //Get address of parent header // MDL0Bone* pHeader = (MDL0Bone*)((byte*)header + offset); // //Search bone list for matching header // foreach (MDL0BoneNode bone in _parent._children) // if (pHeader == bone.Header) // { _parent = bone; break; } //Assign parent and break //} //Conditional name assignment if ((_name == null) && (header->_stringOffset != 0)) { _name = header->ResourceString; } //Assign fields _flags = (BoneFlags)(uint)header->_flags; _nodeIndex = header->_nodeId; _bindState = _frameState = new FrameState(header->_scale, header->_rotation, header->_translation); _bindMatrix = _frameMatrix = header->_transform; _inverseBindMatrix = header->_transformInv; _bMin = header->_boxMin; _bMax = header->_boxMax; if (header->_part2Offset != 0) { MDL0Data7Part4 *part4 = (MDL0Data7Part4 *)((byte *)header + header->_part2Offset); ResourceGroup * group = part4->Group; ResourceEntry * pEntry = &group->_first + 1; int count = group->_numEntries; for (int i = 0; i < count; i++) { _entries.Add(new String((sbyte *)group + (pEntry++)->_stringOffset)); } } //We don't want to process children because not all have been parsed yet. //Child assigning will be handled by the parent group. return(false); }
protected override bool OnInitialize() { MDL0Material *header = Header; if ((_name == null) && (header->_stringOffset != 0)) { _name = header->ResourceString; } _numTextures = header->_flag1; _numLayers = header->_numLayers; _unk1 = header->_unk1; _unk3 = header->_unk3; _unk4 = header->_unk4; _unk6 = header->_unk6; _flag3 = header->_flag3; _flag4 = header->_flag4; _flag5 = header->_flag5; _flag6 = header->_flag6; _flag7 = header->_flag7; _flag8 = header->_flag8; _type = header->_type; MatModeBlock *mode = header->DisplayLists; _alphaFunc = mode->AlphaFunction; _zMode = mode->ZMode; _blendMode = mode->BlendMode; _constantAlpha = mode->ConstantAlpha; MDL0Data7Part4 *part4 = header->Part4; if (part4 != null) { ResourceGroup *group = part4->Group; for (int i = 0; i < group->_numEntries; i++) { _part4Entries.Add(group->First[i].GetName()); } } _children = new List <ResourceNode>(); OnPopulate(); return(true); }
//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); } }