Difference between revisions of "MDL0 (File Format)"

From Custom Mario Kart
Jump to navigation Jump to search
(Corrected grammar and provided some info about bone's billboard settings.)
Line 1: Line 1:
{{Under-construction}}
 
 
 
This page describes the [[Mario Kart Wii]] '''MDL0''' file format, as found within [[BRRES (File Format)|BRRES files]].
 
This page describes the [[Mario Kart Wii]] '''MDL0''' file format, as found within [[BRRES (File Format)|BRRES files]].
  
Line 22: Line 20:
 
| 1 || Bones
 
| 1 || Bones
 
|-
 
|-
| 2 || Verticies
+
| 2 || Vertices
 
|-
 
|-
 
| 3 || Normals
 
| 3 || Normals
Line 28: Line 26:
 
| 4 || Colors
 
| 4 || Colors
 
|-
 
|-
| 5 || Texture Coordinates
+
| 5 || Texture coordinates
 
|-
 
|-
| 6 || Fur Vectors '''(Seen in v10+ MDL0s)'''
+
| 6 || Fur vectors '''(seen in v10+ MDL0's)'''
 
|-
 
|-
| 7 || Fur Layers '''(Seen in v10+ MDL0s)'''
+
| 7 || Fur layers '''(seen in v10+ MDL0's)'''
 
|-
 
|-
 
| 8 || Materials
 
| 8 || Materials
 
|-
 
|-
| 9 || TEV's (Shader-like Operations)
+
| 9 || TEV's (shader-like operations)
 
|-
 
|-
 
| 10 || Objects (Polygons)
 
| 10 || Objects (Polygons)
 
|-
 
|-
| 11 || Texture Links
+
| 11 || Texture links
 
|-
 
|-
| 12 || Pallet Links '''(Not Seen in [[Mario Kart Wii]])'''
+
| 12 || Palette links '''(Not seen in [[Mario Kart Wii]])'''
 
|-
 
|-
| 13 || '''Unknown (Not Seen in [[Mario Kart Wii]] or v9 mdl0s)'''
+
| 13 || '''Unknown (not seen in [[Mario Kart Wii]] or v9 MDL0's)'''
 
|-
 
|-
 
|}
 
|}
  
=== MDL0 Header ===
+
=== MDL0 header ===
Following the section offsets is the MDL0 header structure.
+
 
 +
Following the section offsets there is a MDL0 header structure.
  
 
{| class="wikitable"
 
{| class="wikitable"
 
! Offset !! Size !! Description
 
! Offset !! Size !! Description
 
|-
 
|-
| 0x00 || 4 || Header Length (0x40)
+
| 0x00 || 4 || Header length (0x40)
 
|-
 
|-
| 0x04 || 4 || File Header Offset
+
| 0x04 || 4 || File header offset
 
|-
 
|-
 
| 0x08 || 4 || '''Unknown'''
 
| 0x08 || 4 || '''Unknown'''
Line 62: Line 61:
 
| 0x0C || 4 || '''Unknown'''
 
| 0x0C || 4 || '''Unknown'''
 
|-
 
|-
| 0x10 || 4 || Vertex Count
+
| 0x10 || 4 || Vertex count
 
|-
 
|-
| 0x14 || 4 || Face Count
+
| 0x14 || 4 || Face count
 
|-
 
|-
 
| 0x18 || 4 || '''Unknown'''
 
| 0x18 || 4 || '''Unknown'''
 
|-
 
|-
| 0x1C || 4 || Bone Count
+
| 0x1C || 4 || Bone count
 
|-
 
|-
 
| 0x20 || 4 || '''Unknown''' (0x01000000)
 
| 0x20 || 4 || '''Unknown''' (0x01000000)
 
|-
 
|-
| 0x24 || 4 || Bone Table Offset
+
| 0x24 || 4 || Bone table offset
 
|-
 
|-
 
| 0x28 || 12 || Minimum (float3)
 
| 0x28 || 12 || Minimum (float3)
Line 79: Line 78:
 
|-
 
|-
 
|}
 
|}
 +
 
All offsets are relative to the start of the header.<br />
 
All offsets are relative to the start of the header.<br />
=== Bone-Link Table ===
+
 
The bone-link table usually follows directly after the MDL0 Header. Its offset also lies within the header however. The table describes how the IDs of Bone sections related to their indicies. If the Wii needs a specific bone, it looks up the id in this table, and the loads the bone from the index given.
+
=== Bone-link table ===
 +
 
 +
The bone-link table usually follows directly after the MDL0 header. However, its offset also lies within the header. The table below describes how the IDs of bone sections are related to their indices. If the Wii needs a specific bone, it looks up the ID from this table, and then, it loads the bone from the index given.
  
 
{| class="wikitable"
 
{| class="wikitable"
 
! Offset !! Size !! Description
 
! Offset !! Size !! Description
 
|-
 
|-
| 0x00 || 4 || Entry Count
+
| 0x00 || 4 || Entry count
 
|-
 
|-
| 0x04 || 4 * Entry Count || Node index (-1 for not present)
+
| 0x04 || 4 * Entry count || Node index (-1 for not present)
 
|-
 
|-
 
|}
 
|}
Line 102: Line 104:
  
  
So the weights with one bone affecting geometry come first, the weights with multiple influences (all as 0xFFFFFFFF), and finally the weights for joints with no geometry.
+
So the weights with one bone affecting geometry come first, then the weights with multiple influences (all as 0xFFFFFFFF), and finally the weights for joints with no geometry.
  
The indexes in the Nodemix block will match up to the weights position here, and the 0x10 block in a joint will be the index of its weight as it appears here (So the value of 0x10 in joint 0 above would be 0x00000007).
+
The indexes in the Nodemix block will match up to the weights' position here, and the 0x10 block in a joint will be the index of its weight as it appears here (so the value of 0x10 in joint 0 above would be 0x00000007).
  
 
=== BRRES Index Group ===
 
=== BRRES Index Group ===
  
Following the Bone-Link table, one [[BRRES Index Group (File Format)|BRRES Index Group]] for each non empty section is defined. The sections in the MDL0 header link to the groups.
+
Following the bone-link table, one [[BRRES Index Group (File Format)|BRRES Index Group]] for each non empty section is defined. The sections in the MDL0 header link to the groups.
  
 
== Section formats ==
 
== Section formats ==
 
=== Section 0 - Draw Lists ===
 
=== Section 0 - Draw Lists ===
The draw list format is poorly understood. It is known to control the fundamentals of how things are rendered, and in what order. It is used to link polygons to materials. The format is simply a series of command bytes followed by a variable amount of parameters. Known commands are listed below.
+
 
 +
The draw list format is poorly understood. It is known to control the fundamentals of how things are rendered, and in a specified order. It is used to link polygons to materials. The format is simply a series of command bytes followed by a variable amount of parameters. Known commands are listed below.
  
 
{| class="wikitable"
 
{| class="wikitable"
Line 121: Line 124:
 
| 0x01 || colspan=7 | None || End of commands. Keep reading until encountered.
 
| 0x01 || colspan=7 | None || End of commands. Keep reading until encountered.
 
|-
 
|-
| 0x02 || colspan=2 | Weight index || colspan=2 | Parent Weight index || colspan=3 | None || bone mapping
+
| 0x02 || colspan=2 | Weight index || colspan=2 | Parent weight index || colspan=3 | None || Bone mapping
 
|-
 
|-
| 0x03 || colspan=2 | Weight ID || Weight count || colspan=2 | Table ID || colspan=2 | weight * 4 bytes  || weighting
+
| 0x03 || colspan=2 | Weight ID || Weight count || colspan=2 | Table ID || colspan=2 | weight * 4 bytes  || Weighting
 
|-
 
|-
| 0x04 || colspan=2 | Object Index || colspan=2 | Material Index || colspan=2 | Bone index || '''Unknown''' || Draw polygon. Draws polygon  
+
| 0x04 || colspan=2 | Object index || colspan=2 | Material index || colspan=2 | Bone index || '''Unknown''' || Draw polygon. Draws polygon  
 
|-
 
|-
| 0x05 || colspan=2 | Weight ID || colspan=2 | Weight index || colspan=3 | None  || indexing
+
| 0x05 || colspan=2 | Weight ID || colspan=2 | Weight index || colspan=3 | None  || Indexing
 
|-
 
|-
 
|}
 
|}
  
