Under Construction
This article is not finished. Help improve it by adding accurate information or correcting grammar and spelling.
BFRES (Binary caFe RESources) is a file format used on Wii U. It contains model data, texture data, animation data and shader data. All offsets are relative to themselves, and may be 0 if it links to nothing (null).
File Format
The file starts with the following header:
Dictionary
A dictionary is a common structure used in many different structures. It is used for fast name look-up, in order to find a specific array item by its name. It starts with the following structure:
Offset |
Type |
Description
|
0x00 |
UInt32 |
Total size of this structure in bytes.
|
0x04 |
Int32 |
Number of nodes following this structure (excluding root node).
|
A root node follow, and then comes the specified amount of nodes. Each node has the following structure:
Offset |
Type |
Description
|
0x00 |
UInt32 |
Search value. Specifies the first difference between two strings.
|
0x04 |
UInt16 |
Left index. Specifies the left node.
|
0x06 |
UInt16 |
Right index. Specifies the right node.
|
0x08 |
Int32 |
Name offset. Points to the key used to perform fast look-up.
|
0x0C |
Int32 |
Data offset. Points to the underlying data this node represents. What data this is depends on where it's used.
|
User Data
User data is data stored in the game which can be accessed by the game to do anything. It can be retrieved by a game at runtime for any purpose. It has the following structure:
Offset |
Type |
Description
|
0x00 |
Int32 |
Name offset. Points to the key of this user data.
|
0x04 |
UInt16 |
N = number of elements stored in the array.
|
0x06 |
Byte |
Type of the elements.
Value |
Type |
Description
|
0 |
Int32 |
The data consists of 4-bytes integers.
|
1 |
Float |
The data consists of 4-bytes floating point numbers.
|
2 |
String |
The data consists of strings using the ASCII character set.
|
3 |
String |
The data consists of strings using the UCS-2 character set (like UTF-16, fixed 2 bytes per character).
|
4 |
Byte |
The data consists of bytes.
|
|
0x07 |
Byte |
Padding.
|
- Numbers
Numerical user data follows directly after this header as an array of N elements.
- Strings
Textual data is stored as an array of offsets which point to strings following directly afterwards - they are not located in the file-wide string table. The strings are encoded in UTF-8 with the character set given above, and 0-terminated (there is no 4-byte length prefix as with strings stored in the string table). New lines should be represented with CRLF characters.
Offset |
Type |
Description
|
0x00 |
Int32[N] |
N offsets to the strings. The strings are null-terminated and come directly after this array. They are not stored in the string table.
|
Animation Curve
The animation curve stores the values of an animation. It is a common structure used in all sub files. Each curve has the following structure:
Offset |
Type |
Description
|
0x00 |
UInt16 |
Flags. xxxxxxxx xAAABBCC.
- AAA determines what kind of curve data is stored, resulting in a different number of elements stored per key. They are used to set the key values and control the interpolation from one key to the next.
Value |
Description |
Elements per Key
|
0 |
Cubic Single |
4 (hermite interpolation)
|
1 |
Linear Single |
2 (linear interpolation)
|
2 |
Baked Single |
1 (no interpolation)
|
4 |
Step Integer |
1 (no interpolation)
|
5 |
Baked Integer |
1 (no interpolation)
|
6 |
Step Boolean |
1 (no interpolation)
|
7 |
Baked Boolean |
1 (no interpolation)
|
- BB determines the data type of key frames.
Value |
Size |
Type
|
0 |
4 |
Single
|
1 |
2 |
Int16
|
2 |
1 |
SByte
|
- CC determines the data type of the frame values.
Value |
Size |
Type
|
0 |
4 |
Single
|
1 |
2 |
16-bit fixed point value (1 bit sign, 10 bits integral and 5 bits fractional).
|
2 |
1 |
Byte
|
|
0x02 |
UInt16 |
Number of key frames.
|
0x04 |
UInt32 |
Target offset, an offset in bytes into the corresponding owning structure to animate the field at that relative address.
|
0x08 |
Single |
Start key frame, the first frame at which a key is placed.
|
0x0C |
Single |
End key frame, the last frame at which a key is placed.
|
0x10 |
Int32 / Single |
Data scale, multitplier to the raw frame values to get the final result. Together with Data offset, it is chosen carefully to consider an optimal granularity between the stored values.
|
0x14 |
Single |
Data offset, added to the raw values (after multiplying them with Data scale) to get the final frame value.
|
If version ≥ 3.4.0.0
|
0x18 |
Single |
Data delta, stores the difference between the first and last key frame value.
|
0x1C |
Int32 |
Key frame array offset.
|
0x20 |
Int32 |
Frame value array offset.
|
Else
|
0x18 |
Int32 |
Key frame array offset.
|
0x1C |
Int32 |
Frame value array offset.
|
String Table
The string table stores all strings used in many different sections. It consists of null-terminated strings. All offsets points directly to the string. Before each string there is a UInt32 which stores the length of the string (excluding the null byte). The string length field is aligned by 4.
FMDL
The FMDL section (caFe MoDeL) stores model data. It contains the vertex data, skeleton data, materials and shape data, split into 4 different sections. Each model has the following structure:
Offset |
Type |
Description
|
0x00 |
Char[4] |
Section magic. Always FMDL in ASCII.
|
0x04 |
Int32 |
Name offset. Points to the name of this model.
|
0x08 |
Int32 |
Original path offset. Points to the full path of the original file.
|
0x0C |
Int32 |
FSKL skeleton offset.
|
0x10 |
Int32 |
FVTX vertex array offset.
|
0x14 |
Int32 |
FSHP shape dictionary offset.
|
0x18 |
Int32 |
FMAT material dictionary offset.
|
0x1C |
Int32 |
User data dictionary offset.
|
0x20 |
UInt16 |
Number of FVTX vertices.
|
0x22 |
UInt16 |
Number of FSHP shapes.
|
0x24 |
UInt16 |
Number of FMAT materials.
|
0x26 |
UInt16 |
Number of user datas.
|
0x28 |
UInt32 |
Number of processed vertices.
|
0x2C |
UInt32 |
User pointer.
|
FSKL
FVTX
FSHP
FMAT
FTEX
The FTEX section (caFe TEXture) stores textures data. Each texture has the following structure:
Offset |
Type |
Description
|
0x00 |
Char[4] |
Section magic. Always FTEX in ASCII.
|
0x04 |
UInt32 |
Surface dimension.
Value |
Type
|
0x00 |
1D texture
|
0x01 |
2D texture
|
0x02 |
3D texture
|
0x03 |
Cube texture
|
0x04 |
1D array texture
|
0x05 |
2D array texture
|
0x06 |
2D MSAA texture
|
0x07 |
2D MSAA array texture
|
|
0x08 |
UInt32 |
Width of image in pixels.
|
0x0C |
UInt32 |
Height of image in pixels.
|
0x10 |
UInt32 |
Depth of image in pixels.
|
0x14 |
UInt32 |
Total number of images.
|
0x18 |
UInt32 |
Image format.
|
0x1C |
UInt32 |
Anti aliasing mode.
Value |
Type
|
0x00 |
1X anti aliasing
|
0x01 |
2X anti aliasing
|
0x02 |
4X anti aliasing
|
0x03 |
8X anti aliasing
|
|
0x20 |
UInt32 |
Surface usage.
Value |
Type
|
0x00 |
Texture
|
0x01 |
Color buffer
|
0x02 |
Depth buffer
|
0x04 |
Scan buffer
|
0x80000000 |
FTX
|
|
0x24 |
UInt32 |
Size of the main level image in bytes.
|
0x28 |
UInt32 |
Data pointer, set at runtime.
|
0x2C |
UInt32 |
Size of all mipmaps in bytes.
|
0x30 |
UInt32 |
Mipmap pointer, set at runtime.
|
0x34 |
UInt32 |
Tile mode.
Value |
Type
|
0x00 |
Default
|
0x01 |
Linear Aligned
|
0x02 |
Tiled 1D Thin 1
|
0x03 |
Tiled 1D Thick
|
0x04 |
Tiled 2D Thin 1
|
0x05 |
Tiled 2D Thin 2
|
0x06 |
Tiled 2D Thin 4
|
0x07 |
Tiled 2D Thick
|
0x08 |
Tiled 2B Thin 1
|
0x09 |
Tiled 2B Thin 2
|
0x0A |
Tiled 2B Thin 4
|
0x0B |
Tiled 2B Thick
|
0x0C |
Tiled 3D Thin 1
|
0x0D |
Tiled 3D Thick
|
0x0E |
Tiled 3B Thin 1
|
0x0F |
Tiled 3B Thick
|
0x10 |
Linear Special
|
|
0x38 |
UInt32 |
Swizzle value. A value between 0 and 7 which controlls how the image is swizzled.
|
0x3C |
UInt32 |
Texture alignment.
|
0x40 |
UInt32 |
Pitch.
|
0x44 |
UInt32[13] |
Mipmap offsets. Points to a maximum amount of 13 mipmaps, unused are set to 0. The first offset is relative to the main level image.
|
0x78 |
UInt32 |
First mipmap.
|
0x7C |
UInt32 |
Total number of images.
|
0x80 |
UInt32 |
First slice.
|
0x84 |
UInt32 |
Number of slices.
|
0x88 |
Byte[4] |
Component selector. Swizzles the different components, for red, green, blue and alpha respectively.
Value |
Type
|
0x00 |
Red
|
0x01 |
Green
|
0x02 |
Blue
|
0x03 |
Alpha
|
0x04 |
Zero
|
0x05 |
One
|
|
0x8C |
UInt32[5] |
Texture registers. Unknown use.
|
0xA0 |
UInt32 |
Texture handle pointer, set at runtime.
|
0xA4 |
UInt32 |
Array length.
|
0xA8 |
Int32 |
Name offset. Points to the name of this texture.
|
0xAC |
Int32 |
Original path offset. Points to the full path of the original file.
|
0xB0 |
Int32 |
Data offset. Points to the image data.
|
0xB4 |
Int32 |
Mipmap data offset. Points to the mipmap data.
|
0xB8 |
Int32 |
User data dictionary offset.
|
0xBC |
UInt16 |
Number of user datas.
|
0xBE |
UInt16 |
Padding.
|
FSKA
The FSKA section (caFe SKeleton Animation) stores skeleton animations. Each animation has the following structure:
Offset |
Type |
Description
|
0x00 |
Char[4] |
Section magic. Always FSKA in ASCII.
|
0x04 |
Int32 |
Name offset. Points to the name of this animation.
|
0x08 |
Int32 |
Original path offset. Points to the full path of the original file.
|
0x0C |
UInt32 |
Flags. Set of bits controlling how data is stored, packed as xxxxxxxx xxxxxxxx xxxAxxBB xxxxxCxD.
- A controls the rotation mode. Quaternion = 0, Euler XYZ = 1.
- BB controls how to perform scaling:
Value |
Description
|
0 |
No scaling
|
1 |
Standard scaling
|
2 |
Maya scaling
|
3 |
Softimage scaling
|
- C controls whether the animation is looping.
- D determines whether curves are baked.
|
If version ≥ 3.4.0.0
|
0x10 |
UInt32 |
Number of frames.
|
0x14 |
UInt16 |
Number of bone animations.
|
0x16 |
UInt16 |
Number of user datas.
|
0x18 |
UInt32 |
Number of curves.
|
0x1C |
UInt32 |
Baked size.
|
Else
|
0x10 |
UInt16 |
Number of frames.
|
0x12 |
UInt16 |
Number of bone animations.
|
0x14 |
UInt16 |
Number of user datas.
|
0x16 |
UInt16 |
Number of curves.
|
0x18 |
UInt32 |
Baked size.
|
0x1C |
UInt32 |
Unknown.
|
0x20 |
Int32 |
Bone animation array offset.
|
0x24 |
Int32 |
FSKL skeleton pointer, set at runtime.
|
0x28 |
Int32 |
Bind index array offset. Each element in this array is a UInt16.
|
0x2C |
Int32 |
User data dictionary offset.
|
Bone Animation
Each bone animation structure stores animation for a specific bone. There are curves for each transformation type, which is linked by this structure. Each entry has the following structure:
Offset |
Type |
Description
|
0x00 |
UInt32 |
Flags. Sets of bits packed as xxxxAAAA Axxxxxxx BBBBBBBB BBCCCxxx determining if initial transformational values exist.
- AAAA A are additional combinable flags which apparently describe how bones affect transformations.
Value |
Description
|
1 |
Segment Scale Compensate
|
2 |
Scale Uniform
|
4 |
Scale Volume One
|
8 |
Rotate Zero
|
16 |
Translate Zero
|
- BBBBBBBB BB are combinable flags apparently describing what kind of Curves are available.
Value |
Description
|
1 |
Scale X
|
2 |
Scale Y
|
4 |
Scale Z
|
8 |
Rotate X
|
16 |
Rotate Y
|
32 |
Rotate Z
|
64 |
Translate X
|
128 |
Translate Y
|
256 |
Translate Z
|
- CCC are combinable flags determining if data is available in the Bone Animation Data to animate specific transformations:
Value |
Data Type
|
1 |
Scaling, a 3-component Single vector
|
2 |
Rotate, a 4-component Single vector, storing an euler XYZ (last component unused) or quaternion rotation.
|
4 |
Translate, a 3-component Single vector
|
|
0x04 |
Int32 |
Bone name offset of the bone to be transformed.
|
0x08 |
Byte |
Start rotation, exact purpose unknown.
|
0x09 |
Byte |
Start translation, exact purpose unknown.
|
0x0A |
Byte |
Number of curves.
|
0x0B |
Byte |
Base bone animation data translate offset, an offset into the base Bone Animation Data structure to retrieve the initial bone translation for resetting it.
|
0x0C |
Byte |
Start curve index, relative to the whole FSKA subfile.
|
0x0D |
Byte[3] |
Padding.
|
0x10 |
Int32 |
Curve array offset.
|
0x14 |
Int32 |
Base Bone Animation Data offset, storing the initial state of the bone.
|
Bone Animation Data
The Bone Animation header points to an array of float values, which have to be interpreted as 3- or 4-component vectors. Only the elements appearing in the Flags are stored, in the order as follows. The Curve target type is an offset into this structure to animate the corresponding field.
Size |
Type |
Description
|
12 |
Single[3] |
Scaling.
|
16 |
Single[4] |
Rotation, either euler XYZ or quaternion.
|
12 |
Single[3] |
Translation.
|
FSHU
The FSHU section (caFe SHader Uber animation) is used as three different types of animations which are treated the same way. It's used as shader parameter animations, color animations and texture SRT animations. Each animation has the following structure:
FTXP
The FTXP section (caFe TeXture Pattern animation) stores texture pattern animations. Each animation has the following structure:
FVIS
The FVIS section (caFe VISibility animation) is used as two different types of animations which are treated the same way. It's used as both bone visibility animation and material visibility animation. Each animation has the following structure:
FSHA
The FSHA section (caFe SHApe animation) stores shape animations. Each animation has the following structure:
FSCN
The FSCN section (caFe SCeNe) stores scene animations. Each scene animation contains three different types of animations, camera, fog and light. Each animation has the following structure:
Embedded File
Embedded files are generic file data which is stored inside the BFRES file. It can contain any data, however, usually it is used to store a BFSHA shader file. Each entry has the following structure:
Offset |
Type |
Description
|
0x00 |
Int32 |
Offset to file data. Points to the start of the generic file.
|
0x04 |
UInt32 |
Length of the file in bytes.
|
Version List
Version |
Found in
|
2.2.0.3
|
|
2.2.0.6
|
|
3.0.0.1
|
|
3.2.0.1
|
|
3.3.0.1
|
|
3.4.0.2
|
|
3.4.0.4
|
|
3.5.0.2
|
|
3.5.0.3
|
|
Tools
The following tools can handle BFRES files: