BFRES (File Format)
BFRES, known as Binary CaFe RESource, stores information relating to any 3D model data.
Contents
Changes From Wii U
BFRES has substantial changes from Wii U. Here are a few examples:
- Offsets are uint64
- Render state in FMAT is removed
- Relocation table is now used
- Mostly everything rearranged in some way
- Enums are different (ie vertex attribute format)
- FSHP bounding boxes are used for each LOD mesh
- Dictionary left/right and index data are handled differently
- Dictionaries no longer point to sections. Only used to lookup indexes for lists.
Version List
- 0.5.0.3 (Mario Kart 8 Deluxe, BOTW, ARMS)
- 0.8.0.0 (Splatoon 2, Mario Odyssey)
- 0.8.1.1 (Kirby Star Allies, Super Mario Party)
- 0.9.0.0 (Kirby Super Clash, Super Mario Maker 2)
Header
The header contains all of the information needed to parse the entire file, include counts and offsets to data.
Offset | Type | Description |
---|---|---|
0x00 | String | File magic. Always "FRES" in ASCII. |
0x04 | UInt32 | Signature. |
0x08 | UInt32 | Version. |
0x0C | UInt16 | Byte Order Mark (BOM): 0xFEFF for big endian and 0xFFFE for little endian. |
0x0E | Byte | Byte alignment. |
0x0F | Byte | Target address size. Usually 0. |
0x10 | UInt32 | File name offset. |
0x14 | Uint16 | Flags. |
0x16 | UInt16 | Block offset. |
0x18 | UInt32 | Relocation table offset. |
0x1C | UInt32 | BFRES Size. |
0x20 | UInt64 | Offset to the file name length. |
0x28 | UInt64 | FMDL offset. |
0x30 | UInt64 | FMDL dictionary offset. |
if BFRES version >= 0.0.9.0 | ||
0x38 | UInt64 | Unknown offset. |
0x40 | UInt64 | Unknown dictionary offset. |
0x48 | UInt64 | Unknown 2 offset. |
0x50 | UInt64 | Unknown 2 dictionary offset. |
0x58 | UInt64 | Skeletal animations offset. |
0x60 | UInt64 | Skeletal animations dictionary. |
0x68 | UInt64 | Material animations offset. |
0x70 | UInt64 | Material animations dictionary. |
0x78 | UInt64 | Bone visibility animation array offset. |
0x80 | UInt64 | Bone visibility animation array dictionary. |
0x88 | UInt64 | Shape animation array offset. |
0x90 | UInt64 | Shape animation dictionary offset. |
0x98 | UInt64 | Scene animation array offset. |
0xA0 | UInt64 | Scene animation dictionary offset. |
0xA8 | UInt64 | Memory Pool. |
0xB0 | UInt64 | Buffer Section. |
0xB8 | UInt64 | Embedded files offset. |
0xC0 | UInt64 | Embedded file dictionary offset. |
0xC8 | Byte[8] | Padding. |
0xD0 | UInt64 | String table offset. |
0xD8 | UInt32 | String table size. |
0xDC | UInt16 | Model count. |
0xDE | UInt16 | Unknown count. |
0xE0 | UInt16 | Unknown 2 count. |
0xE2 | UInt16 | Skeletal animation count. |
0xE4 | UInt16 | Material animation count. |
0xE6 | UInt16 | Bone visual animation count. |
0xE8 | UInt16 | Shape animation count. |
0xEA | UInt16 | Scene animation count. |
0xEC | UInt16 | External file count. |
0xEE | Byte[2] | Padding. |
0xF0 | End of header. | |
else | ||
0x38 | UInt64 | Skeletal animations offset. |
0x40 | UInt64 | Skeletal animations dictionary. |
0x48 | UInt64 | Material animations offset. |
0x50 | UInt64 | Material animations dictionary. |
0x58 | UInt64 | Bone visibility animation array offset. |
0x60 | UInt64 | Bone visibility animation array dictionary. |
0x68 | UInt64 | Shape animation array offset. |
0x70 | UInt64 | Shape animation dictionary offset. |
0x78 | UInt64 | Scene animation array offset. |
0x80 | UInt64 | Scene animation dictionary offset. |
0x88 | UInt64 | Memory Pool. |
0x90 | UInt64 | Buffer Section. |
0x98 | UInt64 | Embedded files offset. |
0xA0 | UInt64 | Embedded file dictionary offset. |
0xA8 | Byte[8] | Padding. |
0xB0 | UInt64 | String table offset. |
0xB8 | UInt32 | String table size. |
0xBC | UInt16 | Model count. |
0xBE | UInt16 | Skeletal animation count. |
0xC0 | UInt16 | Material animation count. |
0xC2 | UInt16 | Bone visual animation count. |
0xC4 | UInt16 | Shape animation count. |
0xC6 | UInt16 | Scene animation count. |
0xC8 | UInt16 | External file count. |
0xCA | Byte[6] | Padding. |
0xD0 | End of header. |
FMDL
The FMDL section handles the actual model information, where it stores skeleton structures, shapes, and more.
Offset | Type | Description | |
---|---|---|---|
0x00 | String | Section magic. Always "FMDL" in ASCII. | |
if BFRES version >= 0.0.9.0 | |||
0x04 | UInt32 | Padding. (reserved for flags) | |
0x08 | UInt64 | Model name offset. | |
0x10 | UInt64 | Path name offset. | |
0x18 | UInt64 | FSKL offset. | |
0x20 | UInt64 | FVTX offset. | |
0x28 | Uint64 | FSHP offset. | |
0x30 | UInt64 | FSHP dictionary offset. | |
0x38 | UInt64 | FMAT offset. | |
0x40 | UInt64 | Padding | |
else | |||
0x04 | UInt32 | Block size. | |
0x08 | UInt64 | Block offset. | |
0x10 | UInt64 | Model name offset. | |
0x18 | UInt64 | Pathname offset. | |
0x20 | UInt64 | FSKL offset. | |
0x28 | UInt64 | FVTX offset. | |
0x30 | Uint64 | FSHP offset. | |
0x38 | UInt64 | FSHP dictionary offset. | |
0x40 | UInt64 | FMAT offset. | |
0x48 | UInt64 | FMAT dictionary offset. | |
0x50 | UInt64 | User data offset. | |
0x58 | Byte[16] | Padding. | |
0x68 | UInt16 | Vertex array count. | |
0x6A | UInt16 | Shape count. | |
0x6C | UInt16 | Material count. | |
0x6E | UInt16 | User data count. | |
0x70 | UInt32 | Total vertex count. | |
0x74 | Byte[4] | Padding. | |
0x78 | End of FMDL header. |
Directly after the FMDL header, there is a structure that defines a buffer for resources.
Then after this structure, a model dictionary is present.
FVTX
The FVTX section stores data related to vertices.
Offset | Type | Description | |
---|---|---|---|
0x00 | String | Section magic. Always "FVTX" in ASCII. | |
if BFRES version >= 0.0.9.0 | |||
0x04 | Byte[4] | Flags. | |
0x08 | UInt64 | Vertex attribute array offset. | |
0x10 | UInt64 | Vertex attribute array dictionary. | |
0x18 | UInt64 | Memory pool. | |
0x20 | UInt64 | Offset to unknown area. Data may be set at runtime. covers 0x10 spaces for each buffer. | |
else | |||
0x04 | Byte[12] | Padding. | |
0x10 | UInt64 | Vertex attribute array offset. | |
0x18 | UInt64 | Vertex attribute array dictionary. | |
0x20 | UInt64 | Memory pool. | |
0x28 | UInt64 | Offset to unknown area. Data may be set at runtime. covers 0x10 spaces for each buffer. | |
0x30 | UInt64 | Offset to unknown area. Data may be set at runtime. covers 0x08 spaces for each buffer. | |
0x38 | UInt64 | Vertex buffer size. | |
0x40 | UInt64 | Vertex stride size. | |
0x48 | UInt64 | Vertex buffer array offset. | |
0x50 | UInt32 | Buffer offset. | |
0x54 | Byte | Vertex attribute count. | |
0x55 | Byte | Vertex buffer count. | |
0x56 | UInt16 | Vertex index. | |
0x58 | UInt32 | Vertex count. | |
0x5C | UInt32 | Skin weight influence. | |
0x60 | colspan="3" End of vertex header |
Embedded Files
This area stores additional files such as shaders (BFSHA) and textures (BNTX).
Offset | Type | Description |
---|---|---|
0x00 | UInt64 | Data offset. |
0x08 | UInt64 | Data size. |
0x10 | End of buffer structure. |
Buffer Section
This area goes below all the sub section headers. This still gets written even if unused/not pointed in the file header
Offset | Type | Description |
---|---|---|
0x00 | UInt32 | Unknown. |
0x04 | UInt32 | Size. |
0x08 | UInt64 | Buffer offset. |
0x10 | Byte[16] | Padding. |
0x20 | End of buffer structure. |
Dictionary
A dictionary is a structure that can store nodes that reference each other, to create a tree for storing data.
Header
The header defines the structure of the dictionary.
Offset | Type | Description |
---|---|---|
0x00 | UInt32 | Magic. Always blank for BFRES. |
0x04 | UInt32 | Number of nodes in this dictionary. This does NOT include the root node. |
0x08 | Dictionary Nodes | Node definitions. |
0x08 + (numNodes * 0x10) | End of dictionary. |
Dictionary Node
Offset | Type | Description |
---|---|---|
0x00 | UInt32 | Reference node. -1 for root node. |
0x04 | UInt16 | ID of the node to the left of this node. |
0x06 | UInt16 | ID of the node to the right of this node. |
0x08 | UInt64 | Offset to the string in the string table that is associated with this node. |
0x10 | End of dictionary node. |
Relocation Table
The relocation table is a table that contains pointers to all the offsets in the file.
Header
Offset | Type | Description |
---|---|---|
0x00 | String | Section magic. Always "_RLT" in ASCII. |
0x04 | UInt32 | Current location. |
0x08 | UInt32 | Number of sections. |
0x0C | UInt32 | Padding. |
~ | End of relocation table header. |
After the header are the sections and entries. A BFRES always has 5 sections, even if unused.
- Pointers up to the end of the string pool.
- Pointers for index buffer.
- Pointers for vertex buffer.
- Pointers for memory pool.
- Pointers for external files.
Relocation Section
Offset | Type | Description |
---|---|---|
0x00 | UInt64 | Base pointer. |
0x08 | UInt32 | Current position. |
0x0C | UInt32 | Size. |
0x10 | Int32 | Entry index. |
0x14 | Int32 | Entry count. |
0x18 | End of relocation section. |
Relocation Entry
Offset | Type | Description |
---|---|---|
0x00 | UInt32 | Current position. |
0x04 | UInt16 | Structure count. |
0x06 | Byte | Offset count. |
0x07 | Byte | Padding count. |
0x08 | End of relocation section. |