August 5, 20241 yr Does anyone know more about the mcd format used by EA? Models are packed inside the rsf format and it is possible to extract them with the rsf.bms script. I managed to make a Noesis script to view the models, but reading the skeletons is hard for me and I don't know how to proceed with them. Vertex weights are stored in a table that starts with the tag TIEW in mcd and skeleton data in FRGS in .skel file. I would appreciate any kind of help to import the skeletons into noesis. Preview in Noesis: https://imgur.com/a/o2dQvCl fmt_NHL21_mcd.py rsf.bms.zip nhl21model.zip
August 5, 20241 yr Supporter 3 hours ago, Beedy said: skeletons into noesis. I researched the *skel file structure and made a plugin. *(keep reading nodes recursively (using the number of children value) until they run out) structure: Spoiler RSF/00, 0, 48, 0 FRGS, 0, chunkSize, chunkDataofs UINT lenLabel BYTE[lenLabel+1] label + /0 UINT unk(4) UINT lenName BYTE[lenName] name BYTE[6] unks (0, 0, 0, 16, 0, 0/1-flag_have_item) if have_item: UINT unk(2) UINT numItem for x in range(numItem): UINT unk(30259) UINT unk(1) UINT lenLabel BYTE[lenLabel+1] label + /0 VEC3(3_float) item (translate or rotate or scale) UINT unk(2) BYTE unk(1) if SGNodeGroup: pass if SGNodeLocator: UINT unk(1) VEC3(3_float) unk if SGNodeTransform: UINT unk(1) MAT4(16_float) local_mat if SGNodeJoint: UINT unk(1) MAT4(16_float) local_mat UINT unk(2) MAT4(16_float) unk_mat MAT4(16_float) world_mat MAT4(16_float) unk_mat UINT unk(0) UINT numChild I quickly looked at the TIEW chunk, it seems to have this structure: BYTE[4] label(TIEW) UINT unk(2) UINT chunkSize UINT dataOfs UINT numBLock? for x in range(numBLock): UINT index UINT bonePerVert UINT numElem float[numElem*bonePerVert] weights ushort[numElem*bonePerVert] bone_indices Edited August 5, 20241 yr by Durik256
August 5, 20241 yr Supporter Solution 28 minutes ago, Beedy said: Thank you! this helps me a lot. 🙂 also for weights to work correctly, as bones you need to use only "SGNodeJoint" I didn’t try to understand your code, I just integrated my code into your plugin. I also added the 'readSkel' flag to the mesh plugin. if it is 'True' then it will find the first *skel in the mesh folder and download it. I also added the readMesh flag to the skeleton plugin. if it is "True" then it will find all *mcd's in the skeleton folder and load them. *(do not combine both of these methods) your plugin (added weights and skeleton loading (optional): fmt_NHL21_mcd.py my skeleton plugin: fmt_skel_nhl21.py
Create an account or sign in to comment