TXD: Difference between revisions
(This was difficult) |
(Added detail) |
||
Line 10: | Line 10: | ||
uint32_t id; | uint32_t id; | ||
uint32_t chunk_size; // does not include id, chunk_size and marker | uint32_t chunk_size; // does not include id, chunk_size and marker | ||
uint32_t | uint32_t rw_version; | ||
uint8_t data[chunk_size]; | uint8_t data[chunk_size]; | ||
} txd_chunk_t; | } txd_chunk_t; | ||
Line 19: | Line 19: | ||
uint32_t id; // 0x16 (22) | uint32_t id; // 0x16 (22) | ||
uint32_t chunk_size // file_size - 12 | uint32_t chunk_size // file_size - 12 | ||
uint32_t | uint32_t rw_version; | ||
uint8_t data[chunk_size]; | uint8_t data[chunk_size]; | ||
} txd_file_t; | } txd_file_t; | ||
Line 26: | Line 26: | ||
uint32_t id; // 0x01 (1) | uint32_t id; // 0x01 (1) | ||
uint32_t chunk_size; // 0x04 (4) | uint32_t chunk_size; // 0x04 (4) | ||
uint32_t | uint32_t rw_version; | ||
uint16_t count; // number of textures in the dictionary | uint16_t count; // number of textures in the dictionary | ||
uint16_t unknown; | uint16_t unknown; | ||
Line 34: | Line 34: | ||
uint32_t id; // 0x15 (21) | uint32_t id; // 0x15 (21) | ||
uint32_t chunk_size; | uint32_t chunk_size; | ||
uint32_t | uint32_t rw_version; | ||
uint8_t data[chunk_size]; | uint8_t data[chunk_size]; | ||
} txd_texture_t; | } txd_texture_t; | ||
Line 41: | Line 41: | ||
uint32_t id; // 0x01 (1) | uint32_t id; // 0x01 (1) | ||
uint32_t chunk_size; | uint32_t chunk_size; | ||
uint32_t | uint32_t rw_version; | ||
uint32_t version; // 0x08 (8) or 0x09 (9) | uint32_t version; // 0x08 (8) or 0x09 (9) | ||
uint32_t filter_flags; | uint32_t filter_flags; | ||
Line 66: | Line 66: | ||
uint32_t id; // 0x03 (3) | uint32_t id; // 0x03 (3) | ||
uint32_t chunk_size; | uint32_t chunk_size; | ||
uint32_t | uint32_t rw_version; | ||
uint8_t data[chunk_size]; | uint8_t data[chunk_size]; | ||
} txd_extra_info_t; | } txd_extra_info_t; | ||
===<code>direct3d_texture_format</code>=== | |||
* | This is the format of the texture data found in <code>txd_texture_data_t::data</code>. This value must be known if the textures are to be extracted. | ||
It can be one of: | |||
* 0x22 - RGB32 | * <code>0x21</code> - RGBA32 | ||
* 0x00 and flags & 1 is set - [[S3TC]] DXT1 compression (used in old version 8 files) | * <code>0x22</code> - RGB32 | ||
* <code>0x00</code> and <code>flags & 1</code> is set - [[S3TC]] DXT1 compression (used in old version 8 files) | |||
Additionally, <code>direct3d_texture_format</code> may be a four character code ("FourCC") relating to a DXT format. In such cases, the unsigned integer value is actually the concatenated bytes of the FourCC. For example, <code>0x44585431</code> is "DXT1" (<code>44 58 54 31</code>). | |||
===<code>rw_version</code>=== | |||
This is the identifier of the version of the RenderWare engine that the file is for. It can be found in many types of RenderWare binary stream file. | |||
{| class="wikitable" style="text-align: center;" | |||
|- | |||
! style="width:15em;" |<code>rw_version</code> Hex | |||
! style="width:15em;" |RenderWare Version | |||
|- | |||
|<code>0x0003FFFF</code> | |||
|3.0.0.3 | |||
|- | |||
|<code>0x0800FFFF</code> | |||
|3.?.?.? | |||
|- | |||
|<code>0x00000310</code> | |||
|3.1.0.0 | |||
|- | |||
|<code>0x0C02FFFF</code> | |||
|3.3.0.2 | |||
|- | |||
|<code>0x1003FFFF</code> | |||
|3.4.0.3 | |||
|- | |||
|<code>0x1803FFFF</code> | |||
|3.6.0.3 | |||
|- | |||
|} | |||
==Basic file structure== | ==Basic file structure== | ||
Chunks other than <code style="color: red">txd_file_t</code> (which has no parent chunk) are nested within the parent chunk's <code>data</code> array. For example, <code style="color: indigo">txd_info_t</code> is found within <code>txd_file_t::data</code>. | |||
<code style="color: red">txd_file_t</code> | |||
:<code style="color: indigo">txd_info_t</code> | |||
:<code style="color: green">txd_texture_t</code> | |||
::<code style="color: blue">txd_texture_data_t</code> | |||
::<code style="color: blue">txd_extra_info_t</code> | |||
:<code style="color: green">txd_texture_t</code> | |||
::<code style="color: blue">txd_texture_data_t</code> | |||
::<code style="color: blue">txd_extra_info_t</code> | |||
:<code style="color: green">txd_texture_t</code> | |||
::<code style="color: blue">txd_texture_data_t</code> | |||
::<code style="color: blue">txd_extra_info_t</code> | |||
:<code style="color: green">txd_texture_t...*</code> | |||
:<code style="color: indigo">txd_extra_info_t</code> | |||
*<code style="color: green">txd_texture_t...</code> represents the repetition of the blocks seen above it. The number of repetitions differs between files, and is dictated by the value of <code>txd_info_t::count</code>. | |||
==Notes== | ==Notes== | ||
Revision as of 11:42, 15 March 2020
Renderware TeXture Dictionary. Used by the Renderware Game Engine, which is used by games like Grand Theft Auto: San Andreas, Sonic The Hedgehog and NRL Rugby League. The format has undergone some changes over the years. The one described here is that in use by Grand Theft Auto: San Andreas. Other versions might be slightly different.
Generic chunk lay-out
TXD files consist of chunks and sub-chunks, which are really just chunks encapsulated in the data field of other chunks. All chunks have the following basic structure:
typedef struct txd_chunk_s { uint32_t id; uint32_t chunk_size; // does not include id, chunk_size and marker uint32_t rw_version; uint8_t data[chunk_size]; } txd_chunk_t;
Known chunks
typedef struct txd_file_s { uint32_t id; // 0x16 (22) uint32_t chunk_size // file_size - 12 uint32_t rw_version; uint8_t data[chunk_size]; } txd_file_t;
typedef struct txd_info_s { uint32_t id; // 0x01 (1) uint32_t chunk_size; // 0x04 (4) uint32_t rw_version; uint16_t count; // number of textures in the dictionary uint16_t unknown; } txd_info_t;
typedef struct txd_texture_s { uint32_t id; // 0x15 (21) uint32_t chunk_size; uint32_t rw_version; uint8_t data[chunk_size]; } txd_texture_t;
typedef struct txd_texture_data_s { uint32_t id; // 0x01 (1) uint32_t chunk_size; uint32_t rw_version; uint32_t version; // 0x08 (8) or 0x09 (9) uint32_t filter_flags; char texture_name[32]; char alpha_name[32]; uint32_t alpha_flags; uint32_t direct3d_texture_format; // see below uint16_t width; uint16_t height; uint8_t depth; uint8_t mipmap_count; uint8_t texcode_type; uint8_t flags; uint8_t palette[depth==8 ? 256 * 4 : 0]; uint32_t data_size; uint8_t data[data_size]; struct mipmaps_s { uint32_t data_size; uint8_t data[data_size]; } mipmaps[mipmap_count - 1]; } txd_texture_data_t;
typedef struct txd_extra_info_s { uint32_t id; // 0x03 (3) uint32_t chunk_size; uint32_t rw_version; uint8_t data[chunk_size]; } txd_extra_info_t;
direct3d_texture_format
This is the format of the texture data found in txd_texture_data_t::data
. This value must be known if the textures are to be extracted.
It can be one of:
0x21
- RGBA320x22
- RGB320x00
andflags & 1
is set - S3TC DXT1 compression (used in old version 8 files)
Additionally, direct3d_texture_format
may be a four character code ("FourCC") relating to a DXT format. In such cases, the unsigned integer value is actually the concatenated bytes of the FourCC. For example, 0x44585431
is "DXT1" (44 58 54 31
).
rw_version
This is the identifier of the version of the RenderWare engine that the file is for. It can be found in many types of RenderWare binary stream file.
rw_version Hex
|
RenderWare Version |
---|---|
0x0003FFFF
|
3.0.0.3 |
0x0800FFFF
|
3.?.?.? |
0x00000310
|
3.1.0.0 |
0x0C02FFFF
|
3.3.0.2 |
0x1003FFFF
|
3.4.0.3 |
0x1803FFFF
|
3.6.0.3 |
Basic file structure
Chunks other than txd_file_t
(which has no parent chunk) are nested within the parent chunk's data
array. For example, txd_info_t
is found within txd_file_t::data
.
txd_file_t
txd_info_t
txd_texture_t
txd_texture_data_t
txd_extra_info_t
txd_texture_t
txd_texture_data_t
txd_extra_info_t
txd_texture_t
txd_texture_data_t
txd_extra_info_t
txd_texture_t...*
txd_extra_info_t
*txd_texture_t...
represents the repetition of the blocks seen above it. The number of repetitions differs between files, and is dictated by the value of txd_info_t::count
.
Notes
- Chunk id's are scope-dependent. For example, within the txd_file_t chunk, a chunk with id 0x01 is a txd_info_t chunk, but within a txd_texture_t chunk, id 0x01 is used by txd_texture_data_t chunks.