Difference between revisions of "Texture Native Struct"
(→Images Header) |
|||
Line 3: | Line 3: | ||
''This article is about the [[Struct (RW Section)|Struct]] section accompanied by a [[Texture Native (RW Section)|Texture Native]] parent section.'' | ''This article is about the [[Struct (RW Section)|Struct]] section accompanied by a [[Texture Native (RW Section)|Texture Native]] parent section.'' | ||
− | The '''Texture Native Struct''' section can usually be found in [[texture archive]]s used by the PC and | + | The '''Texture Native Struct''' section can usually be found in [[texture archive]]s used by the PC, XBOX and PS2 versions of the GTA III game trilogy. They are the most important sections inside a <code>.txd</code> file since they contain the names, dimensions and the actual image data for textures. The typical location in the file's section hierarchy is ''[[Texture Dictionary (RW Section)|Texture Dictionary]] > [[Texture Native (RW Section)|Texture Native]] > Struct''. |
==Images Header== | ==Images Header== | ||
Line 9: | Line 9: | ||
There is a ''86 byte'' header with general image information: | There is a ''86 byte'' header with general image information: | ||
− | <source lang="cpp">struct | + | <source lang="cpp">struct NativeTextureGeneric_Header |
{ | { | ||
struct { | struct { | ||
Line 16: | Line 16: | ||
unsigned int uAddressing : 4; | unsigned int uAddressing : 4; | ||
unsigned int vAddressing : 4; | unsigned int vAddressing : 4; | ||
− | char name[32]; | + | char name[32]; // (string sections on PS2) |
char maskName[32]; | char maskName[32]; | ||
} TextureFormat; | } TextureFormat; | ||
+ | };</source> | ||
+ | |||
+ | <source lang="cpp">struct NativeTexturePC_Header : public NativeTextureGeneric_Header | ||
+ | { | ||
struct { | struct { | ||
unsigned int rasterFormat; | unsigned int rasterFormat; | ||
Line 41: | Line 45: | ||
} RasterFormat; | } RasterFormat; | ||
};</source> | };</source> | ||
+ | |||
+ | <source lang="cpp">struct NativeTexturePS2_Header : public NativeTextureGeneric_Header | ||
+ | { | ||
+ | //size: 64 bytes | ||
+ | struct RasterFormat | ||
+ | { | ||
+ | unsigned int width, height; | ||
+ | unsigned int depth; | ||
+ | unsigned int rasterFormat; | ||
+ | |||
+ | unsigned int unknowns1[4]; // probably PS2 GS configuration. | ||
+ | unsigned int unknowns2[4]; // seems like constant data that is not | ||
+ | |||
+ | unsigned int texelDataSectionSize; | ||
+ | unsigned int paletteDataSectionSize; | ||
+ | unsigned int gpuDataAlignedSize; // size of mipmap texels + palette texels aligned to 2048 | ||
+ | |||
+ | unsigned int skyMipmapVal; // always 4032 | ||
+ | }; | ||
+ | }</source> | ||
;Platform ID: This is '''8''' for GTA3 and VC on the PC, '''9''' for GTA SA on the PC, and '''5''' for GTA3/VC/SA on the XBOX. | ;Platform ID: This is '''8''' for GTA3 and VC on the PC, '''9''' for GTA SA on the PC, and '''5''' for GTA3/VC/SA on the XBOX. | ||
Line 74: | Line 98: | ||
FORMAT_EXT_MIPMAP 0x8000 (mipmaps included) | FORMAT_EXT_MIPMAP 0x8000 (mipmaps included) | ||
− | ;Depth: 8, 16 or 32; 8 usually comes with palette | + | ;Depth: 4, 8, 16 or 32; 8 usually comes with palette |
;Compression: for more information, refer to [[Wikipedia:S3 Texture Compression|S3 Texture Compression]]. | ;Compression: for more information, refer to [[Wikipedia:S3 Texture Compression|S3 Texture Compression]]. | ||
Line 95: | Line 119: | ||
If DXT compression is used, blocks of 4x4 pixels occupy only 8 or 16 bytes (depending on the type). | If DXT compression is used, blocks of 4x4 pixels occupy only 8 or 16 bytes (depending on the type). | ||
+ | |||
+ | ===PlayStation 2=== | ||
+ | |||
+ | The image and palette data is both handled in a (generic) texture format. There are special raster flags reserved. | ||
+ | |||
+ | <source lang="cpp"> | ||
+ | #define RASTER_SWIZZLED 0x10000 // the images are swizzled | ||
+ | #define RASTER_HAS_TEXEL_HEADERS 0x20000 // the image data is preceeded by headers | ||
+ | </source> | ||
+ | |||
+ | If the rasterFlags contain the RASTER_HAS_TEXEL_HEADERS flag, then each image data and palette data have the following structure before it. | ||
+ | |||
+ | <source lang="cpp">struct TextureDataHeader | ||
+ | { | ||
+ | unsigned int consts1[5]; // same in every TXD | ||
+ | |||
+ | unsigned int unknownFlags; // ??? | ||
+ | |||
+ | unsigned int consts2[2]; // same in every TXD | ||
+ | |||
+ | unsigned int width, height; // texture dimensions | ||
+ | |||
+ | unsigned int consts3[6]; // same in every TXD | ||
+ | |||
+ | unsigned int texelCount; // number of texels divided by 4 | ||
+ | |||
+ | unsigned int consts4[3]; // same in every TXD | ||
+ | };</source> | ||
+ | |||
+ | The actual image data is stored afterward. The pixel format is described by the "Raster Format" attributes. |
Revision as of 13:09, 25 November 2014
{{{NAME}}} | |
---|---|
RenderWare Stream Section | |
Vendor | {{{VENDORNAME}}} |
Module | {{{MODULENAME}}} |
Module ID | 0x{{{MODULEID}}}
|
Identifier | 0x{{{IDENTIFIER}}}
|
Chunk ID | 0x{{{MODULEID}}}{{{IDENTIFIER}}}
|
Versions | All |
Hierarchy | |
Parents: None | |
Children: None | |
Extensions: None | |
File Format |
This article is about the Struct section accompanied by a Texture Native parent section.
The Texture Native Struct section can usually be found in texture archives used by the PC, XBOX and PS2 versions of the GTA III game trilogy. They are the most important sections inside a .txd
file since they contain the names, dimensions and the actual image data for textures. The typical location in the file's section hierarchy is Texture Dictionary > Texture Native > Struct.
Images Header
There is a 86 byte header with general image information:
struct NativeTextureGeneric_Header
{
struct {
unsigned int platformId;
unsigned int filterMode : 8;
unsigned int uAddressing : 4;
unsigned int vAddressing : 4;
char name[32]; // (string sections on PS2)
char maskName[32];
} TextureFormat;
};
struct NativeTexturePC_Header : public NativeTextureGeneric_Header
{
struct {
unsigned int rasterFormat;
union {
D3DFORMAT d3dFormat; // SA
unsigned int hasAlpha // GTA3 & VC
};
unsigned short width;
unsigned short height;
unsigned char depth;
unsigned char numLevels;
unsigned char rasterType;
union {
unsigned char compression; // GTA3 & VC
struct { // SA
unsigned char alpha : 1;
unsigned char cubeTexture : 1;
unsigned char autoMipMaps : 1;
unsigned char compressed : 1;
};
};
} RasterFormat;
};
struct NativeTexturePS2_Header : public NativeTextureGeneric_Header
{
//size: 64 bytes
struct RasterFormat
{
unsigned int width, height;
unsigned int depth;
unsigned int rasterFormat;
unsigned int unknowns1[4]; // probably PS2 GS configuration.
unsigned int unknowns2[4]; // seems like constant data that is not
unsigned int texelDataSectionSize;
unsigned int paletteDataSectionSize;
unsigned int gpuDataAlignedSize; // size of mipmap texels + palette texels aligned to 2048
unsigned int skyMipmapVal; // always 4032
};
}
- Platform ID
- This is 8 for GTA3 and VC on the PC, 9 for GTA SA on the PC, and 5 for GTA3/VC/SA on the XBOX.
- Filter Mode
FILTER_NONE 0x00 FILTER_NEAREST 0x01 FILTER_LINEAR 0x02 FILTER_MIP_NEAREST 0x03 FILTER_MIP_LINEAR 0x04 FILTER_LINEAR_MIP_NEAREST 0x05 FILTER_LINEAR_MIP_LINEAR 0x06 FILTER_??? 0x1101
- Addressing Mode
WRAP_NONE 0x00 WRAP_WRAP 0x01 WRAP_MIRROR 0x02 WRAP_CLAMP 0x03
- Raster Format
FORMAT_DEFAULT 0x0000 FORMAT_1555 0x0100 (1 bit alpha, RGB 5 bits each; also used for DXT1 with alpha) FORMAT_565 0x0200 (5 bits red, 6 bits green, 5 bits blue; also used for DXT1 without alpha) FORMAT_4444 0x0300 (RGBA 4 bits each; also used for DXT3) FORMAT_LUM8 0x0400 (gray scale) FORMAT_8888 0x0500 (RGBA 8 bits each) FORMAT_888 0x0600 (RGB 8 bits each) FORMAT_555 0x0A00 (RGB 5 bits each - rare, use 565 instead) FORMAT_EXT_AUTO_MIPMAP 0x1000 (RW generates mipmaps) FORMAT_EXT_PAL8 0x2000 (2^8 = 256 palette colors) FORMAT_EXT_PAL4 0x4000 (2^4 = 16 palette colors) FORMAT_EXT_MIPMAP 0x8000 (mipmaps included)
- Depth
- 4, 8, 16 or 32; 8 usually comes with palette
- Compression
- for more information, refer to S3 Texture Compression.
Raster Data
The header is followed by an optional palette and the raster data (pixels), according to the Raster Format flags.
If Raster Format is FORMAT_EXT_PAL8 | FORMAT_8888
or FORMAT_EXT_PAL8 | FORMAT_888
, then a color palette of (up to) 256 RGBA colors is included. This is used in GTA3 quite often. The raster's one byte for each pixel is an index into the palette.
1024 byte - BYTE[256][4] - palette of RGBA colors 4 byte - DWORD - raster size w*h*1 byte - BYTE[w*h] - pixels, 1 byte each
If no palette is included, the header is followed by raster size and data. If mipmaps are included (FORMAT_EXT_MIPMAP
) then this is repeated for each mipmap. With increasing mipmap levels the raster size is decreased by the factor 4 (side lengths halved). Small initial textures can result in mipmaps of the size 0. For uncompressed images:
4 byte - DWORD - raster size w*h*bpp/8 byte - BYTE[w*h][bpp/8] - pixels
Note: FORMAT_888(8) rasters use BGRA colors!
If DXT compression is used, blocks of 4x4 pixels occupy only 8 or 16 bytes (depending on the type).
PlayStation 2
The image and palette data is both handled in a (generic) texture format. There are special raster flags reserved.
#define RASTER_SWIZZLED 0x10000 // the images are swizzled
#define RASTER_HAS_TEXEL_HEADERS 0x20000 // the image data is preceeded by headers
If the rasterFlags contain the RASTER_HAS_TEXEL_HEADERS flag, then each image data and palette data have the following structure before it.
struct TextureDataHeader
{
unsigned int consts1[5]; // same in every TXD
unsigned int unknownFlags; // ???
unsigned int consts2[2]; // same in every TXD
unsigned int width, height; // texture dimensions
unsigned int consts3[6]; // same in every TXD
unsigned int texelCount; // number of texels divided by 4
unsigned int consts4[3]; // same in every TXD
};
The actual image data is stored afterward. The pixel format is described by the "Raster Format" attributes.