Bfres

From EPD Wiki
Jump to navigation Jump to search

A bfres file collects a number of 3d-graphics related resources. This article details bfres version 10.0.0 and 10.2.0.

File Structure

Note this omits optional sections not currently found in at least one file. Such as the placement of user data in animations.

Section Order

  • fres header
  • fmdl header array
  • fska header array
  • fmaa header array
  • fvbs header array
  • fsha header array
  • fscn header array
  • memory pool info
  • embed file array
  • fmdl dictionary
  • fska dictionary
  • fmaa dictionary
  • fvbs dictionary
  • fsha dictionary
  • fscn dictionary
  • embed file dictionary
  • fmdl data array:
    • fvtx header array
    • fmat header array
    • reflection header array
    • fshp header array
    • fskl header
    • fskl data:
      • bone header array
      • skin bone index table
      • inverse transform matrix array
      • mirror bone index table
      • bone dictionary
      • bone data array:
        • user data array
        • user data dictionary
        • user data
    • shape dictionary
    • material dictionary
    • fshp data array:
      • mesh array
      • skin bone index array
      • bounding box array
      • bounding sphere array
      • mesh data array:
        • sub mesh array
        • runtime index buffer memory
        • index buffer info
    • fvtx data array:
      • vertex attribute array
      • runtime vertex buffer memory array
      • vertex buffer info array
      • vertex buffer stride info array
      • runtime user vertex buffer pointer array
      • vertex attribute dictionary
    • fmat data array:
      • render info value string array
      • render info value s32 array
      • render info value float array
      • render info value count array
      • render info value offset array
      • runtime texture view pointer array
      • sampler info array
      • runtime sampler array
      • shader param value array
      • runtime shader param uniform buffer offset array
      • shader param convert flag array
      • user data array
      • runtime sampler descriptor slot array
      • runtime texture view descriptor slot array
      • texture name array
      • static shader variation header
      • static shader variation data:
        • vertex attribute name array
        • vertex attribute variation to reflection array (only if different)
        • vertex attribute reflection to variation array (only if different)
        • sampler name array
        • sampler variation to reflection array (only if different)
        • sampler reflection to variation array (only if different)
        • static shader bool array
        • static shader string array
        • static shader option variation to reflection index array (only if different)
        • static shader option reflection to variation index array (only if different)
      • user data
      • sampler dictionary
      • user data dictionary
    • reflection data array:
      • render info array
      • shader param array
      • shader param dictionary (deduplicated between reflections)
      • render info dictionary (deduplicated between reflections)
      • vertex attribute dictionary (deduplicated between reflections)
      • sampler dictionary (deduplicated between reflections)
      • static shader option dictionary (deduplicated between reflections)
  • fska data array:
    • fast bind table
    • bone anim header array
    • bone anim data array:
      • default result
      • anim curve header array
      • anim curve frame and value data array
  • fvba data array:
    • default result array
    • fast bind array
    • bone name array
    • anim curve header array
    • anim curve frame and value data array
  • fmaa data array:
    • fast bind array
    • per material anim header array
    • runtime texture view descriptor slot array
    • runtime texture view pointer array
    • texture name array
    • per material anim data array:
      • shader param anim array
      • texture pattern anim array
      • constant array
      • anim curve header array
      • anim curve frame and value data array
  • fsha data array:
    • fast bind table
    • vertex shape anim header array
    • vertex shape anim data array:
      • key shape anim array
      • anim curve header array
      • default result array
      • anim curve frame and value data array
  • fscn data array:
    • fcam header array
    • flit header array
    • ffog header array
    • fcam dictionary
    • flit dictionary
    • ffog dictionary
    • fcam data array:
      • anim curve header array
      • default result
      • anim curve frame and value data array
    • flit data array:
      • anim curve header array
      • default result
      • anim curve frame and value data array
    • ffog data array:
      • anim curve header array
      • default result
      • anim curve frame and value data array
  • string pool
  • gpu region:
    • index buffer data
    • vertex buffer data
  • runtime memory pool
  • embed file region
  • relocation table

Header (nn::g3d2::ResFile)

A bfres file header collects a number of optional resources that can be iterated through by array or looked up by name through dictionary. Resources include 3d model data, model animation data, scene animation data, and embedded files. A Bfres can contain a "GPU region", a block of memory meant to be made GPU visible, or reference an external GPU region.

