RX3 file format research thread

tokke001

Senior Squad
A very cursory analysis of the "clothdef" section:

"clothdef" is used for cloth and hair simulation. First introduced in FIFA 15.
It's used on player clothes (jersey, shorts) and player hairs. Since FIFA 16 there's a low-resolution simulation for hairlods.

Files with this section are placed in data/sceneassets/simplecloth folder. Hair uses these files: simhair_PLAYERID_0_0.rx3

I think this section contains a physical model of the mesh, collision models, and probably some parameters of hair movement.

Some interesting information about it can be found here:
Also partially related:

On this screenshot, you can see some strange red/green/blue meshes around player head and hair. I think it's a visual representation of the data in this section.
View attachment 67479
where red meshes are collision models, green - maybe hair physical model, and green rays - maybe, connections between physical and renderable model.

I made a 010 Editor template for the file with this section, attached to this post. As I said, it's very cursory, many unknown values are there. Some names I took from the executable.

I tried to visualize an array of unknown positions (called unk72 in the template): possibly those are vertices for hair physical model.
i ll check it !


to go a bit sideways:
the first link looks interesting, as it is from a (former) ea employee

this post : https://kentsunde.blogspot.com/p/project-spotlight-python.html
it could be maybe, he talks about the section "EDGE_MESH" ?
it is a section you find at FIFA 19 ps3 (example shoe-models, more for shoe-laces maybe), FIFA online 3
(but FIFA 16 maybe too, not sure)
 

Dmitri

Reserves
Looks like the information about hair parts for hair simulation is stored in hair's 3rd UV channel.
hair_0.PNG hair_1.PNG

it could be maybe, he talks about the section "EDGE_MESH" ?
Could be, but I don't remember what's EDGE_MESH.
Upd: I checked the head file from FIFA 16, it's not there.
 
Last edited:

tokke001

Senior Squad
Texture containers
Texture containers (.rx3) usually consist of these sections:
Code:
RX3_SECTION_TEXTURES_HEADER
RX3_SECTION_TEXTURE (for each texture in container)
RX3_SECTION_NAMES
Texture containers for kits may also include RX3_SECTION_HOTSPOT section.

RX3_SECTION_TEXTURES_HEADER
This section contains a list of texture headers (basic information about texture) for each texture in the container.
Code:
struct Rx3SectionTexturesHeader { // sizeof() = 16 bytes
    unsigned int texturesCount; // number of textures in container
    unsigned int unknown[3]; // maybe padding (0)
}
This header is followed by texture headers (texture header represents basic information about texture):
Code:
struct Rx3TextureHeader { // sizeof() = 16 bytes
    unsigned int totalSize; // total size of Rx3 Texture section (including texture header and pixels data)
    unsigned char type; // Rx3TextureType
    unsigned char format; // Rx3TextureFormat
    unsigned short flags; // usually 1
    unsigned short width; // image width
    unsigned short height; // image height
    unsigned short faces; // faces count for cubemap or volume textures (layers), 1 for 2D texture
    unsigned short levels; // mipmap count
};

Known texture types:
Code:
enum Rx3TextureType : unsigned char { // sizeof() = 1 byte
    RX3_TEXTURE_2D = 1,
    RX3_TEXTURE_CUBEMAP = 3, // texture consists of 6 faces
    RX3_TEXTURE_VOLUME = 4 // texture consists of multiple layers
}

Known texture formats:
Code:
enum Rx3TextureFormat : unsigned char { // sizeof() = 1 byte
    RX3_TEXFORMAT_DXT1 = 0,
    RX3_TEXFORMAT_DXT3 = 1,
    RX3_TEXFORMAT_DXT5 = 2,
    RX3_TEXFORMAT_R8G8B8A8 = 3,
    RX3_TEXFORMAT_ATI2 = 7, // also known as BC5 compression
    RX3_TEXFORMAT_ATI1 = 12, // also known as BC4 compression
}

RX3_SECTION_TEXTURE
This section starts with texture header (Rx3TextureHeader), and continued with texture levels (mipmaps) for each texture face.
Texture level starts with a header:
Code:
struct Rx3TextureLevelHeader { // sizeof() = 16 bytes
    unsigned int pitch;
    unsigned int lines;
    unsigned int levelSize; // size of pixels data (pitch * lines)
    unsigned int padding; // 0;
};
This header is then followed by pixels data.

In general, the layout for texture section is following:
Code:
Texture header
FOR number of faces in texture
FOR number of levels in texture
Texture level header
Texture level pixels
END FOR
END FOR


Hey @Dmitri ,
i have received a rx3 texture file from @ramzidz15 from FIFA 16 mobile
it has a new unknown rx3 texture format "104", wich i dont recognise
maybe you know what kind of compression this is ?


here s some info from the rx3 file:
Rx3TextureType = 104
width/height = 256x256
number of faces = 1
number Mip levels = 9
Total Size = 43848

Mip level 0 :
width/height = 256x256
Lines = 64
Pitch = 512
Size = 32768

according to the pitch/size it may be a BC1 or BC4 compression,
but if i try that the image isnt correct

i included the rx3 file + a extracted dds file (with wrong dxgi format) :
 


Top