DKRDS Track (File Format): Difference between revisions
| (5 intermediate revisions by the same user not shown) | |||
| Line 15: | Line 15: | ||
| 0x04 || Int32 || '''[[#Track Section Group|Track Section Group]]''' offset. | | 0x04 || Int32 || '''[[#Track Section Group|Track Section Group]]''' offset. | ||
|- | |- | ||
| 0x08 || Int32 || '''[[# | | 0x08 || Int32 || '''[[#Collision Effects|Collision Effects]]''' offset. | ||
|- | |- | ||
| 0x0C || Byte[4] || {{unknown-left|'''Unknown'''. Always 0xCCCCCCCC.}} | | 0x0C || Byte[4] || {{unknown-left|'''Unknown'''. Always 0xCCCCCCCC.}} | ||
| Line 25: | Line 25: | ||
* 2 = 8-byte per '''N''' group. | * 2 = 8-byte per '''N''' group. | ||
|- | |- | ||
| 0x18 || Int32 || '''Number of textures'''. | | 0x18 || Int32 || '''Number of textures''' ('''X'''). | ||
|- | |- | ||
| 0x1C || Int32 || '''[[#Texture Group|Texture Group]]''' offset. | | 0x1C || Int32 || '''[[#Texture Group|Texture Group]]''' offset. | ||
|- | |- | ||
| 0x20 || Int32 || '''[[#Unknown Section | | 0x20 || Int32 || '''[[#Unknown Section 1|Unknown Section 1]]''' offset. | ||
|- | |- | ||
| 0x24 || Int32 || '''[[#Wish Race Unknown Section|Wish Race Unknown Section]]''' entry count. | | 0x24 || Int32 || '''[[#Wish Race Unknown Section|Wish Race Unknown Section]]''' entry count. | ||
| Line 85: | Line 85: | ||
| 0x1C || Int32 || '''[[#Track Section Color Data|Track Section Color Data]]''' offset. | | 0x1C || Int32 || '''[[#Track Section Color Data|Track Section Color Data]]''' offset. | ||
|- | |- | ||
| | | 0x20 || colspan=2 {{unknown|End of header, start of [[#Track Section Data|Track Section Data]]}} | ||
|} | |} | ||
| Line 100: | Line 100: | ||
| 0x10 || Int32[3] || '''Visual model XYZ offset'''. The units are not the same as the collision offset. | | 0x10 || Int32[3] || '''Visual model XYZ offset'''. The units are not the same as the collision offset. | ||
|- | |- | ||
| 0x1C || | | 0x1C || [[#Track Section AABB|Track Section AABB]][2] || '''AABB areas''' of the entire section used for collision detection. The second AABB always seems to be a duplicate of the first. | ||
|- | |- | ||
| 0x4C || colspan=2 {{unknown|End of header, start of [[#Track Section Polygon Data|Track Section Polygon Data]]}} | | 0x4C || colspan=2 {{unknown|End of header, start of [[#Track Section Polygon Data|Track Section Polygon Data]]}} | ||
|} | |||
===== Track Section AABB ===== | |||
Track sections contain 2 identical AABB areas each. It is unknown why there's a duplicate, perhaps used during runtime after object space transform. All values need to be divided by 64 in order to obtain the absolute position data and match with the visual models. | |||
{|class=wikitable | |||
! Offset !! Type !! Description | |||
|- | |||
| 0x00 || Int32[3] || '''AABB minimum XYZ position'''. | |||
|- | |||
| 0x0C || Int32[3] || '''AABB XYZ extent'''. | |||
|} | |} | ||
| Line 111: | Line 122: | ||
! Offset !! Type !! Description | ! Offset !! Type !! Description | ||
|- | |- | ||
| 0x00 || Polygon Group Entry['''P'''] || '''Polygon group entries'''. | | 0x00 || [[#Polygon Group Entry|Polygon Group Entry]]['''P'''] || '''Polygon group entries'''. | ||
|} | |} | ||
| Line 124: | Line 135: | ||
| 0x02 || UInt16 || '''Number of triangles'''. | | 0x02 || UInt16 || '''Number of triangles'''. | ||
|- | |- | ||
| 0x04 || Byte || | | 0x04 || Byte || '''Main collision attribute'''. '''AAAA BBBB''': | ||
* '''A''': '''Shadow level'''. The higher the value, the darker the character gets. | |||
* '''B''': '''Collision flag''': | |||
{| class="wikitable" | |||
! ID !! Description | |||
|- | |- | ||
| | | 0x01 || Road and effects. | ||
|- | |- | ||
| 0x06 || UInt16 || {{unknown-left|'''Unknown'''.}} | | 0x05 || Wall (sparks on collision). | ||
|- | |||
| 0x08 || Special effects (turns off visual model). | |||
|- | |||
| 0x0C || Invisible wall (no sparks on collision, turns off visual model). | |||
|} | |||
|- | |||
| 0x05 || Byte || '''Secondary collision attribute''': | |||
* '''Main flag = 0x01''': | |||
{| class="wikitable" | |||
! ID !! Description | |||
|- | |||
| 0x00 || Special effect? Used for water. | |||
|- | |||
| 0x01 || Pass through/no effect. | |||
|- | |||
| 0x04 || Road. | |||
|} | |||
* '''Main flag = 0x08''': | |||
{| class="wikitable" | |||
! ID !! Description | |||
|- | |||
| 0x00 || Invisible wall (no sparks on collision). | |||
|- | |||
| 0x01 || Water. | |||
|} | |||
|- | |||
| 0x06 || UInt16 || '''Tertiary collision attribute'''. Split in bits. | |||
* '''Main flag = 0x01''': | |||
{| class="wikitable" | |||
! ID !! Description | |||
|- | |||
| 0x01 || {{unknown-left|'''Unknown'''. Used in non-collideable stuff.}} | |||
|- | |||
| 0x02 || Water, inflates tires in car. | |||
|- | |||
| 0x10 || {{unknown-left|'''Unknown'''. Used in non-collideable stuff.}} | |||
|- | |||
| 0x20 || {{unknown-left|'''Unknown'''. Used in non-collideable stuff.}} | |||
|- | |||
| 0x60 || {{unknown-left|'''Unknown'''. Used in non-collideable stuff.}} | |||
|} | |||
* '''Main flag = 0x08''': | |||
{| class="wikitable" | |||
! ID !! Description | |||
|- | |||
| 0x30 || {{unknown-left|'''Unknown'''. Used in non-collideable stuff.}} | |||
|} | |||
* '''Main flag = 0x0C''': | |||
{| class="wikitable" | |||
! ID !! Description | |||
|- | |||
| 0x04 || Ignore when using plane. | |||
|} | |||
|- | |- | ||
| 0x08 || Byte[4] || {{unknown-left|'''Unknown'''.}} | | 0x08 || Byte[4] || {{unknown-left|'''Unknown'''.}} | ||
| Line 141: | Line 209: | ||
! Offset !! Type !! Description | ! Offset !! Type !! Description | ||
|- | |- | ||
| 0x00 || Triangle Entry['''T'''] || '''Triangle entries'''. | | 0x00 || [[#Triangle Entry|Triangle Entry]]['''T'''] || '''Triangle entries'''. | ||
|} | |} | ||
| Line 150: | Line 218: | ||
! Offset !! Type !! Description | ! Offset !! Type !! Description | ||
|- | |- | ||
| 0x00 || UInt16 || '''Texture ID'''. | | 0x00 || UInt16 || '''Attribute flags'''. '''AAAA AAAA AAAA AAAB''': | ||
* '''A''': '''Texture ID'''. | |||
* '''B''': '''Is collidable'''. | |||
|- | |- | ||
| 0x02 || UInt16[3] | | | 0x02 || UInt16[3] || '''Face XYZ normals'''. Values need to be divided by 4096. | ||
|- | |- | ||
| 0x08 || Byte[4] || '''Vertex position indices'''. The index for each of the 3 vertices is 10 bits long. 2 last bits are unknown. | | 0x08 || Byte[4] || '''Vertex position indices'''. The index for each of the 3 vertices is 10 bits long. 2 last bits are unknown. | ||
| Line 191: | Line 261: | ||
|} | |} | ||
== | == Collision Effects == | ||
'' | Each texture is linked to 2 specific collision effects that affect the vehicle's speed, particles and lighting. This section contains 2 blocks of '''X''' UInt16s. | ||
{|class=wikitable | |||
! Offset !! Type !! Description | |||
|- | |||
| 0x00 || UInt16['''X'''] || '''Effects''', split in bits. | |||
|- | |||
| '''X''' * 2 || UInt16['''X'''] || {{unknown-left|'''Unknown'''. This seems to be a copy of the previous block?}} | |||
|} | |||
== Culling Groups == | == Culling Groups == | ||
| Line 206: | Line 284: | ||
See '''[[DKRDS Texture Group]]'''. | See '''[[DKRDS Texture Group]]'''. | ||
== Unknown Section | == Unknown Section 1 == | ||
''TBD'' | ''TBD'' | ||
Latest revision as of 14:38, 4 June 2026
DKRDS Track is the nameless file format used in Diddy Kong Racing DS that stores the tracks' section models, collision and textures. Its type identifier in assets.bin is 0x9A.
File Format
The file byte order is always little endian.
Header
The file starts with a header that is 56 bytes long.
| Offset | Type | Description |
|---|---|---|
| 0x00 | Int32 | Number of sections (N). |
| 0x04 | Int32 | Track Section Group offset. |
| 0x08 | Int32 | Collision Effects offset. |
| 0x0C | Byte[4] | Unknown. Always 0xCCCCCCCC. |
| 0x10 | Int32 | Culling Groups offset. |
| 0x14 | Int32 | Culling Groups data type:
|
| 0x18 | Int32 | Number of textures (X). |
| 0x1C | Int32 | Texture Group offset. |
| 0x20 | Int32 | Unknown Section 1 offset. |
| 0x24 | Int32 | Wish Race Unknown Section entry count. |
| 0x28 | Int32 | Wish Race Unknown Section offset. |
| 0x2C | Byte[4] | Unknown. Seems to be some kind of flags. |
| 0x30 | Int32 | Unknown. |
| 0x34 | Int32 | File size. |
| 0x38 | End of header | |
Track Section Group
This group starts with a list of N offsets.
| Offset | Type | Description |
|---|---|---|
| 0x00 | Int32[N] | Track Section Entry offsets. Relative to the start of this group. |
Track Section Entry
Every section entry defines model and collision data. The entry starts with a 32-byte header.
| Offset | Type | Description |
|---|---|---|
| 0x00 | Byte | Unknown. |
| 0x01 | Byte | Unknown. Always 5? |
| 0x02 | UInt16 | Unknown. |
| 0x04 | UInt16 | Number of polygon groups (P). |
| 0x06 | UInt16 | Number of vertices in Track Section Vertex Data (V). |
| 0x08 | UInt16 | Number of UVs in Track Section UV Data (U). |
| 0x0A | UInt16 | Number of colors in Track Section Color Data (C). |
| 0x0C | Int32 | Track Section Triangle Data offset. |
| 0x10 | Int32 | Track Section Collision Data offset. |
| 0x14 | Int32 | Track Section Vertex Data offset. |
| 0x18 | Int32 | Track Section UV Data offset. |
| 0x1C | Int32 | Track Section Color Data offset. |
| 0x20 | End of header, start of Track Section Data | |
Track Section Data
This data follows directly after the header of the section entry and starts with a 76-byte header.
| Offset | Type | Description |
|---|---|---|
| 0x00 | Int32 | Unknown. Seems to be always 0xFFFFFFFF and set to an address when loaded in memory. |
| 0x04 | Int32[3] | Collision XYZ offset. |
| 0x10 | Int32[3] | Visual model XYZ offset. The units are not the same as the collision offset. |
| 0x1C | Track Section AABB[2] | AABB areas of the entire section used for collision detection. The second AABB always seems to be a duplicate of the first. |
| 0x4C | End of header, start of Track Section Polygon Data | |
Track Section AABB
Track sections contain 2 identical AABB areas each. It is unknown why there's a duplicate, perhaps used during runtime after object space transform. All values need to be divided by 64 in order to obtain the absolute position data and match with the visual models.
| Offset | Type | Description |
|---|---|---|
| 0x00 | Int32[3] | AABB minimum XYZ position. |
| 0x0C | Int32[3] | AABB XYZ extent. |
Track Section Polygon Data
This section seems to store P polygon groups' attributes.
| Offset | Type | Description |
|---|---|---|
| 0x00 | Polygon Group Entry[P] | Polygon group entries. |
Polygon Group Entry
Each polygon group entry is 12 bytes long.
| Offset | Type | Description | ||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0x00 | UInt16 | First triangle ID. | ||||||||||||||||||||
| 0x02 | UInt16 | Number of triangles. | ||||||||||||||||||||
| 0x04 | Byte | Main collision attribute. AAAA BBBB:
| ||||||||||||||||||||
| 0x05 | Byte | Secondary collision attribute:
| ||||||||||||||||||||
| 0x06 | UInt16 | Tertiary collision attribute. Split in bits.
| ||||||||||||||||||||
| 0x08 | Byte[4] | Unknown. |
The number of triangles T can be calculated by adding the first triangle ID to the number of triangles of the last polygon group entry.
Track Section Triangle Data
This section stores T triangle entries.
| Offset | Type | Description |
|---|---|---|
| 0x00 | Triangle Entry[T] | Triangle entries. |
Triangle Entry
Each triangle entry is 20 bytes long.
| Offset | Type | Description |
|---|---|---|
| 0x00 | UInt16 | Attribute flags. AAAA AAAA AAAA AAAB:
|
| 0x02 | UInt16[3] | Face XYZ normals. Values need to be divided by 4096. |
| 0x08 | Byte[4] | Vertex position indices. The index for each of the 3 vertices is 10 bits long. 2 last bits are unknown. |
| 0x0C | Byte[4] | UV indices. The index for each of the 3 vertices is 10 bits long. 2 last bits are unknown. |
| 0x10 | Byte[4] | Color indices. The index for each of the 3 vertices is 10 bits long. 2 last bits are unknown. |
Track Section Collision Data
4-byte data per triangle (?). TBD
Track Section Vertex Data
Vertex data is stored as 6-byte groups per entry V.
| Offset | Type | Description |
|---|---|---|
| 0x00 | Int16[3][V] | Vertex XYZ position. |
Track Section UV Data
UV data is stored as 4-byte groups per entry U.
| Offset | Type | Description |
|---|---|---|
| 0x00 | Int16[2][U] | Vertex UV position. |
Track Section Color Data
Color data is stored as 2-byte groups per entry C.
| Offset | Type | Description |
|---|---|---|
| 0x00 | UInt16[C] | RGBA5551 color. |
Collision Effects
Each texture is linked to 2 specific collision effects that affect the vehicle's speed, particles and lighting. This section contains 2 blocks of X UInt16s.
| Offset | Type | Description |
|---|---|---|
| 0x00 | UInt16[X] | Effects, split in bits. |
| X * 2 | UInt16[X] | Unknown. This seems to be a copy of the previous block? |
Culling Groups
This section includes a 4-byte or 8-byte per track section values that determine which section models are loaded when entering a specific section. Each section is represented as 1 bit.
| Offset | Type | Description |
|---|---|---|
| 0x00 | UInt16[N]/UInt32[N] | Culled model sections, represented as N bits, 1 per section, in order from the least to the most significant bit. 0 if culled, 1 if loaded. |
Texture Group
See DKRDS Texture Group.
Unknown Section 1
TBD
Wish Race Unknown Section
This section is only used for the Wish Race tracks. TBD
Tools
The following tools can handle DKRDS Track:
- (none)