Offset Size Type Description
0x0 0x20 nn::util::BinaryFileHeader Base header with magic of "FRES ".
0x20 0x8 const char * (NW) File name
0x28 0x8 ResModel * Model array
0x30 0x8 nn::util::ResDic * Model dictionary
0x38 0x8 void*[4]
0x58 0x8 ResSkeletalAnim * Skeletal animation array
0x60 0x8 nn::util::ResDic * Skeletal animation dictionary
0x68 0x8 ResMaterialAnim * Material animation array
0x70 0x8 nn::util::ResDic * Material animation dictionary
0x78 0x8 ResBoneVisibilityAnim * Bone visibility animation array
0x80 0x8 nn::util::ResDic * Bone visibility animation dictionary
0x88 0x8 ResShapeAnim * Shape animation array
0x90 0x8 nn::util::ResDic * Shape animation dictionary
0x98 0x8 ResSceneAnim * Scene animation array
0xa0 0x8 nn::util::ResDic * Scene animation dictionary
0xa8 0x8 nn::gfx::TMemoryPool * Runtime MemoryPool (set by g3d)
0xb0 0x8 nn::gfx::MemoryPoolInfo Pre-initialized MemoryPool info pointing to GPU region
0xb8 0x8 nn::gfx::ResEmbedFile * Embed file array
0xc0 0x8 nn::util::ResDic * Embed file dictionary
0xc8 0x8 void * User pointer in EPD software. (possibly a UI tree in nn::ui?)
0xd0 0x8 const char * (NW)
0xd8 0x4 u32
0xdc 0x2 u16 Model array count
0xde 0x2 u16
0xe0 0x2 u16
0xe2 0x2 u16 Skeletal animation array count
0xe4 0x2 u16 Material animation array count
0xe6 0x2 u16 Bone visibility animation count
0xe8 0x2 u16 Shape animation count
0xea 0x2 u16 Scene animation count
0xec 0x2 u16 Embed file count
0xee 0x2 u16

Model (nn::g3d2::ResModel)

A model represents a collection of 3d shape data, material data, and a skeleton.

Offset Size Type Description
0x0 0x4 u32 Magic, always "FMDL"
0x4 0x4 u32
0x8 0x8 const char* (NW) Model name
0x10 0x8 const char* (NW)
0x18 0x8 ResSkeleton* Skeleton
0x20 0x8 ResVertex* Vertex array
0x28 0x8 ResShape* Shape array
0x30 0x8 nn::util::ResDic* Shape dictionary
0x38 0x8 ResMaterial* Material array
0x40 0x8 nn::util::ResDic* Material dictionary
0x48 0x8 ResShaderReflection* Shader reflection array
0x50 0x8 Gfx User Data* User data array
0x58 0x8 nn::util::ResDic* User data dictionary
0x60 0x8 void * Runtime user pointer
0x68 0x2 u16 Vertex count
0x6a 0x2 u16 Shape count
0x6c 0x2 u16 Material count
0x6e 0x2 u16 Shader reflection count
0x70 0x2 u16 User data count
0x72 0x6

Vertex (nn::g3d2::ResVertex)

A ResVertex references a collection of vertex buffers in the GPU region. Reflection and settings are provided for the vertex buffers and attributes. Runtime object memory is provided to initialize graphics api objects for the vertex buffers.

Offset Size Type Description
0x0 0x4 u32 Magic "FVTX"
0x4 0x4 u32
0x8 0x8 ResVertexAttribute* Vertex atribute array
0x10 0x8 nn::util::ResDic* Vertex attribute dictionary
0x18 0x8 void * Runtime memory pool pointer
0x20 0x8 void * Runtime vertex buffer array (0x48 bytes of zeroed memory per vertex buffer)
0x28 0x8 void ** Runtime user vertex buffer array
0x30 0x8 nn::gfx::BufferInfo* Vertex buffer info array
0x38 0x8 ResVertexBufferStride* Vertex buffer stride array
0x40 0x8 void * Runtime user pointer
0x48 0x4 u32 Base offset of vertex data in GPU region, relative to start of GPU region
0x4c 0x1 u8 Vertex attribute count
0x4d 0x1 u8 Vertex buffer count
0x4e 0x2 u16 Index of this section in parent ResModel
0x50 0x4 u32 Vertex count
0x54 0x2 u16
0x56 0x2 u16 Alignment of vertex buffer data in GPU region
ResVertexAttribute
Offset Size Type Description
0x0 0x8 const char* (NW) Attribute name
0x8 0x4 u32, nn::gfx::AttributeFormat Attribute format
0xc 0x2 u16 Buffer offset
0xe 0x1 u8 Buffer index
0xf 0x1 u8 Indicates whether this is a dynamic vertex attribute for shape blending
ResVertexBufferStride

