MDL0 (File Format)
Overview
This article 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.
- Mario Kart Wii 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 | User Data. 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 | UInt32 | Header length (0x40). | ||||||||
0x04 | Int32 | File header offset. | ||||||||
0x08 | UInt32 | Scaling Mode
| ||||||||
0x0C | UInt32 | Texture Matrix Mode
| ||||||||
0x10 | Int32 | Vertex count. | ||||||||
0x14 | Int32 | Face count. | ||||||||
0x18 | Int32 | Unused. Offset to absolute path of intermediate file. | ||||||||
0x1C | UInt32 | Matricies count. | ||||||||
0x20 | Byte | Requires normalized matricies array if not 0. | ||||||||
0x21 | Byte | Requires texture matrices array if not 0. | ||||||||
0x22 | Byte | Enable bounding volume data if not 0. | ||||||||
0x23 | Byte | Unknown. Padding? | ||||||||
0x24 | Int32 | Offset to matricies table. | ||||||||
0x28 | Float[3] | Bounding volume minimum. | ||||||||
0x34 | Float[3] | Bounding volume maximum. |
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 game needs a specific bone, it looks up the ID from this table, and then loads the bone from the index given.
Offset | Size | Description |
---|---|---|
0x00 | 4 | Entry count. |
0x04 | 4 * Entry count | Node index (-1 if not present). |
If a model has five bones and nine 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
The weights that have one bone affecting geometry come first, then the ones with multiple influences (all as 0xFFFFFFFF), and finally, the weights for joints with no geometry.
The indices 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 Order
In Mario Kart Wii, we can find some old and unused v8 MDL0 files (old_mario_gc_*.szs; 11 sections) and v11 (the rest of them; 14 sections).
The v8 MDL0 files use sections 0–9, but not 10. The general section order is: 9, 0, 1, 6, 7, 8, 2, 3, 4, 5.
All the v11 ones use sections 0–5 and 8–11, but not 6, 7, 12 and 13. The general order here is 11, 0, 1, 8, 9, 10, 2, 3, 4, 5.
If creating a new v11 MDL0 file, it is recommended to use this section order: 11, 0, 1, 6, 7, 8, 9, 10, 2, 3, 4, 5. The order of sections 12 and 13 is unknown.
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 | Length | Parameters bytes | Description | ||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | |||
0x00 | 0x1 | None | No operation. | ||||||||
0x01 | 0x1 | None | End of commands. Keep reading until encountered. | ||||||||
0x02 | 0x5 | Bone index | Parent matrix index | None | Node mapping. | ||||||
0x03 | 0x4+0x6*N | Weight ID | N + Weight count | Table ID | N * Weight | Weighting. | |||||
0x04 | 0x8 | Object index | Material index | Bone index | Priority | None | Draw polygon. | ||||
0x05 | 0x5 | Matrix ID | Weight index | None | Indexing. | ||||||
0x06 | 0x5 | To matrix | From matrix | None | Duplicate matrix. |
Section 1 - Bones
The bone files are used to describe the structure of polygons within the model, in order to allow CHR0 animations. It is also used in Mario Kart Wii by map_model.brres to describe the map placement in courses.
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. 0 means no bone for these offsets.
Offset | Size | Description | ||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x00 | UInt32 | Length of data structure (0xD0). | ||||||||||||||||||||||||||||||||||||
0x04 | Int32 | MDL0 offset. | ||||||||||||||||||||||||||||||||||||
0x08 | Int32 | Name offset. | ||||||||||||||||||||||||||||||||||||
0x0C | UInt32 | Index. | ||||||||||||||||||||||||||||||||||||
0x10 | UInt32 | ID. | ||||||||||||||||||||||||||||||||||||
0x14 | UInt32 | Flags.
| ||||||||||||||||||||||||||||||||||||
0x18 | UInt32 | Billboard setting.
| ||||||||||||||||||||||||||||||||||||
0x1C | UInt32 | Billboard transformation of this bone if parent is a Billboard bone. | ||||||||||||||||||||||||||||||||||||
0x20 | Float[3] | A 3D scaling vector | ||||||||||||||||||||||||||||||||||||
0x2C | Float[3] | A 3D rotation vector (in degrees). | ||||||||||||||||||||||||||||||||||||
0x38 | Float[3] | A 3D translation vector. | ||||||||||||||||||||||||||||||||||||
0x44 | Float[3] | Bounding volume minimum. | ||||||||||||||||||||||||||||||||||||
0x50 | Float[3] | Bounding volume maximum. | ||||||||||||||||||||||||||||||||||||
0x5C | Int32 | Parent offset. | ||||||||||||||||||||||||||||||||||||
0x60 | Int32 | First Child offset. | ||||||||||||||||||||||||||||||||||||
0x64 | Int32 | Next Sibling offset. | ||||||||||||||||||||||||||||||||||||
0x68 | Int32 | Previous Sibling offset. | ||||||||||||||||||||||||||||||||||||
0x6C | Int32 | User Data offset. | ||||||||||||||||||||||||||||||||||||
0x70 | MTX34 | Transformation matrix, 12 floats organized in 3 rows with 4 column values. It is a clockwise Rotation matrix with Euler angles and x-y-z convention. A fourth matrix line is assumed to always be "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 did not have any impact. It seems, that the matrix is calculated after loading. | ||||||||||||||||||||||||||||||||||||
0xA0 | MTX34 | This is the Inverse matrix of Transformation matrix (0x70), organised in the same way. Again, the fourth matrix line is assumed to always be "0 0 0 1" without storing the data.
All tests to modify the matrix did not have 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 | UInt32 | Length. | ||||||||||||||||||
0x04 | Int32 | MDL0 offset. | ||||||||||||||||||
0x08 | Int32 | Data offset. | ||||||||||||||||||
0x0C | Int32 | Name offset. | ||||||||||||||||||
0x10 | UInt32 | Index. | ||||||||||||||||||
0x14 | UInt32 | Component count.
| ||||||||||||||||||
0x18 | UInt32 | Format (data type):
For all formats except float, the value is divided by 2 ^ divisor. | ||||||||||||||||||
0x1C | Byte | Divisor. | ||||||||||||||||||
0x1D | Byte | Stride. | ||||||||||||||||||
0x1E | UInt16 | Vertex count. | ||||||||||||||||||
0x20 | Float[3] | Bounding volume minimum. | ||||||||||||||||||
0x2C | Float[3] | Bounding volume maximum. |
All offsets are relative to the start of the file.
After the header, at the data offset (0x40 typically) 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 | UInt32 | Length. | ||||||||||||||||||
0x04 | Int32 | MDL0 offset. | ||||||||||||||||||
0x08 | Int32 | Data offset. | ||||||||||||||||||
0x0C | Int32 | Name offset. | ||||||||||||||||||
0x10 | UInt32 | Index. | ||||||||||||||||||
0x14 | UInt32 | Component count.
| ||||||||||||||||||
0x18 | UInt32 | Format (data type):
For all formats except float, the value is divided by 2 ^ divisor. | ||||||||||||||||||
0x1C | Byte | Divisor. | ||||||||||||||||||
0x1D | Byte | Stride. | ||||||||||||||||||
0x1E | Uint16 | Normal count. |
All offsets are relative to the start of the file. After the header at the data offset (0x20 typically) 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 | UInt32 | Length. | |||||||||||||||||||||||||||||||||||||||||||||||||
0x04 | Int32 | MDL0 offset. | |||||||||||||||||||||||||||||||||||||||||||||||||
0x08 | Int32 | Data offset. | |||||||||||||||||||||||||||||||||||||||||||||||||
0x0C | Int32 | Name offset. | |||||||||||||||||||||||||||||||||||||||||||||||||
0x10 | UInt32 | Index. | |||||||||||||||||||||||||||||||||||||||||||||||||
0x14 | UInt32 | Component count.
Both component types can range in byte sizes from 2 to 4. | |||||||||||||||||||||||||||||||||||||||||||||||||
0x18 | UInt32 | Format
| |||||||||||||||||||||||||||||||||||||||||||||||||
0x1C | Byte | Stride. | |||||||||||||||||||||||||||||||||||||||||||||||||
0x1D | Byte | Padding. | |||||||||||||||||||||||||||||||||||||||||||||||||
0x1E | UInt16 | Color count. |
All offsets are relative to the start of the file. After the header at the data offset (0x20 typically) 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 | UInt32 | Length. | ||||||||||||||||||
0x04 | Int32 | MDL0 offset. | ||||||||||||||||||
0x08 | Int32 | Data offset. | ||||||||||||||||||
0x0C | Int32 | Name offset. | ||||||||||||||||||
0x10 | UInt32 | Index. | ||||||||||||||||||
0x14 | UInt32 | Component count.
| ||||||||||||||||||
0x18 | UInt32 | Format (data type):
For all formats except float, the value is divided by 2 ^ divisor. | ||||||||||||||||||
0x1C | Byte | Divisor. | ||||||||||||||||||
0x1D | Byte | Stride. | ||||||||||||||||||
0x1E | UInt16 | Texture coordinate count. | ||||||||||||||||||
0x20 | Float[2] | Bounding volume minimum. | ||||||||||||||||||
0x28 | Float[2] | Bounding volume maximum. |
All offsets are relative to the start of the file. After the header at the data offset (0x40 typically) 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 | UInt32 | Length. |
0x04 | Int32 | MDL0 offset. |
0x08 | Int32 | Data offset. |
0x0C | Int32 | Name offset. |
0x10 | UInt32 | Index. |
0x14 | UInt32 | Fur Vector count. |
Following this, there are (float3) vectors.
Section 7 - Fur Layer Positions
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 | UInt32 | Length. | ||||||||||||||||||
0x04 | Int32 | MDL0 offset. | ||||||||||||||||||
0x08 | Int32 | Data offset. | ||||||||||||||||||
0x0C | Int32 | Name offset. | ||||||||||||||||||
0x10 | UInt32 | Index. | ||||||||||||||||||
0x14 | UInt32 | Component count.
| ||||||||||||||||||
0x18 | UInt32 | Format (data type):
For all formats except float, the value is divided by 2 ^ divisor. | ||||||||||||||||||
0x1C | Byte | Divisor. | ||||||||||||||||||
0x1D | Byte | Stride. | ||||||||||||||||||
0x1E | UInt16 | Vertex Count in fur layer. | ||||||||||||||||||
0x20 | UInt32 | Number of fur layers. | ||||||||||||||||||
0x24 | UInt32 | Offset to fur layer. |
Following this there is layer-vector data (data_type * vector_count * layer_count). The layer's size may mean there is 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 | UInt32 | Length. | ||||||||||||||||||||||||||||||||
0x04 | Int32 | MDL0 offset. | ||||||||||||||||||||||||||||||||
0x08 | Int32 | Name offset. | ||||||||||||||||||||||||||||||||
0x0C | UInt32 | Index. | ||||||||||||||||||||||||||||||||
0x10 | UInt32 | Material Flags. Axxxxxxx xxxxxxxx xxxxxxxx BCDEFGHI.
| ||||||||||||||||||||||||||||||||
0x14 | Byte | Texgens. | ||||||||||||||||||||||||||||||||
0x15 | Byte | Light channels. | ||||||||||||||||||||||||||||||||
0x16 | Byte | Shader stages. | ||||||||||||||||||||||||||||||||
0x17 | Byte | Indirect textures. | ||||||||||||||||||||||||||||||||
0x18 | UInt32 | Culling.
| ||||||||||||||||||||||||||||||||
0x1C | Byte | Depth test. | ||||||||||||||||||||||||||||||||
0x1D | Byte | Lightset Index. | ||||||||||||||||||||||||||||||||
0x1E | Byte | Fog Index. | ||||||||||||||||||||||||||||||||
0x1F | Byte | Padding. | ||||||||||||||||||||||||||||||||
0x20 | Byte[4] | Indirect Method.
| ||||||||||||||||||||||||||||||||
0x24 | Byte[4] | Light normal map reference, used by indirect stages. | ||||||||||||||||||||||||||||||||
0x28 | Int32 | Shader offset. | ||||||||||||||||||||||||||||||||
0x2C | UInt32 | Amount of textures. | ||||||||||||||||||||||||||||||||
0x30 | Int32 | Layer offset. | ||||||||||||||||||||||||||||||||
0x34 | Int32 | Fur data offset. (version 10 and 11 MDL0s). User Data (version 8 and 9 MDL0s). | ||||||||||||||||||||||||||||||||
0x38 | Int32 | Display list offset (version 8 and 9 MDL0s). User Data (version 10 and 11 MDL0s). | ||||||||||||||||||||||||||||||||
0x3c | Int32 | Display list offset (version 10 and 11 MDL0s). | ||||||||||||||||||||||||||||||||
0x40 | UInt32 | Bitflag. Used texture maps. Bit 0 (LSB) means texture map 0 is used, bit 1 - texture map 1 etc. | ||||||||||||||||||||||||||||||||
0x44 | Byte[8][32] | Precompiled code space containing texture information. | ||||||||||||||||||||||||||||||||
0x144 | UInt32 | Bitflag. Used palletes. Bit 0 (LSB) means pallete 0 is used, bit 1 - pallete 1 etc. | ||||||||||||||||||||||||||||||||
0x148 | Byte[8][12] | Precompiled code space containing palette information. | ||||||||||||||||||||||||||||||||
0x1a8 | UInt32 | Bit flag.
| ||||||||||||||||||||||||||||||||
0x1ac | UInt32 | Texture matrix mode
| ||||||||||||||||||||||||||||||||
0x1b0 | 20 * 8 | 8 copies of the following structure:
| ||||||||||||||||||||||||||||||||
0x250 | 52 * 8 | Texture matrix - 8 copies of the following structure:
| ||||||||||||||||||||||||||||||||
0x3f0 | 20 * 2 | Lighting channels:
|
All offsets are relative to the start of the file.
Texture References
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 | Int32 | Name offset, used as link into section 11. | ||||||||||||||
0x04 | Int32 | Palette name offset, used as link into section 12. | ||||||||||||||
0x08 | Int32 | Texture data offset.* 0x0 typically. | ||||||||||||||
0x0c | Int32 | Palette data offset.* 0x0 typically. | ||||||||||||||
0x10 | UInt32 | Texture data ID, indexes an entry in the texture information list. | ||||||||||||||
0x14 | UInt32 | Palette data ID, indexes an entry in the palette information list. | ||||||||||||||
0x18 | UInt32 | U texture wrapping mode. | ||||||||||||||
0x1c | UInt32 | V texture wrapping mode. | ||||||||||||||
0x20 | UInt32 | Minification texture filtering.
| ||||||||||||||
0x24 | UInt32 | Magnification texture filtering.
| ||||||||||||||
0x28 | Float | LOD bias. | ||||||||||||||
0x2c | UInt32 | Max Anisotropy filtering. Can improve texture quality, but not recommended to use on many materials.
| ||||||||||||||
0x30 | Byte | Clamp bias. | ||||||||||||||
0x31 | Byte | Texel interpolate. | ||||||||||||||
0x32 | Byte[2] | Padding. |
- These offsets are calculated by the game during track load, whether or not non-zero values are kept is unknown.
Wrapping modes
Settings | Description |
---|---|
0x0 | Clamp. |
0x1 | Repeat. |
0x2 | Mirror. |
Fur Data
This section appears right after the texture references only if a material uses fur.
Offset | Type | Description | ||||||
---|---|---|---|---|---|---|---|---|
0x00 | Float | Maximum length to which fur can grow. | ||||||
0x04 | UInt32 | Number of fur layers. | ||||||
0x08 | UInt32 | Type of spacing between fur layers.
| ||||||
0x0C | Float | Alpha curvature parameter. | ||||||
0x10 | Float | Specular lighting curvature parameter. |
Shader
After the layer information (and padding to 0x20), there is always shader data directly at its offset. This is the 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 color regs. |
0x0a0 | 0x40 | Indirect texture transformations. |
0x0e0 | 0xa0 | Texture matrices. |
0x180 | End of shader. |
Section 9 - TEVs
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 | UInt32 | Length. |
0x04 | Int32 | MDL0 offset. |
0x08 | Int32 | Index. |
0x0C | Byte | TEV Stage Count. |
0x0d | Byte[3] | Padding. |
0x10 | Byte[8] | [TexScale0:TexScale7] (0xff for unused references). Indices to a material layer. |
0x18 | Byte[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. Normally those commands control color and alpha blending, indirect texture mapping and color channel swapping.
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 a value of -1 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 the 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 also the Wii Graphics Code, which describes how the model is rendered. It contains commands such as triangle 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 sections have no names.
Offset | Size | Description | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
0x00 | 4 | Entry count. | |||||||||
0x04 | 8 * Entry count | Entry count copies of the following structure:
|
Section 12 - Palette Links
There is one palette link section for each palette used in the model. Each section contains a table with links (offset values) into material sections. These sections also have no names.
Offset | Size | Description | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
0x00 | 4 | Entry count. | |||||||||
0x04 | 8 * Entry count | Entry count copies of the following structure:
|
All offsets are relative to the start of the file.
Tools
The following tools can handle MDL0 files:
- BrawlBox, by Kryal & BlackJax.
- BrawlCrate, by soopercool101.
- CTools, by Chadderz.
- SZS Modifier, by Chadderz.
- Wiimms SZS Tools, by Wiimm.