CMDL (Tropical Freeze)

From Retro Modding Wiki
Revision as of 13:12, 9 May 2016 by >Aruki
Jump to navigation Jump to search

See CMDL (File Format) for the other revisions of this format.

The CMDL, SMDL, and WMDL format are Tropical Freeze's three model formats; CMDL is a generic model format, SMDL is for skinned models, and WMDL is for world (terrain) models. All three are the same basic format, with SMDL and WMDL each containing an extra data section at the start of the file. With the Wii U's graphics system being updated from GX to GX2, the Retro model format has been dramatically overhauled, bearing little to no resemblance to the previous CMDL format found in DKCR and the Prime series.


This file format needs more research
There's still a lot of unknown data. The entire optional section at the end of HEAD is completely unknown to me and there's lots of scattered unknown values.


Format

After the RFRM Header, the first section of the file is SKHD in SMDL, and WDHD in WMDL. Following those extra sections, all three formats start with a header.

HEAD

Offset Size Description
0x0 24 "HEAD" Chunk Descriptor
0x18 4 Unknown
0x1C 4 Unknown
0x20 4 Unknown
0x24 4 Unknown
0x28 4 Unknown
0x2C 24 Axis-aligned bounding box
0x30 4 Extra data flag

If the ending flag is 1, then a large chunk of extra data follows before the next section begins; otherwise, the HEAD section ends.

MTRL

The MTRL section has a 32-bit material count, then lays out its materials one after the other. The material structure is somewhat complicated; each material has a name, something that wasn't present in Retro's previous material formats, as well as a shader ID. The rest of the material structure appears to be defining parameters to pass to the shader. This needs a lot more research to determine what the parameters are and what the different data is.

Type Size Description
string - Name (zero-terminated)
MTRL 16 Shader ID
char[4] 4 Shading type fourCC; can be PHNG, LAMB, SURF, or FURM
u32 4 Unknown
u32 4 Subsection count

Material subsections each have a fourCC name and a type identifer, followed by a set of parameters. The type and number of parameters is dependent on the subsection type; there are five known types currently.

Offset Type Size Description
0x0 char[4] 4 Section name fourCC
0x4 u32 4 Section type
0x8 struct - Section data struct; type varies based on the section type value
End of subsection; next one begins

Type 0: Texture Map

Offset Type Size Description
0x0 TXTR 0x10 Texture ID
0x10 u32 4 Unknown
0x14 u32 4 Unknown
0x18 u32 4 Unknown
0x1C u32 4 Unknown
0x20 u32 4 Unknown
0x24 End of struct

Type 1: Unknown

Offset Type Size Description
0x0 float 4 Unknown
0x4 float 4 Unknown
0x8 float 4 Unknown
0xC float 4 Unknown
0x10 End of struct

Type 2: Unknown

Offset Type Size Description
0x0 float 4 Unknown
0x4 End of struct

Type 4: Unknown

Offset Type Size Description
0x0 u32 4 Unknown
0x4 float 4 Unknown
0x8 float 4 Unknown
0xC float 4 Unknown
0x10 float 4 Unknown
0x14 float 4 Unknown
0x18 float 4 Unknown
0x1C float 4 Unknown
0x20 u32 4 Unknown
0x24 u32 4 Unknown
0x28 u32 4 Unknown
0x2C u32 4 Unknown
0x30 u32 4 Unknown
0x34 u8 1 Unknown
0x35 TXTR 0x10 Unknown Texture ID
0x45 u32 4 Unknown
0x49 u32 4 Unknown
0x4D u32 4 Unknown
0x51 u32 4 Unknown
0x55 u32 4 Unknown
0x59 TXTR 0x10 Unknown Texture ID
0x69 u32 4 Unknown
0x6D u32 4 Unknown
0x71 u32 4 Unknown
0x75 u32 4 Unknown
0x79 u32 4 Unknown
0x7D u32 4 Unknown
0x81 u32 4 Unknown
0x85 u32 4 Unknown
0x89 u32 4 Unknown
0x8D End of struct