Unused bytes might indicate nn::gfx::VertexBufferInfo.

Offset Size Type Description
0x0 0x4 u32 Stride
0x4 0x4 u32 Divisor
0x8 0x4 u32
0xc 0x4 u32

Shape (nn::g3d2::ResShape)

A shape represents 3d mesh data. Either via a set of level-of-detail meshes into the vertex buffers of a ResVertex, or alternatively in v10.2.0 onwards, a set of meshlet buffers.

Offset Size Type Description
0x0 0x4 u32 Magic "FSHP"
0x4 0x4 u32 Flags
0x8 0x8 const char* (NW) Shape name
0x10 0x8 ResVertex* Referenced vertex
0x18 0x8 ResMesh* or ResMeshlet* Level-of-detail mesh array, or if flags bit 4 is set, a ResMeshlet
0x20 0x8 u16* Skinning bone index array
0x28 0x8 ResKeyShape* Key shape array
0x30 0x8 nn::util::ResDic* Key shape dictionary
0x38 0x8 ResBounding* Bounding box array
0x40 0x8 ResBoundingSphere* Bounding sphere array
0x48 0x8 void * Runtime user pointer
0x50 0x2 u16 Index of this section in parent ResModel
0x52 0x2 u16 Material index
0x54 0x2 u16 Base bone index
0x56 0x2 u16 Vertex index
0x58 0x2 u16 Skin bone index count
0x5a 0x1 u8 Vertex skin weight count
0x5b 0x1 u8 Mesh count
0x5c 0x1 u8 Key shape count
0x5d 0x1 u8 Target attribute count
0x5e 0x2 u16
ResMesh
Offset Size Type Description
0x0 0x8 ResSubMeshRange* Array of sub mesh ranges
0x8 0x8 void * Runtime memory pool pointer
0x10 0x8 void * Runtime index buffer memory (0x48 bytes of zeroed memory)
0x18 0x8 nn::gfx::BufferInfo* Index buffer info
0x20 0x4 u32 Offset of index buffer in GPU region relative to start of GPU region
0x24 0x4 u32, nn::gfx::PrimitiveTopology Primitive topology to use for drawing commands
0x28 0x4 u32, nn::gfx::IndexFormat Index format to use in drawing commands
0x2c 0x4 u32 Index count
0x30 0x4 u32 Base vertex
0x34 0x2 u16 Sub mesh count
0x36 0x2 u16
ResSubMeshRange
Offset Size Type Description
0x0 0x4 u32 Offset of sub mesh relative to start of index buffer
0x4 0x4 u32 Index count of sub mesh
ResKeyShape
Offset Size Type Description
0x0 0x12 u8[18] Relative key shape attribute location array
0x12 0x2 u8[2]
ResBounding
Offset Size Type Description
0x0 0xc Float3 Position
0xc 0xc Float3 Extent
ResBoundingSphere
Offset Size Type Description
0x0 0xc Float3 Position
0xc 0x4 float Radius
ResMeshlet

Currently only observed unused in Nintendo Switch Online: Playtest Program.

Offset Size Type Description
0x0 0x8 ...
0x8 0x8 void * Runtime meshlet buffer array (0x48 bytes of zeroed memory per meshlet buffer)
0x10 0x8 nn::gfx::BufferInfo* Meshlet buffer info array
0x18 0x8 s64 * Meshlet buffer memory offset array, each entry relative to start of GPU region
0x20 0x24 ...
0x44 0x1 u8 Meshlet buffer count
0x45 0x3 ...

Shader Reflection

A ResShaderReflection provides reflection for resolving material parameter data for a shader inside a bfsha shader archive.

Offset Size Type Description
0x0 0x8 const char* (NW) Shader archive name
0x8 0x8 const char* (NW) Shader name
0x10 0x8 ResRenderInfo* Render info array
0x18 0x8 nn::util::ResDic* Render info dictionary
0x20 0x8 ResShaderParam* Material shader parameter array
0x28 0x8 nn::util::ResDic* Material shader parameter dictionary
0x30 0x8 nn::util::ResDic* Vertex attribute dictionary
0x38 0x8 nn::util::ResDic* Sampler dictionary
0x40 0x8 nn::util::ResDic* Static shader option dictionary
0x48 0x2 u16 Render info count
0x4a 0x2 u16 Shader parameter count
0x4c 0x2 u16 Shader parameter data size
0x4e 0xa u8[10]
ResRenderInfo