=== Section 1 - Bones ===  
+
=== Section 1 - Bones ===
The bone files are used to describe the structure of polygons within the model, in order to allow animation. It is also used in [[Mario Kart Wii]] by map_model.brres to describe map placement. It is still not completely understood. <br />
+
 
The bones obey a tree structure, using the parent, first child, next child and previous child offsets to point to other bones in the tree. Most files have their first bone named the same as the entire MDL0 file, and having no transformation, and use child bones to perform transformations. 0 means no bone for these offsets.
+
The bone files are used to describe the structure of polygons within the model, in order to allow [[CHR0|character animations]]. It is also used in [[Mario Kart Wii]] by map_model.brres to describe the map placement in courses. It is still not completely understood. <br />
 +
The bones obey a tree structure, using the parent, first child, next child and previous child offsets to point to other bones in the tree. Most files have their first bone named the same as the entire MDL0 file, and having no transformation, and they use child bones to perform transformations. 0 means no bone for these offsets.
 
{| class="wikitable"
 
{| class="wikitable"
 
! Offset !! Size !! Description
 
! Offset !! Size !! Description
Line 139: Line 143:
 
| 0x00 || 4 || '''Length''' of data structure (0xD0)
 
| 0x00 || 4 || '''Length''' of data structure (0xD0)
 
|-
 
|-
| 0x04 || 4 || '''MDL0 Offset'''
+
| 0x04 || 4 || '''MDL0 offset'''
 
|-
 
|-
| 0x08 || 4 || '''Name Offset'''
+
| 0x08 || 4 || '''Name offset'''
 
|-
 
|-
 
| 0x0C || 4 || '''Index'''
 
| 0x0C || 4 || '''Index'''
Line 147: Line 151:
 
| 0x10 || 4 || '''ID'''
 
| 0x10 || 4 || '''ID'''
 
|-
 
|-
| 0x14 || 4 || '''Unknown Flags''' (0x31f typical)
+
| 0x14 || 4 || '''Unknown flags''' (0x31f typical)
 
|-
 
|-
| 0x18 || 4 || 0x0000 = Nothing, 0x0003 = Always face the Player (Y Axis)
+
| 0x18 || 4 || '''Billboard setting'''
 +
* 0x0000 = None.
 +
* 0x0001 = Influenced by rotation of the parent node. The z-axis direction is parallel to the camera lens axis.
 +
* 0x0002 = Influenced by rotation of the parent node. The z-axis direction points toward the camera direction.
 +
* 0x0003 = Not influenced by the rotation of the parent node and restricted by the camera's Up vector. The z-axis direction is parallel to the camera lens axis.
 +
* 0x0004 = Not influenced by the rotation of the parent node and restricted by the camera's Up vector. The z-axis direction points toward the camera direction.
 +
* 0x0005 = Influenced by the rotation of the parent node and rotates only around the y-axis. The z-axis direction is parallel to the camera lens axis.
 +
* 0x0006 = Influenced by the rotation of the parent node and rotates only around the y-axis. The z-axis direction points toward the camera direction.
 
|-
 
|-
 
| 0x1C || 4 || '''Padding'''
 
| 0x1C || 4 || '''Padding'''
Line 173: Line 184:
 
| 0x6C || 4 || '''Part 2''' offset
 
| 0x6C || 4 || '''Part 2''' offset
 
|-
 
|-
| 0x70 || 48 || '''Transformation Matrix''', 12 floats organized in 3 rows with 4 column values. It is a [http://en.wikipedia.org/wiki/Rotation_matrix#General_rotations clockwise/left-handed rotation with Euler angles and x-y-z convention]. A fourth matrix line is assumed to be always "0 0 0 1", but not stored. The matrix can be calculated by '''Scale''' (0x20), '''Rotation''' (0x2c) and '''Translation''' (0x38).
+
| 0x70 || 48 || '''Transformation matrix''', 12 floats organized in 3 rows with 4 column values. It is a [http://en.wikipedia.org/wiki/Rotation_matrix#General_rotations clockwise/left-handed rotation with Euler angles and x-y-z convention]. A fourth matrix line is assumed to be always "0 0 0 1", but not stored. The matrix can be calculated by '''Scale''' (0x20), '''Rotation''' (0x2c) and '''Translation''' (0x38).
  
 
All tests to modify the matrix had not any impact.
 
All tests to modify the matrix had not any impact.
 
It seems, that the matrix is calculated after loading.
 
It seems, that the matrix is calculated after loading.
 
|-
 
|-
| 0xA0 || 48 || This is the '''Inverse Matrix''' of '''Transformation Matrix''' (0x70), organized in the same way. Again, the fourth matrix line is assumed to be always "0 0 0 1" without storing the data.
+
| 0xA0 || 48 || This is the '''Inverse matrix''' of '''Transformation matrix''' (0x70), organised in the same way. Again, the fourth matrix line is assumed to be always "0 0 0 1" without storing the data.
  
 
All tests to modify the matrix had not any impact.
 
All tests to modify the matrix had not any impact.
Line 184: Line 195:
 
|-
 
|-
 
|}
 
|}
 +
 
All offsets are relative to the start of the file.
 
All offsets are relative to the start of the file.
  
=== Section 2 - Verticies ===
+
=== Section 2 - Vertices ===
The vertex sections contain information on the veritices in the model. Each polygon specifies which vertex group it is going to use, and indexes the items within.
+
 
 +
The vertex section contains information of the vertices in the model. Each polygon specifies which vertex group is it going to use, and indexes the items within.
 +
 
 
{| class="wikitable"
 
{| class="wikitable"
 
! Offset !! Size !! Description
 
! Offset !! Size !! Description
Line 193: Line 207:
 
| 0x00 || 4 || Length
 
| 0x00 || 4 || Length
 
|-
 
|-
| 0x04 || 4 || MDL0 Offset
+
| 0x04 || 4 || MDL0 offset
 
|-
 
|-
| 0x08 || 4 || Data Offset
+
| 0x08 || 4 || Data offset
 
|-
 
|-
| 0x0C || 4 || Name Offset
+
| 0x0C || 4 || Name offset
 
|-
 
|-
 
| 0x10 || 4 || Index
 
| 0x10 || 4 || Index
 
|-
 
|-
| 0x14 || 4 || Component Count
+
| 0x14 || 4 || Component count
 
{| class="wikitable"
 
{| class="wikitable"
 
! Enum !! Size !! Description
 
! Enum !! Size !! Description
 
|-  
 
|-  
| 0x0 || Format*2 || XY Position
+
| 0x0 || Format*2 || XY position
 
|-  
 
|-  
| 0x1 || Format*3 || XYZ Position
+
| 0x1 || Format*3 || XYZ position
 
|-  
 
|-  
 
|}
 
|}
Line 232: Line 246:
 
| 0x1D || 1 || Stride
 
| 0x1D || 1 || Stride
 
|-
 
|-
| 0x1E || 2 || Vertex Count
+
| 0x1E || 2 || Vertex count
 
|-
 
|-
 
| 0x20 || 12 || Minimum (float3)
 
| 0x20 || 12 || Minimum (float3)
Line 239: Line 253:
 
|-
 
|-
 
|}
 
|}
 +
 
All offsets are relative to the start of the file.<br />
 
All offsets are relative to the start of the file.<br />
After the header, at the data offset (0x40 typical) is the vertex data.
+
After the header, at the data offset (0x40 typical) there is vertex data.
  
 
=== Section 3 - Normals ===
 
=== Section 3 - Normals ===
The normal sections contain information on the normals in the model. Each polygon specifies which normal group it is going to use, and indexes the items within.
+
 
 +
The normal section contains information of the normals in the model. Each polygon specifies which normal group is it going to use, and indexes the items within.
 +
 
 
{| class="wikitable"
 
{| class="wikitable"
 
! Offset !! Size !! Description
 
! Offset !! Size !! Description
Line 249: Line 266:
 
| 0x00 || 4 || Length
 
| 0x00 || 4 || Length
 
|-
 
|-
| 0x04 || 4 || MDL0 Offset
+
| 0x04 || 4 || MDL0 offset
 
|-
 
|-
| 0x08 || 4 || Data Offset
+
| 0x08 || 4 || Data offset
 
|-
 
|-
| 0x0C || 4 || Name Offset
+
| 0x0C || 4 || Name offset
 
|-
 
|-
 
| 0x10 || 4 || Index
 
| 0x10 || 4 || Index
 
|-
 
|-
| 0x14 || 4 || Component Count
+
| 0x14 || 4 || Component count
 
{| class="wikitable"
 
{| class="wikitable"
 
! Enum !! Size !! Description
 
! Enum !! Size !! Description
Line 290: Line 307:
 
| 0x1D || 1 || Stride
 
| 0x1D || 1 || Stride
 
|-
 
|-
| 0x1E || 2 || Normal Count
+
| 0x1E || 2 || Normal count
 
|-
 
|-
 
|}
 
|}
 +
 
All offsets are relative to the start of the file.<br />
 
All offsets are relative to the start of the file.<br />
After the header, at the data offset (0x20 typical) is the normal data.
+
After the header, at the data offset (0x20 typical) there is normal data.
  
 
=== Section 4 - Colors ===
 
=== Section 4 - Colors ===
The color sections contain information on the colors in the model. Each polygon specifies which color group(s) it is going to use, and indexes the items within.
+
 
 +
The color section contains information of the colors in the model. Each polygon specifies which color group(s) is it going to use, and indexes the items within.
 +
 
 
{| class="wikitable"
 
{| class="wikitable"
 
! Offset !! Size !! Description
 
! Offset !! Size !! Description
Line 303: Line 323:
 
| 0x00 || 4 || Length
 
| 0x00 || 4 || Length
 
|-
 
|-
| 0x04 || 4 || MDL0 Offset
+
| 0x04 || 4 || MDL0 offset
 
|-
 
|-
| 0x08 || 4 || Data Offset
+
| 0x08 || 4 || Data offset
 
|-
 
|-
| 0x0C || 4 || Name Offset
+
| 0x0C || 4 || Name offset
 
|-
 
|-
 
| 0x10 || 4 || Index
 
| 0x10 || 4 || Index
 
|-
 
|-
| 0x14 || 4 || Component Count
+
| 0x14 || 4 || Component count
 
{| class="wikitable"
 
{| class="wikitable"
 
! Enum !! Size !! Description
 
! Enum !! Size !! Description
 
|-  
 
|-  
| 0x0 || Format (0, 1, or 2) || RGB Color
+
| 0x0 || Format (0, 1, or 2) || RGB color
 
|-  
 
|-  
| 0x1 || Format (3, 4, or 5) || RGBA Color
+
| 0x1 || Format (3, 4, or 5) || RGBA color
 
|-  
 
|-  
 
|}
 
|}
Line 344: Line 364:
 
| 0x1D || 1 || '''Unknown'''
 
| 0x1D || 1 || '''Unknown'''
 
|-
 
|-
| 0x1E || 2 || Color Count
+
| 0x1E || 2 || Color count
 
|-
 
|-
 
|}
 
|}
 +
 
All offsets are relative to the start of the file.<br />
 
All offsets are relative to the start of the file.<br />
After the header, at the data offset (0x20 typical) is the color data.
+
After the header, at the data offset (0x20 typical) there is color data.
 +
 
 +
=== Section 5 - Texture coordinates ===
 +
 
 +
The texture coordinate section contains information of the texture UV coordinates in the model. Each polygon specifies which texture coordinate group(s) is it going to use, and indexes the items within.
  
=== Section 5 - Texture Coordinates ===
 
The texture coordinate sections contain information on the texture coordinates in the model. Each polygon specifies which texture coordinate group(s) it is going to use, and indexes the items within.
 
 
{| class="wikitable"
 
{| class="wikitable"
 
! Offset !! Size !! Description
 
! Offset !! Size !! Description
Line 357: Line 380:
 
| 0x00 || 4 || Length
 
| 0x00 || 4 || Length
 
|-
 
|-
| 0x04 || 4 || MDL0 Offset
+
| 0x04 || 4 || MDL0 offset
 
|-
 
|-
| 0x08 || 4 || Data Offset
+
| 0x08 || 4 || Data offset
 
|-
 
|-
| 0x0C || 4 || Name Offset
+
| 0x0C || 4 || Name offset
 
|-
 
|-
 
| 0x10 || 4 || Index
 
| 0x10 || 4 || Index
 
|-
 
|-
| 0x14 || 4 || Component Count
+
| 0x14 || 4 || Component count
 
{| class="wikitable"
 
{| class="wikitable"
 
! Enum !! Size !! Description
 
! Enum !! Size !! Description
 
|-  
 
|-  
| 0x0 || Format*1 || S Coord
+
| 0x0 || Format*1 || S coord
 
|-  
 
|-  
| 0x1 || Format*2 || ST Coord
+
| 0x1 || Format*2 || ST coord
 
|-  
 
|-  
 
|}
 
|}
Line 396: Line 419:
 
| 0x1D || 1 || Stride
 
| 0x1D || 1 || Stride
 
|-
 
|-
| 0x1E || 2 || Texture Coordinate Count
+
| 0x1E || 2 || Texture coordinate count
 
|-
 
|-
 
| 0x20 || 8 || Minimum (float2)
 
| 0x20 || 8 || Minimum (float2)
Line 403: Line 426:
 
|-
 
|-
 
|}
 
|}
 +
 
All offsets are relative to the start of the file.<br />
 
All offsets are relative to the start of the file.<br />
After the header, at the data offset (0x40 typical) is the texture coordinate data.
+
After the header, at the data offset (0x40 typical) there is texture coordinate data.
  
=== Section 6 - Fur Vectors ===
+
=== Section 6 - Fur vectors ===
( seen in "smallbard.mdl0" v11 (Ridley's pre-mature form), not sure about the game it's from. )
 
  
This section is assumed to draw fur based on Vectors at specific points on the model's surface.
+
(Seen in "smallbard.mdl0" v11 (Ridley's pre-mature form) from Super Smash Bros. Brawl).
 +
 
 +
This section is assumed to draw fur bases on vectors at specific points on the model's surface.
  
 
{| class="wikitable"
 
{| class="wikitable"
Line 416: Line 441:
 
| 0x00 || 4 || Length
 
| 0x00 || 4 || Length
 
|-
 
|-
| 0x04 || 4 || MDL0 Offset
+
| 0x04 || 4 || MDL0 offset
 
|-
 
|-
| 0x08 || 4 || Data Offset
+
| 0x08 || 4 || Data offset
 
|-
 
|-
| 0x0C || 4 || Name Offset
+
| 0x0C || 4 || Name offset
 
|-
 
|-
 
| 0x10 || 4 || Index
 
| 0x10 || 4 || Index
 
|-
 
|-
| 0x14 || 2 || Texture Coordinate Count
+
| 0x14 || 2 || Texture coordinate count
 
|-
 
|-
 
| 0x16 || 10 || Padding '''(possible unknown values)'''
 
| 0x16 || 10 || Padding '''(possible unknown values)'''
Line 430: Line 455:
 
|}
 
|}
  
following this is the (float3) Vectors.
+
Following this there are (float3) vectors.
  
=== Section 7 - Fur Layers ===
+
=== Section 7 - Fur layers ===
This section is assumed to contain the shelling vectors for the Fur Vectors section which is assumed to be used to draw a line-strip from each vector.
+
 
 +
This section is assumed to contain the shelling vectors for the fur vectors section which is assumed to be used to draw a line-strip from each vector.
  
 
{| class="wikitable"
 
{| class="wikitable"
Line 440: Line 466:
 
| 0x00 || 4 || Length
 
| 0x00 || 4 || Length
 
|-
 
|-
| 0x04 || 4 || MDL0 Offset
+
| 0x04 || 4 || MDL0 offset
 
|-
 
|-
| 0x08 || 4 || Data Offset
+
| 0x08 || 4 || Data offset
 
|-
 
|-
| 0x0C || 4 || Name Offset
+
| 0x0C || 4 || Name offset
 
|-
 
|-
 
| 0x10 || 4 || Index
 
| 0x10 || 4 || Index
 
|-
 
|-
| 0x14 || 4 || Component Count
+
| 0x14 || 4 || Component count
 
|-
 
|-
 
| 0x18 || 4 || Format (data type)
 
| 0x18 || 4 || Format (data type)
Line 471: Line 497:
 
| 0x1D || 1 || Stride
 
| 0x1D || 1 || Stride
 
|-
 
|-
| 0x1E || 2 || Vector Count
+
| 0x1E || 2 || Vector count
 
|-
 
|-
 
| 0x20 || 12 || Minimum (float3)
 
| 0x20 || 12 || Minimum (float3)
Line 483: Line 509:
 
! Offset !! Size !! Description
 
! Offset !! Size !! Description
 
|-  
 
|-  
| 0x00 || 4 || Layer Count
+
| 0x00 || 4 || Layer count
 
|-  
 
|-  
| 0x04 || 4 || Layer Size
+
| 0x04 || 4 || Layer size
 
|-  
 
|-  
 
| 0x08 || 24 || Padding '''(possible unknown values)'''
 
| 0x08 || 24 || Padding '''(possible unknown values)'''
Line 491: Line 517:
 
|}
 
|}
  
Following this is the layer-vector data ( data_type * Vector_Count * Layer_Count )
+
Following this there is layer-vector data ( data_type * vector_count * layer_count )
NOTE: The Layer Size may mean there's padding in some cases.
+
NOTE: The layer's size may mean there's padding in some cases.
  
Actual tests for these fur sections have not yet been performed.
+
Actual tests for these fur sections have not been performed yet.
 +
It is unsure if the vector positioning here is local to the fur vectors (like normals), or globally oriented.
  
Not sure if the Vector positioning here is local to the Fur Vectors (like Normals), or globally oriented.
+
=== Section 8 - Materials ===
  
=== Section 8 - Materials ===
+
The material section contains information about the texturing of models. The draw list commands specify which polygons are linked to which materials.
The materials sections contain information about the texturing of models. The draw lists commands specify which polygons are linked to which materials.
 
  
The following table describes the general layout of '''MDL v11 section 8'''.
+
The following table describes the general layout of '''MDL0 v11 section 8'''.
 
All [[Mario Kart Wii]] files use exactly this layout:
 
All [[Mario Kart Wii]] files use exactly this layout:
  
Line 527: Line 553:
 
| 0x00 || 4 || Length
 
| 0x00 || 4 || Length
 
|-
 
|-
| 0x04 || 4 || MDL0 Offset
+
| 0x04 || 4 || MDL0 offset
 
|-
 
|-
| 0x08 || 4 || Name Offset
+
| 0x08 || 4 || Name offset
 
|-
 
|-
 
| 0x0C || 4 || Index (0..0x1e)
 
| 0x0C || 4 || Index (0..0x1e)
Line 537: Line 563:
 
| 0x14 || 1 || Texgens
 
| 0x14 || 1 || Texgens
 
|-
 
|-
| 0x15 || 1 || Light Channels
+
| 0x15 || 1 || Light channels
 
|-
 
|-
| 0x16 || 1 || Shader Stages
+
| 0x16 || 1 || Shader stages
 
|-
 
|-
| 0x17 || 1 || Indirect Textures
+
| 0x17 || 1 || Indirect textures
 
|-
 
|-
 
| 0x18 || 4 || Cull-mode  
 
| 0x18 || 4 || Cull-mode  
 
|-
 
|-
| 0x1C || 1 || Alpha Function
+
| 0x1C || 1 || Alpha function
 
|-
 
|-
 
| 0x1D || 1 || Lightset
 
| 0x1D || 1 || Lightset
Line 557: Line 583:
 
| 0x24 || 4 || '''Unknown''' (always 0xffffffff)
 
| 0x24 || 4 || '''Unknown''' (always 0xffffffff)
 
|-
 
|-
| 0x28 || 4 || Shader Offset
+
| 0x28 || 4 || Shader offset
 
|-
 
|-
| 0x2C || 4 || Amount of Textures
+
| 0x2C || 4 || Amount of textures
 
|-
 
|-
| 0x30 || 4 || Layer Offset
+
| 0x30 || 4 || Layer offset
 
|-
 
|-
| 0x34 || 4 || Part 2 Offset
+
| 0x34 || 4 || Part 2 offset
 
|-
 
|-
| 0x38 || 4 || Display List Offset 8_9
+
| 0x38 || 4 || Display list offset 8_9
 
|-
 
|-
| 0x3c || 4 || Display List Offset 10_11
+
| 0x3c || 4 || Display list offset 10_11
 
|-
 
|-
 
| 0x40 || 360 || '''Unknown''' (always 0)
 
| 0x40 || 360 || '''Unknown''' (always 0)
 
|-
 
|-
| 0x1a8 || 4/8*4 || 4 bit Layer Flags value; 1 for each layer with the msb containing the last layer.
+
| 0x1a8 || 4/8*4 || 4 bit layer flags value; 1 for each layer with the msb containing the last layer.
 
{| class="wikitable"
 
{| class="wikitable"
 
! Bit (lsb = 0) 2!! Description
 
! Bit (lsb = 0) 2!! Description
 
|-
 
|-
| 0 || Enable Layer
+
| 0 || Enable layer
 
|-
 
|-
| 1 || Scaling Fixed
+
| 1 || Scale fixed
 
|-
 
|-
| 2 || Rotation Fixed
+
| 2 || Rotation fixed
 
|-
 
|-
| 3 || Translation Fixed
+
| 3 || Translation fixed
 
|-  
 
|-  
 
|}
 
|}
Line 591: Line 617:
 
! Offset !! Size !! Description
 
! Offset !! Size !! Description
 
|-
 
|-
| 0x00 || 8 || float2 Coordinate Scale
+
| 0x00 || 8 || Scale coordinate (float2)
 
|-
 
|-
| 0x08 || 4 || float Coordinate Rotation
+
| 0x08 || 4 || Rotation coordinate (float)
 
|-
 
|-
| 0x0C || 8 || float2 Coordinate Translation
+
| 0x0C || 8 || Translation coordinate (float2)
 
|-  
 
|-  
 
|}
 
|}
 
|-
 
|-
| 0x250 || 52 * 8 || '''Texture Matrix''' - 8 copies of the following structure <br />
+
| 0x250 || 52 * 8 || '''Texture matrix''' - 8 copies of the following structure <br />
 
{| class="wikitable"
 
{| class="wikitable"
 
! Offset !! Size !! Description
 
! Offset !! Size !! Description
 
|-
 
|-
| 0x00 || 1 || '''Texture Unknown 1''' (0xff typical)
+
| 0x00 || 1 || '''Unknown texture 1''' (0xff typically)
 
|-
 
|-
| 0x01 || 1 || '''Texture Unknown 2''' (0xff typical)
+
| 0x01 || 1 || '''Unkown texture 2''' (0xff typically)
 
|-
 
|-
| 0x02 || 1 || '''Texture Unknown 3''' (0x0 typical)
+
| 0x02 || 1 || '''Unkown texture 3''' (0x0 typically)
 
|-
 
|-
| 0x03 || 1 || '''Texture Unknown 4''' (0x1 typical)
+
| 0x03 || 1 || '''Unknown texture 4''' (0x1 typically)
 
|-
 
|-
| 0x04 || 48 || float4x3 Texture Matrix
+
| 0x04 || 48 || float4x3 Texture matrix
 
|-  
 
|-  
 
|}
 
|}
 
|-
 
|-
| 0x3f0 || 4 || '''Unknown Flags''' (0x3f typical)
+
| 0x3f0 || 4 || '''Unknown flags''' (0x3f typically)
 
|-
 
|-
| 0x3f4 || 36 ||  '''Lightnings'''<br />
+
| 0x3f4 || 36 ||  '''Lightings'''<br />
 
{| class="wikitable"
 
{| class="wikitable"
 
! Offset !! Size !! Description
 
! Offset !! Size !! Description
Line 633: Line 659:
 
| 0x0e || 2 || Color0Enums 2 and 3
 
| 0x0e || 2 || Color0Enums 2 and 3
 
|-
 
|-
| 0x10 || 4 || '''Unknown Flags'''
+
| 0x10 || 4 || '''Unknown flags'''
 
|-
 
|-
 
| 0x14 || 4 || Color0Color 0
 
| 0x14 || 4 || Color0Color 0
Line 650: Line 676:
 
|-
 
|-
 
|}
 
|}
 +
 
All offsets are relative to the start of the file.
 
All offsets are relative to the start of the file.
  
 
==== Layers ====
 
==== Layers ====
Normally immediately after this data is the layer information. It is at the layer offset. Each lay information structure is as follows.<br />
+
 
 +
Normally immediately after this data there is layer information. It is at the layer offset. Each layer information structure is described as below.<br />
 +
 
 
{| class="wikitable"
 
{| class="wikitable"
 
! Offset !! Size !! Description
 
! Offset !! Size !! Description
 
|-
 
|-
| 0x00 || 4 || Name Offset; used as link into section 11
+
| 0x00 || 4 || Name offset; used as link into section 11
 
|-
 
|-
 
| 0x04 || 4 || '''Unknown''' (0x0 typical)
 
| 0x04 || 4 || '''Unknown''' (0x0 typical)
Line 669: Line 698:
 
| 0x14 || 4 || Layer 2
 
| 0x14 || 4 || Layer 2
 
|-  
 
|-  
| 0x18 || 4 || X Texture Address Settings
+
| 0x18 || 4 || X texture address settings
 
|-  
 
|-  
| 0x1c || 4 || Y Texture Address Settings
+
| 0x1c || 4 || Y texture address settings
 
|-
 
|-
 
| 0x20 || 4 || MinFilter, 00 05 is used to load smaller mipmaps the further ahead the texture is.
 
| 0x20 || 4 || MinFilter, 00 05 is used to load smaller mipmaps the further ahead the texture is.
Line 677: Line 706:
 
| 0x24 || 4 || MagFilter
 
| 0x24 || 4 || MagFilter
 
|-
 
|-
| 0x28 || 4 || LOD Bias
+
| 0x28 || 4 || LOD bias
 
|-
 
|-
| 0x2c || 4 || Max. Anisotropy Filtering, Can improve Texture Quality but not recommended on too many Materials. Can be 00 00 for one, 00 01 for two and 00 02 for four times Anisotropic Filtering.
+
| 0x2c || 4 || Maximum anisotropy filtering. Can improve texture quality, but not recommended to use on many materials. Can be 00 00 for one, 00 01 for two and 00 02 for four times anisotropic filtering.
 
|-
 
|-
| 0x30 || 1 || Clamp Bias, True (1) or false (0)
+
| 0x30 || 1 || Clamp bias, true (1) or false (0).
 
|-
 
|-
| 0x31 || 1 || Texel Interpolate, True (1) or False (0)
+
| 0x31 || 1 || Texel interpolate, true (1) or false (0).
 
|-
 
|-
| 0x32 || 2 || '''Unknown''' (0x0 typical)
+
| 0x32 || 2 || '''Unknown''' (0x0 typically)
 
|-  
 
|-  
 
|}
 
|}
 +
 
All offsets are relative to the start of the layer section.<br />
 
All offsets are relative to the start of the layer section.<br />
 
The X and Y texture settings values are given below.<br />
 
The X and Y texture settings values are given below.<br />
 +
 
{| class="wikitable"
 
{| class="wikitable"
 
! Settings !! Description
 
! Settings !! Description
Line 703: Line 734:
 
==== Shader ====
 
==== Shader ====
  
Always after the layer information (and padding to 0x20) is the Shader. It is directly at the Shader offset. This is [[Wii Graphics Code]] which describes how the material is created. It is broken down into four basic sections.
+
Always after the layer information (and padding to 0x20) there is shader data, directly at its offset. This is [[Wii Graphics Code]] which describes how the material is created. It is split down into four basic sections.
 +
 
 
{| class="wikitable"
 
{| class="wikitable"
 
! Offset !! Size !! Description
 
! Offset !! Size !! Description
 
|-
 
|-
| 0x000 || 0x20 || Mode Information
+
| 0x000 || 0x20 || Mode information
 
|-
 
|-
| 0x020 || 0x80 || Tev Regs
+
| 0x020 || 0x80 || Tev regs
 
|-
 
|-
| 0x0a0 || 0x40 || Texture Transformations
+
| 0x0a0 || 0x40 || Texture transformations
 
|-
 
|-
| 0x0e0 || 0xa0 || Texture Matricies
+
| 0x0e0 || 0xa0 || Texture matrices
 
|-
 
|-
| 0x180 || colspan=2 | End of Shader.
+
| 0x180 || colspan=2 | End of shader
 
|-
 
|-
 
|}
 
|}
  
 
=== Section 9 - TEV's ===
 
=== Section 9 - TEV's ===
This section has information about how the color and texture information is to be combined in the wii's GPU. Each material has a link to a TEV structure. Several materials often share the same TEV. The structure is often referenced many times in the index group too. Most large MDL0 may only have three or four structures, but many more appear in the file tree due to repeats. The repeats always ensure that each material has a structure with the same name, which it links to.
+
 
 +
This section has information about how the color and texture informations are combined in the Wii's GPU. Each material has a link to a TEV structure. Several materials often share the same TEV. The structure is often referenced many times in the index group too. Most large MDL0's may only have three or four structures, but many more appear in the file tree due to repeats. The repeats always ensure that each material has a structure with the same name, which it links to.
 +
 
 
{| class="wikitable"
 
{| class="wikitable"
 
! Offset !! Size !! Description
 
! Offset !! Size !! Description
Line 726: Line 760:
 
| 0x00 || 4 || Length  
 
| 0x00 || 4 || Length  
 
|-
 
|-
| 0x04 || 4 || MDL0 Offset
+
| 0x04 || 4 || MDL0 offset
 
|-
 
|-
 
| 0x08 || 4 || Index
 
| 0x08 || 4 || Index
 
|-
 
|-
| 0x0c || 1 || Layer Count (material flag)
+
| 0x0c || 1 || Layer count (material flag)
 
|-
 
|-
| 0x0d || 1 || Res0 (0x0 typical)
+
| 0x0d || 1 || Res0 (0x0 typically)
 
|-
 
|-
| 0x0e || 1 || Res1 (0x0 typical)
+
| 0x0e || 1 || Res1 (0x0 typically)
 
|-
 
|-
| 0x0f || 1 || Res2 (0x0 typical)
+
| 0x0f || 1 || Res2 (0x0 typically)
 
|-
 
|-
| 0x10 || 1 * 8 || [TRef0:TRef7] (0x0 typical, 0xff for unused layers)  
+
| 0x10 || 1 * 8 || [TRef0:TRef7] (0x0 typically, 0xff for unused layers)  
 
|-
 
|-
| 0x18 || 8 || Padding  
+
| 0x18 || 8 || Padding
 
|-
 
|-
 
|}
 
|}
 +
 
All offsets are relative to the start of the file.<br />
 
All offsets are relative to the start of the file.<br />
After this section follows [[Wii Graphics Code]] which describes how information is transformed into colors by the graphics card. The length of this code is Length - 0x20.
+
After this section follows [[Wii Graphics Code]], which describes how information is transformed into colors by the graphics card. The length of this code is ''Length - 0x20''.
  
 
=== Section 10 - Objects (Polygons) ===
 
=== Section 10 - Objects (Polygons) ===
 +
 
The objects section describes how vertex data is combined optionally with colors, texture coordinates and normals, as well as bones and materials in order to produce the rendered model.
 
The objects section describes how vertex data is combined optionally with colors, texture coordinates and normals, as well as bones and materials in order to produce the rendered model.
 +
 
{| class="wikitable"
 
{| class="wikitable"
 
! Offset !! Size !! Description
 
! Offset !! Size !! Description
Line 753: Line 790:
 
| 0x00 || 4 || Length
 
| 0x00 || 4 || Length
 
|-
 
|-
| 0x04 || 4 || MDL0 Offset
+
| 0x04 || 4 || MDL0 offset
 
|-
 
|-
| 0x08 || 4 || Bone Index (for single bone references) '''(-1 for table usage)'''
+
| 0x08 || 4 || Bone index (for single bone references) '''(-1 for table usage)'''
 
|-
 
|-
| 0x0c || 4 || CP_Vtx (0x4400 typical)
+
| 0x0c || 4 || CP_Vtx (0x4400 typically)
 
|-
 
|-
| 0x10 || 4 || CP_Tex (0x2 typical)
+
| 0x10 || 4 || CP_Tex (0x2 typically)
 
|-
 
|-
| 0x14 || 4 || XF_Nor_Spec (0x11 typical)
+
| 0x14 || 4 || XF_Nor_Spec (0x11 typically)
 
|-
 
|-
| 0x18 || 4 || Vertex Declaration Size (0xe0)
+
| 0x18 || 4 || Vertex declaration size (0xe0)
 
|-
 
|-
| 0x1c || 4 || '''Unknown Flags''' (0x80 typical)
+
| 0x1c || 4 || '''Unknown flags''' (0x80 typically)
 
|-
 
|-
| 0x20 || 4 || Vertex Declaration Offset (0x68 typical)
+
| 0x20 || 4 || Vertex declaration offset (0x68 typically)
 
|-
 
|-
| 0x24 || 4 || Vertex Data Size
+
| 0x24 || 4 || Vertex data size
 
|-
 
|-
| 0x28 || 4 || Vertex Data Size
+
| 0x28 || 4 || Vertex data size
 
|-
 
|-
| 0x2c || 4 || Vertex Data Offset (0x13c typical)
+
| 0x2c || 4 || Vertex data offset (0x13c typically)
 
|-
 
|-
| 0x30 || 4 || XF_Flags (0x2a00 typical)
+
| 0x30 || 4 || XF_Flags (0x2a00 typically)
 
|-
 
|-
| 0x34 || 4 || '''Unknown''' (0x0 typical)
+
| 0x34 || 4 || '''Unknown''' (0x0 typically)
 
|-
 
|-
| 0x38 || 4 || Name Offset
+
| 0x38 || 4 || Name offset
 
|-
 
|-
 
| 0x3c || 4 || Index
 
| 0x3c || 4 || Index
 
|-
 
|-
| 0x40 || 4 || Vertex Count
+
| 0x40 || 4 || Vertex count
 
|-
 
|-
| 0x44 || 4 || Face Count
+
| 0x44 || 4 || Face count
 
|-
 
|-
| 0x48 || 2 || Vertex Group Index
+
| 0x48 || 2 || Vertex group index
 
|-
 
|-
| 0x4a || 2 || Normal Group Index
+
| 0x4a || 2 || Normal group index
 
|-
 
|-
| 0x4c || 2 * 2 || 2 Color Group Indicies
+
| 0x4c || 2 * 2 || 2 color group indices
 
|-
 
|-
| 0x50 || 2 * 8 || 8 Texture Coordinate Group Indicies
+
| 0x50 || 2 * 8 || 8 texture coordinate group indices
 
|-
 
|-
| 0x60 || 4 || '''Unknown''' (-1 typical) '''(Not seen in version 9 MDL0's)'''
+
| 0x60 || 4 || '''Unknown''' (-1 typically) '''(Not seen in version 9 MDL0's)'''
 
|-
 
|-
 
| 0x64 || 4 || Bone table offset
 
| 0x64 || 4 || Bone table offset
 
|-
 
|-
 
|}
 
|}
 +
 
All offsets are relative to the start of the file, except the vertex declaration and vertex data offsets. The vertex declaration offset is relative to 0x20, itself. The vertex data offset is relative to 0x24.<br />
 
All offsets are relative to the start of the file, except the vertex declaration and vertex data offsets. The vertex declaration offset is relative to 0x20, itself. The vertex data offset is relative to 0x24.<br />
Normally directly after the header, is the bone table. It is at the bone table offset. This table is only used in objects which use multiple bones, and therefore have a -1 in their bone offset field. The use of this table is still not fully understood.
+
Normally directly after the header, there is a bone table, at its offset. This table is only used in objects which use multiple bones, and therefore have -1 value in their bone offset field. The use of this table is still not fully understood.
 +
 
 
{| class="wikitable"
 
{| class="wikitable"
 
! Offset !! Size !! Description
 
! Offset !! Size !! Description
 
|-
 
|-
| 0x00 || 4 || Entry Count
+
| 0x00 || 4 || Entry count
 
|-
 
|-
| 0x04 || 2 * Entry Count || Bone ID
+
| 0x04 || 2 * Entry count || Bone ID
 
|-
 
|-
 
|}
 
|}
After the bone table is the vertex declaration. This is [[Wii Graphics Code]] which describes the format of each vertex in the polygon. This is at the vertex declaration offset. <br/>
 
After the vertex declaration is the vertex code. This is [[Wii Graphics Code]] which describes how the model is rendered. It contains commands such as draw triangles. The indicies of the points are also here.
 
  
=== Section 11 - Texture Links ===
+
After the bone table there is vertex declaration. This is [[Wii Graphics Code]] which describes the format of each vertex in the polygon. This is at the vertex declaration offset. <br/>
 +
After the vertex declaration there is vertex code. This is [[Wii Graphics Code]] which describes how the model is rendered. It contains commands such as triange drawing. The indices of the points are also here.
 +
 
 +
=== Section 11 - Texture links ===
 +
 
 
There is one texture link section for each texture used in the model. Each section contains a table with links (offset values) into material sections. These section has no names.
 
There is one texture link section for each texture used in the model. Each section contains a table with links (offset values) into material sections. These section has no names.
 +
 
{| class="wikitable"
 
{| class="wikitable"
 
! Offset !! Size !! Description
 
! Offset !! Size !! Description
 
|-
 
|-
| 0x00 || 4 || Entry Count
+
| 0x00 || 4 || Entry count
 
|-
 
|-
| 0x04 || 8 * Entry Count || Entry count copies of the following structure <br />
+
| 0x04 || 8 * Entry count || Entry count copies of the following structure: <br />
 
{| class="wikitable"
 
{| class="wikitable"
 
! Offset !! Size !! Description
 
! Offset !! Size !! Description
Line 830: Line 872:
 
|-
 
|-
 
|}
 
|}
 +
 
All offsets are relative to the start of the file.<br />
 
All offsets are relative to the start of the file.<br />
  

Revision as of 12:20, 8 June 2016

This page describes the Mario Kart Wii MDL0 file format, as found within BRRES files.

File Format

File Header

Offset Type Description
0x00 String The magic "MDL0" to identify the sub file. See »BRRES Sub Files« for other magics.
0x04 UInt32 Length of the sub file.
0x08 UInt32 Sub file version number. The number of sections (N) is dependent of this version number. See »BRRES Sub Files« for details.
0x0C Int32 Offset to outer BRRES File.
0x10 Int32[N] N section offsets. N is implied in the version number (offset 0x08).
0x10+N*4 Int32 String offset to the name of this sub file. This name equal to the name of the entry name of the BRRES Index Group pointing to this data.
0x14+N*4 End of this header
  • All offsets are relative to the start of the header.
  • MKW uses MDL0 v11 with (N=) 14 sections.
  • The section offsets point to BRRES Index Group structures for the directories, which in turn point to the actual data sections within the MDL0 file.
  • Sections are linked by names. The names are stored in a common string pool for all BRRES sub files. MDL0 itself stores only 32-bit offsets into the common string pool.

The meaning of each section is defined by numbers as below:

Section description
0 Draw lists
1 Bones
2 Vertices
3 Normals
4 Colors
5 Texture coordinates
6 Fur vectors (seen in v10+ MDL0's)
7 Fur layers (seen in v10+ MDL0's)
8 Materials
9 TEV's (shader-like operations)
10 Objects (Polygons)
11 Texture links
12 Palette links (Not seen in Mario Kart Wii)
13 Unknown (not seen in Mario Kart Wii or v9 MDL0's)

MDL0 header

Following the section offsets there is a MDL0 header structure.

Offset Size Description
0x00 4 Header length (0x40)
0x04 4 File header offset
0x08 4 Unknown
0x0C 4 Unknown
0x10 4 Vertex count
0x14 4 Face count
0x18 4 Unknown
0x1C 4 Bone count
0x20 4 Unknown (0x01000000)
0x24 4 Bone table offset
0x28 12 Minimum (float3)
0x34 12 Maximum (float3)

All offsets are relative to the start of the header.

Bone-link table

The bone-link table usually follows directly after the MDL0 header. However, its offset also lies within the header. The table below describes how the IDs of bone sections are related to their indices. If the Wii needs a specific bone, it looks up the ID from this table, and then, it loads the bone from the index given.

Offset Size Description
0x00 4 Entry count
0x04 4 * Entry count Node index (-1 for not present)


notes:
If a model has 5 bones, and 9 weights, and bones 0 and 3 do not affect geometry the block would look like this:


00000001 00000002 00000004 FFFFFFFF
FFFFFFFF FFFFFFFF FFFFFFFF 00000000
00000003


So the weights with one bone affecting geometry come first, then the weights with multiple influences (all as 0xFFFFFFFF), and finally the weights for joints with no geometry.

The indexes in the Nodemix block will match up to the weights' position here, and the 0x10 block in a joint will be the index of its weight as it appears here (so the value of 0x10 in joint 0 above would be 0x00000007).

BRRES Index Group

Following the bone-link table, one BRRES Index Group for each non empty section is defined. The sections in the MDL0 header link to the groups.

Section formats

Section 0 - Draw Lists

The draw list format is poorly understood. It is known to control the fundamentals of how things are rendered, and in a specified order. It is used to link polygons to materials. The format is simply a series of command bytes followed by a variable amount of parameters. Known commands are listed below.

Code Parameters bytes Description
00 01 02 03 04 05 06
0x01 None End of commands. Keep reading until encountered.
0x02 Weight index Parent weight index None Bone mapping
0x03 Weight ID Weight count Table ID weight * 4 bytes Weighting
0x04 Object index Material index Bone index Unknown Draw polygon. Draws polygon
0x05 Weight ID Weight index None Indexing

Section 1 - Bones

The bone files are used to describe the structure of polygons within the model, in order to allow character animations. It is also used in Mario Kart Wii by map_model.brres to describe the map placement in courses. It is still not completely understood.
The bones obey a tree structure, using the parent, first child, next child and previous child offsets to point to other bones in the tree. Most files have their first bone named the same as the entire MDL0 file, and having no transformation, and they use child bones to perform transformations. 0 means no bone for these offsets.

Offset Size Description
0x00 4 Length of data structure (0xD0)
0x04 4 MDL0 offset
0x08 4 Name offset
0x0C 4 Index
0x10 4 ID
0x14 4 Unknown flags (0x31f typical)
0x18 4 Billboard setting
  • 0x0000 = None.
  • 0x0001 = Influenced by rotation of the parent node. The z-axis direction is parallel to the camera lens axis.
  • 0x0002 = Influenced by rotation of the parent node. The z-axis direction points toward the camera direction.
  • 0x0003 = Not influenced by the rotation of the parent node and restricted by the camera's Up vector. The z-axis direction is parallel to the camera lens axis.
  • 0x0004 = Not influenced by the rotation of the parent node and restricted by the camera's Up vector. The z-axis direction points toward the camera direction.
  • 0x0005 = Influenced by the rotation of the parent node and rotates only around the y-axis. The z-axis direction is parallel to the camera lens axis.
  • 0x0006 = Influenced by the rotation of the parent node and rotates only around the y-axis. The z-axis direction points toward the camera direction.
0x1C 4 Padding
0x20 12 A 3D scaling vector (float3).
0x2C 12 A 3D rotation vector (float3, Euler rotation in degree).
0x38 12 A 3D translation vector (float3).
0x44 12 Minimum (float3), not always set.
0x50 12 Maximum (float3), not always set.
0x5C 4 Parent offset
0x60 4 First Child offset
0x64 4 Next Sibling offset
0x68 4 Previous Sibling offset
0x6C 4 Part 2 offset
0x70 48 Transformation matrix, 12 floats organized in 3 rows with 4 column values. It is a clockwise/left-handed rotation with Euler angles and x-y-z convention. A fourth matrix line is assumed to be always "0 0 0 1", but not stored. The matrix can be calculated by Scale (0x20), Rotation (0x2c) and Translation (0x38).

All tests to modify the matrix had not any impact. It seems, that the matrix is calculated after loading.

0xA0 48 This is the Inverse matrix of Transformation matrix (0x70), organised in the same way. Again, the fourth matrix line is assumed to be always "0 0 0 1" without storing the data.

All tests to modify the matrix had not any impact. It seems, that the matrix is calculated after loading.

All offsets are relative to the start of the file.

Section 2 - Vertices

The vertex section contains information of the vertices in the model. Each polygon specifies which vertex group is it going to use, and indexes the items within.

Offset Size Description
0x00 4 Length
0x04 4 MDL0 offset
0x08 4 Data offset
0x0C 4 Name offset
0x10 4 Index
0x14 4 Component count
Enum Size Description
0x0 Format*2 XY position
0x1 Format*3 XYZ position
0x18 4 Format (data type)
Format Stride Description
0x0 0x3 u8
0x1 0x3 s8
0x2 0x6 u16
0x3 0x6 s16
0x4 0xc float

For all formats except float, the value is divided by 2 ^ divisor.

0x1C 1 Divisor
0x1D 1 Stride
0x1E 2 Vertex count
0x20 12 Minimum (float3)
0x2C 12 Maximum (float3)

All offsets are relative to the start of the file.
After the header, at the data offset (0x40 typical) there is vertex data.

Section 3 - Normals

The normal section contains information of the normals in the model. Each polygon specifies which normal group is it going to use, and indexes the items within.

Offset Size Description
0x00 4 Length
0x04 4 MDL0 offset
0x08 4 Data offset
0x0C 4 Name offset
0x10 4 Index
0x14 4 Component count
Enum Size Description
0x0 Format*3 Normal
0x1 Format*9 Normal Bi-normal Tangent
0x2 Format*3 Normal or Bi-normal or Tangent
0x18 4 Format (data type)
Format Stride Description
0x0 0x3 u8
0x1 0x3 s8
0x2 0x6 u16
0x3 0x6 s16
0x4 0xc float

For all formats except float, the value is divided by 2 ^ divisor.

0x1C 1 Divisor
0x1D 1 Stride
0x1E 2 Normal count

All offsets are relative to the start of the file.
After the header, at the data offset (0x20 typical) there is normal data.

Section 4 - Colors

The color section contains information of the colors in the model. Each polygon specifies which color group(s) is it going to use, and indexes the items within.

Offset Size Description
0x00 4 Length
0x04 4 MDL0 offset
0x08 4 Data offset
0x0C 4 Name offset
0x10 4 Index
0x14 4 Component count
Enum Size Description
0x0 Format (0, 1, or 2) RGB color
0x1 Format (3, 4, or 5) RGBA color

Both component types can range in byte sizes from 2 to 4.

0x18 4 Format
Format Stride Description
0x0 0x2 RGB565
0x1 0x3 RGB8 (RGB24)
0x2 0x4 RGBX8 (RGBX32) X values discarded.
0x3 0x2 RGBA4 (RGBA16)
0x4 0x3 RGBA6 (RGBA24)
0x5 0x4 RGBA8 (RGBA32)
0x1C 1 Stride
0x1D 1 Unknown
0x1E 2 Color count

All offsets are relative to the start of the file.
After the header, at the data offset (0x20 typical) there is color data.

Section 5 - Texture coordinates

The texture coordinate section contains information of the texture UV coordinates in the model. Each polygon specifies which texture coordinate group(s) is it going to use, and indexes the items within.

Offset Size Description
0x00 4 Length
0x04 4 MDL0 offset
0x08 4 Data offset
0x0C 4 Name offset
0x10 4 Index
0x14 4 Component count
Enum Size Description
0x0 Format*1 S coord
0x1 Format*2 ST coord
0x18 4 Format (data type)
Format Stride Description
0x0 0x2 u8
0x1 0x2 s8
0x2 0x4 u16
0x3 0x4 s16
0x4 0x8 float

For all formats except float, the value is divided by 2 ^ divisor.

0x1C 1 Divisor
0x1D 1 Stride
0x1E 2 Texture coordinate count
0x20 8 Minimum (float2)
0x28 8 Maximum (float2)

All offsets are relative to the start of the file.
After the header, at the data offset (0x40 typical) there is texture coordinate data.

Section 6 - Fur vectors

(Seen in "smallbard.mdl0" v11 (Ridley's pre-mature form) from Super Smash Bros. Brawl).

This section is assumed to draw fur bases on vectors at specific points on the model's surface.

Offset Size Description
0x00 4 Length
0x04 4 MDL0 offset
0x08 4 Data offset
0x0C 4 Name offset
0x10 4 Index
0x14 2 Texture coordinate count
0x16 10 Padding (possible unknown values)

Following this there are (float3) vectors.

Section 7 - Fur layers

This section is assumed to contain the shelling vectors for the fur vectors section which is assumed to be used to draw a line-strip from each vector.

Offset Size Description
0x00 4 Length
0x04 4 MDL0 offset
0x08 4 Data offset
0x0C 4 Name offset
0x10 4 Index
0x14 4 Component count
0x18 4 Format (data type)
Format Stride Description
0x0 0x2 u8
0x1 0x2 s8
0x2 0x4 u16
0x3 0x4 s16
0x4 0x8 float

For all formats except float, the value is divided by 2 ^ divisor.

0x1C 1 Divisor
0x1D 1 Stride
0x1E 2 Vector count
0x20 12 Minimum (float3)
0x2C 12 Maximum (float3)

Layering info:

Offset Size Description
0x00 4 Layer count
0x04 4 Layer size
0x08 24 Padding (possible unknown values)

Following this there is layer-vector data ( data_type * vector_count * layer_count ) NOTE: The layer's size may mean there's padding in some cases.

Actual tests for these fur sections have not been performed yet. It is unsure if the vector positioning here is local to the fur vectors (like normals), or globally oriented.

Section 8 - Materials

The material section contains information about the texturing of models. The draw list commands specify which polygons are linked to which materials.

The following table describes the general layout of MDL0 v11 section 8. All Mario Kart Wii files use exactly this layout:

Size Description
0x418 Basic data structure. The first 32 bit value is the size of the complete section.
N * 0x34 N * layer data. N is a 32 bit number in the range 0 to 6 read from 'base+0x2c'. The start offset is stored at 'base+0x30' and is 0 (if N is 0) or 0x418 for all Mario Kart Wii files.
0..0x1c Alignment to a multiple of 0x20 (relative to MDL file start) for the next field.
0x180 Setup Code. The start offset is stored at 'base+0x3c'.

Basic data structure

Offset Size Description
0x00 4 Length
0x04 4 MDL0 offset
0x08 4 Name offset
0x0C 4 Index (0..0x1e)
0x10 4 XLU-Material (0x0 for disabled or 0x80000000 for enabled)
0x14 1 Texgens
0x15 1 Light channels
0x16 1 Shader stages
0x17 1 Indirect textures
0x18 4 Cull-mode
0x1C 1 Alpha function
0x1D 1 Lightset
0x1E 1 Fogset
0x1F 1 Unknown (always 0)
0x20 4 Unknown (always 0)
0x24 4 Unknown (always 0xffffffff)
0x28 4 Shader offset
0x2C 4 Amount of textures
0x30 4 Layer offset
0x34 4 Part 2 offset
0x38 4 Display list offset 8_9
0x3c 4 Display list offset 10_11
0x40 360 Unknown (always 0)
0x1a8 4/8*4 4 bit layer flags value; 1 for each layer with the msb containing the last layer.
Bit (lsb = 0) 2 Description
0 Enable layer
1 Scale fixed
2 Rotation fixed
3 Translation fixed
0x1ac 4 Unknown Flags
0x1b0 20 * 8 8 copies of the following structure
Offset Size Description
0x00 8 Scale coordinate (float2)
0x08 4 Rotation coordinate (float)
0x0C 8 Translation coordinate (float2)
0x250 52 * 8 Texture matrix - 8 copies of the following structure
Offset Size Description
0x00 1 Unknown texture 1 (0xff typically)
0x01 1 Unkown texture 2 (0xff typically)
0x02 1 Unkown texture 3 (0x0 typically)
0x03 1 Unknown texture 4 (0x1 typically)
0x04 48 float4x3 Texture matrix
0x3f0 4 Unknown flags (0x3f typically)
0x3f4 36 Lightings
Offset Size Description
0x00 4 Color0Color 0
0x04 4 Color0Color 1
0x08 2 Padding
0x0a 2 Color0Enums 0 and 1
0x0c 2 Padding
0x0e 2 Color0Enums 2 and 3
0x10 4 Unknown flags
0x14 4 Color0Color 0
0x18 4 Color0Color 1
0x1c 2 Padding
0x1e 2 Color0Enums 0 and 1
0x20 2 Padding
0x22 2 Color0Enums 2 and 3

All offsets are relative to the start of the file.

Layers

Normally immediately after this data there is layer information. It is at the layer offset. Each layer information structure is described as below.

Offset Size Description
0x00 4 Name offset; used as link into section 11
0x04 4 Unknown (0x0 typical)
0x08 4 Unknown (0x0 typical)
0x0c 4 Unknown (0x0 typical)
0x10 4 Layer 1
0x14 4 Layer 2
0x18 4 X texture address settings
0x1c 4 Y texture address settings
0x20 4 MinFilter, 00 05 is used to load smaller mipmaps the further ahead the texture is.
0x24 4 MagFilter
0x28 4 LOD bias
0x2c 4 Maximum anisotropy filtering. Can improve texture quality, but not recommended to use on many materials. Can be 00 00 for one, 00 01 for two and 00 02 for four times anisotropic filtering.
0x30 1 Clamp bias, true (1) or false (0).
0x31 1 Texel interpolate, true (1) or false (0).
0x32 2 Unknown (0x0 typically)

All offsets are relative to the start of the layer section.
The X and Y texture settings values are given below.

Settings Description
0x0 Clamp
0x1 Repeat
0x2 Mirror

Shader

Always after the layer information (and padding to 0x20) there is shader data, directly at its offset. This is Wii Graphics Code which describes how the material is created. It is split down into four basic sections.

Offset Size Description
0x000 0x20 Mode information
0x020 0x80 Tev regs
0x0a0 0x40 Texture transformations
0x0e0 0xa0 Texture matrices
0x180 End of shader

Section 9 - TEV's

This section has information about how the color and texture informations are combined in the Wii's GPU. Each material has a link to a TEV structure. Several materials often share the same TEV. The structure is often referenced many times in the index group too. Most large MDL0's may only have three or four structures, but many more appear in the file tree due to repeats. The repeats always ensure that each material has a structure with the same name, which it links to.

Offset Size Description
0x00 4 Length
0x04 4 MDL0 offset
0x08 4 Index
0x0c 1 Layer count (material flag)
0x0d 1 Res0 (0x0 typically)
0x0e 1 Res1 (0x0 typically)
0x0f 1 Res2 (0x0 typically)
0x10 1 * 8 [TRef0:TRef7] (0x0 typically, 0xff for unused layers)
0x18 8 Padding

All offsets are relative to the start of the file.
After this section follows Wii Graphics Code, which describes how information is transformed into colors by the graphics card. The length of this code is Length - 0x20.

Section 10 - Objects (Polygons)

The objects section describes how vertex data is combined optionally with colors, texture coordinates and normals, as well as bones and materials in order to produce the rendered model.

Offset Size Description
0x00 4 Length
0x04 4 MDL0 offset
0x08 4 Bone index (for single bone references) (-1 for table usage)
0x0c 4 CP_Vtx (0x4400 typically)
0x10 4 CP_Tex (0x2 typically)
0x14 4 XF_Nor_Spec (0x11 typically)
0x18 4 Vertex declaration size (0xe0)
0x1c 4 Unknown flags (0x80 typically)
0x20 4 Vertex declaration offset (0x68 typically)
0x24 4 Vertex data size
0x28 4 Vertex data size
0x2c 4 Vertex data offset (0x13c typically)
0x30 4 XF_Flags (0x2a00 typically)
0x34 4 Unknown (0x0 typically)
0x38 4 Name offset
0x3c 4 Index
0x40 4 Vertex count
0x44 4 Face count
0x48 2 Vertex group index
0x4a 2 Normal group index
0x4c 2 * 2 2 color group indices
0x50 2 * 8 8 texture coordinate group indices
0x60 4 Unknown (-1 typically) (Not seen in version 9 MDL0's)
0x64 4 Bone table offset

All offsets are relative to the start of the file, except the vertex declaration and vertex data offsets. The vertex declaration offset is relative to 0x20, itself. The vertex data offset is relative to 0x24.
Normally directly after the header, there is a bone table, at its offset. This table is only used in objects which use multiple bones, and therefore have -1 value in their bone offset field. The use of this table is still not fully understood.

Offset Size Description
0x00 4 Entry count
0x04 2 * Entry count Bone ID

After the bone table there is vertex declaration. This is Wii Graphics Code which describes the format of each vertex in the polygon. This is at the vertex declaration offset.
After the vertex declaration there is vertex code. This is Wii Graphics Code which describes how the model is rendered. It contains commands such as triange drawing. The indices of the points are also here.

Section 11 - Texture links

There is one texture link section for each texture used in the model. Each section contains a table with links (offset values) into material sections. These section has no names.

Offset Size Description
0x00 4 Entry count
0x04 8 * Entry count Entry count copies of the following structure:
Offset Size Description
0x00 4 Offset relative to section start into a material section (#8).
0x04 4 Offset relative to section start into a material layer. The layer is part of the material section above.

All offsets are relative to the start of the file.


All about BRRES files

BRRES fileIndex GroupSub Files

CHR0CLR0MDL0PAT0SCN0SHP0SRT0TEX0