Jump to content

NHL 21 .mcd models (PS4)


Beedy
Go to solution Solved by Durik256,

Recommended Posts

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

Link to comment
Share on other sites

  • Engineer
Posted (edited)
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

 

Без имени-1.png

Edited by Durik256
  • Like 2
Link to comment
Share on other sites

  • Engineer
  • 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

bandicam 2024-08-05 18-39-05-409.gif

  • Like 1
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...