Render info provides reflection for CPU-side rendering parameters.

Offset Size Type Description
0x0 0x8 const char* (NW) Render info name
0x8 0x1 u8 Render info data type
0x9 0x7 u8[7]
Render info data type
Name Value Description
Int 0 Value is a 32-bit integer
Float 1 Value is a 32-bit float
String 2 Value is an NW string pointer
ResShaderParam

ResShaderParam's compose a user generated structure layout for a material uniform buffer. Shader parameters can be animated through material animations.

Offset Size Type Description
0x0 0x8 u32(*)(void*,const void*,ResShaderParam*, void*) Runtime conversion function for data types requiring runtime conversion of a CPU representation to a GPU representation
0x8 0x8 const char* (NW) Shader parameter name
0x10 0x2 u16 Shader parameter offset
0x12 0x1 u8 Shader parameter data type
0x13 0x5 u8[5]
Shader parameter data type
Name Value Description
Bool 0
Bool2 1
Bool3 2
Bool4 3
Int 4
Int2 5
Int3 6
Int4 7
UInt 8
UInt2 9
UInt3 10
UInt4 11
Float 12
Float2 13
Float3 14
Float4 15
Matrix2x2 17
Matrix2x3 18
Matrix2x4 19
Matrix3x2 20
Matrix3x3 21
Matrix3x4 22
Matrix4x2 23
Matrix4x3 24
Matrix4x4 25
Srt2d 26
Srt3d 27
SrtTexture 28

Material (nn::g3d2::ResMaterial)

Offset Size Type Description
0x0 0x4 u32 Magic "FMAT"
0x4 0x4 u32 Flags (bit 0 = is visible)
0x8 0x8 const char* (NW) Material name
0x10 0x8 ResStaticShaderVariation* Static shader variation
0x18 0x8 void** Runtime texture view pointer array
0x20 0x8 const char** (NW) Texture name array
0x28 0x8 void* Runtime sampler array (0x78 bytes of zeroed memory per sampler)
0x30 0x8 nn::gfx::SamplerInfo* Sampler info array
0x38 0x8 nn::util::ResDic* Sampler dictionary
0x40 0x8 void* Render info value array
0x48 0x8 u16* Render info value count array
0x50 0x8 u16* Render info value offset array
0x58 0x8 void* Shader parameter value array
0x60 0x8 s32* Runtime shader parameter material uniform buffer offset array
0x68 0x8 u64
0x70 0x8 Gfx user data* User data array
0x78 0x8 nn::util::ResDic* User data dictionary
0x80 0x8 u32 * Shader parameter runtime convert bit array
0x88 0x8 void* Runtime user pointer
0x90 0x8 u64* Runtime sampler descriptor slot array
0x98 0x8 u64* Runtime texture view descriptor slot array
0xa0 0x2 u16 Index of this section in parent ResModel
0xa2 0x1 u8 Sampler count
0xa3 0x1 u8 Texture count
0xa4 0x2 u16 Is force calculate material
0xa6 0x2 u16 User data count
0xa8 0x2 u16 Render info value size
0xaa 0x2 u16 Runtime material uniform buffer size
0xac 0x4 u32
ResStaticShaderVariation

A material references a ResStaticShaderVariation which selects the material's static shader variation out of the shader referenced by a ResShaderReflection.

Offset Size Type Description
0x0 0x8 ResShaderReflection* Shader reflection
0x8 0x8 const char** (NW) Vertex attribute name array, of those used in this specific static shader variation
0x10 0x8 u8* Vertex attribute index array
0x18 0x8 const char** (NW) Sampler name array, of those used in this specific static shader variation
0x20 0x8 u8* Sampler index array
0x28 0x8 u32* Static shader option choice packed bool array
0x30 0x8 const char** (NW) Static shader option choice string array
0x38 0x8 u16* Static shader option index array
0x40 0x4 u32
0x44 0x1 u8 Vertex attribute count
0x45 0x1 u8 Sampler count
0x46 0x2 u16 Static shader option bool count
0x48 0x2 u16 Total static shader option count
0x4a 0x6 u8[6]