Difference between revisions of "BFRES (File Format)"
KillzXGaming (talk | contribs) |
KillzXGaming (talk | contribs) |
||
Line 26: | Line 26: | ||
| 0x16 || UInt16 || Block offset. | | 0x16 || UInt16 || Block offset. | ||
|- | |- | ||
− | | 0x18 || UInt32 || Relocation table offset. | + | | 0x18 || UInt32 || [[#Relocation Table|Relocation table]] offset. |
|- | |- | ||
| 0x1C || UInt32 || BFRES Size. | | 0x1C || UInt32 || BFRES Size. |
Revision as of 19:49, 31 October 2018
BFRES, known as Binary CaFe RESource, stores information relating to any 3D model data.
Contents
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 | External 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. |
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. |
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 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. |