Open main menu

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.

  1. Pointers up to the end of the string pool.
  2. Pointers for index buffer.
  3. Pointers for vertex buffer.
  4. Pointers for memory pool.
  5. 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.