View source: MT5 (revision 457)

From Wulinshu
Jump to navigation Jump to search

2019-04-25T00:18:20Z · PhilYeahz · Download source

[[Category:Shenmue]]
[[Category:Files]]
[[Category:Models]]
MT5 is an model container format for Shenmue I.<br>
The model format is based on an node based hierarchy tree.<br>

For an C# implementation based on this documentation look [https://github.com/philyeahz/ShenmueDKSharp/blob/master/Files/Models/MT5.cs here].

===Header===
{| class="wikitable"
|-
! Position !! Length !! Type !! Description 
|-
| 0x00 || 0x04 || string || Identifier (HRCM)
|-
| 0x04 || 0x04 || uint || TEXD offset
|-
| 0x08 || 0x04 || uint || First node offset
|}

===MT5 Node===
{| class="wikitable"
|-
! Position !! Length !! Type !! Description 
|-
| 0x00 || 0x04 || uint || ID
|-
| 0x04 || 0x04 || uint || Mesh offset
|-
| 0x08 || 0x0C || short || Rotation (X, Y, Z)
|-
| 0x14 || 0x0C || float || Scale (X, Y, Z)
|-
| 0x20 || 0x0C || float || Position/Translate (X, Y, Z)
|-
| 0x2C || 0x04 || uint || Child offset
|-
| 0x30 || 0x04 || uint || Sibling offset
|-
| 0x34 || 0x04 || uint || Parent offset
|-
| 0x38 || 0x04 || string || Node name
|-
| 0x3C || 0x04 || ? || Reserved
|}

===Mesh Data===
{| class="wikitable"
|-
! Position !! Length !! Type !! Description 
|-
| 0x00 || 0x04 || uint || Polytype?
|-
| 0x04 || 0x04 || uint || Vertices offset
|-
| 0x08 || 0x04 || uint || Vertex count
|-
| 0x0C || 0x04 || uint || Instructions offset
|-
| 0x10 || 0x0C || float || Mesh center (X, Y, Z)
|-
| 0x1C || 0x04 || float || Mesh radius
|}

====Instructions====
These instructions are state machine like. Each instruction changes the state of how to render the strip.<br>
Each instruction identifier is 2 bytes long.

=====Unused (0x0E00, 0x0F00)=====
Ignored. Skip 10 bytes.

=====Unused (0x8000, 0xA000)=====
Ignored. Skip 2 bytes.

=====Unknown (0x0B00)=====
Unknown.

=====Strip Attributes (0x0200 - 0x0700)=====
First byte holds UV flag for how they are interpreted.
Holds information about the texture UV wrap modes.

=====Texture (0x0900)=====
Sets the texture to use for the next instructions.

=====Strip Group (0x1000 - 0x1400, 0x1800 - 0x1C00)=====
{| class="wikitable"
|-
! Position !! Length !! Type !! Description 
|-
| 0x00 || 0x02 || ushort || Strip count
|}
These strip groups have the following vertex structure based on the identifiers:
{| class="wikitable"
|-
! Identifier !! Vertex Size !! Description 
|-
| 0x1000, 0x1300, 0x1800, 0x1B00 || 2 Bytes (Index) || Vertex index
|-
| 0x1200, 0x1A00 || 2 Bytes (Index) + 4 Bytes (BGRA) || Vertex index, Color
|-
| 0x1100, 0x1900 || 2 Bytes (Index) + 4 Bytes (UV) || Vertex index, UV
|-
| 0x1400, 0x1C00 || 2 Bytes (Index) + 4 Bytes (UV) + 4 Bytes (BGRA) || Vertex index, UV, Color
|}

======Strip======
{| class="wikitable"
|-
! Position !! Length !! Type !! Description 
|-
| 0x00 || 0x02 || short || Strip vertex count
|}
Sometimes the vertex count can be negativ, just abs() it.<br>
The reason for this behaviour is unknown.

======Strip "Vertex"======
{| class="wikitable"
|-
! Type !! Size !! Description 
|-
| short || 0x02 || Vertex index
|-
| short || 0x04 || (optional) Texture Coordinate (UV)
|-
| byte || 0x04 || (optional) BGRA8888 Color
|}
The vertex structure is based on the strip group identifier.<br>
Often the vertex index can be negativ, this is an optimization and is used to point to the parents vertices.<br>
The UV coordinates are UVH (UV high-resolution) and need to be divided by 1024 to get normalized UV coordnates.

=====End (0x0080)=====
Defines the end of instructions.

====Vertices====
The vertices only hold the position and normal of an vertex.
=====Vertex=====
{| class="wikitable"
|-
! Position !! Length !! Type !! Description 
|-
| 0x00 || 0x0C || float || Position (X, Y, Z)
|-
| 0x0C || 0x0C || float || Normals (X, Y, Z)
|}

===TEXD (Texture Definition)===
This sections holds texture count for the model.
{| class="wikitable"
|-
! Position !! Length !! Type !! Description 
|-
| 0x00 || 0x04 || string || Identifier (TEXD)
|-
| 0x04 || 0x04 || uint || Size in bytes
|-
| 0x08 || 0x04 || uint || Texture count
|}

===Texture Entry===
The MT5 format support external and embedded textures.

====Texture ID====
Each texture entry has an texture ID which is 8 bytes long.<br>
The actual data type of the ID is still unknown, sometimes it looks like ASCII strings, Shift-JIS or plain garbage.
{| class="wikitable"
|-
! Position !! Length !! Type !! Description 
|-
| 0x00 || 0x08 || string || Texture ID
|}

====TEXN (Texture Entry)====
This entry defines an embedded PVRT texture.
{| class="wikitable"
|-
! Position !! Length !! Type !! Description 
|-
| 0x00 || 0x08 || TextureID || Texture ID
|-
| 0x08 || 0x0? || PVRT || Texture
|}

====NAME (Texture Names)====
This entry defines external PVRT textures each using the texture id for reference.
{| class="wikitable"
|-
! Position !! Length !! Type !! Description 
|-
| 0x00 || 0x04 || string || Identifier (NAME)
|-
| 0x04 || 0x04 || uint || Size in bytes
|-
| 0x08 || 0x0? || TextureID[] || Texture ID Array
|}

===TEXL (Texture Library)===
This sections holds offsets to the texture IDs.
{| class="wikitable"
|-
! Position !! Length !! Type !! Description 
|-
| 0x00 || 0x04 || string || Identifier (TEXL)
|-
| 0x04 || 0x04 || uint || Size in bytes
|-
| 0x08 || 0x04 || uint || Texture count
|}

====TEXL Entry====
{| class="wikitable"
|-
! Position !! Length !! Type !! Description 
|-
| 0x00 || 0x04 || uint|| Offset to TextureID
|-
| 0x04 || 0x04 || uint || Unknown
|-
| 0x08 || 0x04 || uint || Unknown
|}

===PTRL===
This sections holds offsets to various parts of the model.<br>
Its purpose is still unclear.
{| class="wikitable"
|-
! Position !! Length !! Type !! Description 
|-
| 0x00 || 0x04 || string || Identifier (PTRL)
|-
| 0x04 || 0x04 || uint || Size in bytes
|}