Difference between revisions of "BFRES (File Format)"
KillzXGaming (talk | contribs) |
KillzXGaming (talk | contribs) |
||
Line 1: | Line 1: | ||
BFRES, known as '''B'''inary Ca'''F'''e '''RES'''ource, stores information relating to any 3D model data. | BFRES, known as '''B'''inary Ca'''F'''e '''RES'''ource, stores information relating to any 3D model data. | ||
+ | |||
+ | == Changes From Wii U == | ||
+ | The 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) | ||
== Header == | == Header == | ||
Line 58: | Line 75: | ||
| 0x88 || UInt64 || Memory Pool. | | 0x88 || UInt64 || Memory Pool. | ||
|- | |- | ||
− | | 0x90 || UInt64 || Buffer Section. | + | | 0x90 || UInt64 || [[#Buffer Section|Buffer Section]]. |
|- | |- | ||
− | | 0x98 || UInt64 || | + | | 0x98 || UInt64 || [[#Embedded Files|Embedded files]] offset. |
|- | |- | ||
| 0xA0 || UInt64 || Embedded file dictionary offset. | | 0xA0 || UInt64 || Embedded file dictionary offset. | ||
Line 183: | Line 200: | ||
|} | |} | ||
− | == | + | == Embedded Files == |
− | + | this area stores additional files such as shaders (BFSHA) and textures (BNTX). | |
− | |||
− | |||
{|class="wikitable" | {|class="wikitable" | ||
|- | |- | ||
! Offset !! Type !! Description | ! Offset !! Type !! Description | ||
|- | |- | ||
− | | 0x00 || | + | | 0x00 || UInt64 || Data offset. |
− | |||
− | |||
|- | |- | ||
− | | 0x08 || | + | | 0x08 || UInt64 || Data size. |
|- | |- | ||
− | | | + | | 0x10 || || End of buffer structure. |
|} | |} | ||
+ | |||
== Buffer Section == | == Buffer Section == | ||
Line 217: | Line 231: | ||
|- | |- | ||
| 0x20 || || End of buffer structure. | | 0x20 || || End of buffer structure. | ||
+ | |} | ||
+ | |||
+ | == Dictionary == | ||
+ | A dictionary is a structure that can store [[#Dictionary_Node|nodes]] that reference each other, to create a tree for storing data. | ||
+ | |||
+ | === Header === | ||
+ | The header defines the structure of the dictionary. | ||
+ | {|class="wikitable" | ||
+ | |- | ||
+ | ! 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_Node|Dictionary Nodes]] || Node definitions. | ||
+ | |- | ||
+ | | 0x08 + (numNodes * 0x10) || || End of dictionary. | ||
|} | |} | ||
Revision as of 19:58, 31 October 2018
BFRES, known as Binary CaFe RESource, stores information relating to any 3D model data.
Contents
Changes From Wii U
The 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)
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. |
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 file 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. |
0x04 | UInt32 | Block size. |
0x08 | UInt64 | Block offset. |
0x10 | UInt64 | Model name offset. |
0x18 | UInt64 | String table end 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. |
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 | 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. |