Type 5: Unknown

Offset Type Size Description
0x0 u32 4 Unknown
0x4 u32 4 Unknown
0x8 u32 4 Unknown
0xC u32 4 Unknown
0x10 End of struct

MESH

The MESH section does what the name suggests: it defines submeshes. The MESH section header is as follows:

Offset Size Description
0x0 24 MESH Chunk Descriptor
0x18 4 Submesh count
0x1C End of MESH header

Each submesh definition is structured as follows:

Offset Size Description
0x0 4 Unknown; always 3?
0x4 2 Material ID
0x6 1 Vertex buffer ID
0x7 1 Index buffer ID
0x8 4 Start index
0xC 4 Index count
0x10 4 Unknown
0x14 1 Unknown; usually seems to be either 0 or 1, possibly a bool value
0x15 End of submesh definition

VBUF

The VBUF section defines vertex buffers; each buffer can have different vertex types, with different strides and attributes.

Header

Offset Size Description
0x0 24 VBUF Chunk Descriptor
0x18 4 Vertex buffer count
0x1C End of VBUF header

Vertex Buffer

Offset Size Description
0x0 4 Vertex count
0x4 4 Attrib count (AC)
0x8 0x14 × AC Vertex attributes
End of vertex buffer

Vertex Attribute

Offset Size Description
0x0 4 Unknown
0x4 4 Offset
0x8 4 Stride
0xC 4 Unknown
0x10 4 Unknown (likely attrib type/format)
0x14 End of attribute

IBUF

Just like how the VBUF section defines vertex buffers, the IBUF section defines index buffers. Each index buffer only has one value associated with it, so it's fairly simple, and you generally will only see one or two index buffers per file.

Header

Offset Size Description
0x0 24 IBUF Chunk Descriptor
0x18 4 Index buffer count
0x1C End of IBUF header

Index Buffer

Offset Size Description
0x0 4 Format (1 means unsigned short; 2 means unsigned long)
0x4 End of index buffer

GPU

The GPU section contains raw buffer data that's fed to the GPU. It's essentially just a giant blob with all the vertex and index buffers laid out next to each other. The tricky part is, all the buffer data is LZSS-compressed, and the metadata needed to decompress it is stored in the pak rather than in the files themselves; not only that, but that metadata is also the only way to distinguish the different buffers from each other.

As such, this section can't be read correctly if the model file is unpacked and completely left as-is; it needs to be either read directly from the pak, or the metadata needs to be added to the file in some way. A good unpacker should append the metadata to the end of the file; a pre-decompressed file needs the buffer sizes or offsets inserted into the file data somewhere.

PAK Metadata

The pak metadata for the model formats contains mainly information related to the size and layout of the GPU section, and the metadata required to locate and decompress specific buffers within it.

Offset Size Description
0x0 4 Unknown; always 4?
0x4 4 GPU section offset
0x8 4 GPU chunk count (CC)
0xC 8 × CC GPU chunk definitions
- 4 Compressed vertex buffer count (VC)
- 0x10 × VC Vertex buffer definitions
- 4 Compressed index buffer count (IC)
- 0x10 × IC Index buffer definitions
End of pak metadata

GPU Chunk

For large models, the GPU section might be split up into multiple chunks, rather than read as one data buffer; all offsets into the GPU section will be relative to the start of the chosen chunk.

Offset Size Description
0x0 4 Size
0x4 4 Offset
0x8 End of GPU chunk definition

Compressed Buffer

The format for compressed buffer definitions is the same regardless of buffer type (vertex/index).

Offset Size Description
0x0 4 GPU chunk index
0x4 4 Start offset (relative to the start of the chosen GPU chunk)
0x8 4 Compressed size
0xC 4 Decompressed size
0x10 End of compressed buffer definition