Difference between revisions of "Texture Native Struct"

From GTAMods Wiki
Jump to navigation Jump to search
m (There's other formats on plataform 9?)
Line 7: Line 7:
 
==Images Header==
 
==Images Header==
  
There is a ''92 byte'' header with general image information:
+
There is a ''86 byte'' header with general image information:
  
  4b - DWORD    - Platform ID
+
struct NativeTexturePC_Header
  2b - WORD    - Filter Flags
+
{
  1b - BYTE    - Texture Wrap V
+
    struct {
  1b - BYTE    - Texture Wrap U
+
        unsigned int platformId;
32b - CHAR[32] - Diffuse Texture Name (null-terminated string)
+
        unsigned int filterMode : 8;
32b - CHAR[32] - Alpha Texture Name (null-terminated string)
+
        unsigned int uAddressing : 4;
  4b - DWORD    - Raster Format
+
        unsigned int vAddressing : 4;
  4b - DWORD    - Alpha/FOURCC
+
        char name[32];
  2b - WORD    - Image Width
+
        char maskName[32];
  2b - WORD    - Image Height
+
    } TextureFormat;
  1b - BYTE    - Bits Per Pixel (BPP)
+
    struct {
  1b - BYTE    - Mipmap Count
+
        unsigned int rasterFormat;
  1b - BYTE    - Raster Type, always 0x04 ("Texture")
+
        union {
  1b - BYTE    - DXT Compression Type/Alpha
+
            D3DFORMAT d3dFormat; // SA
  4b - DWORD    - Image Data Size
+
            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;
 +
};
  
 
;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 57: Line 74:
 
  FORMAT_EXT_MIPMAP      0x8000 (mipmaps included)
 
  FORMAT_EXT_MIPMAP      0x8000 (mipmaps included)
  
;Alpha/FOURCC: Usually this defines if the alpha channel is used (0: no, 1: yes), but for platform 9 this is the FOURCC of the used DXTn compression type or if there is no compression, the value is 0x15 for alpha is used and 0x16 for alpha is not used.
+
;depth: 8, 16 or 32; 8 usually comes with palette
;BPP: 8, 16 or 32; 8 usually comes with palette
+
;Compression: for more information, refer to [[Wikipedia:S3 Texture Compression|S3 Texture Compression]].
;DXT Compression Type/Alpha: If greater than 0 the raster data is DXT compressed. This value directly defines the DXT compression (e.g. 3 means DXT3). For more information, refer to [[Wikipedia:S3 Texture Compression|S3 Texture Compression]].
 
:However, for GTA SA (platform ID 9) this is slightly different. The DXT version is derived from the FOURCC, while this seems to be 9 for textures with alpha channel and 8 for those without. If there's no compression applied, these values will respectively look like 1 and 0.
 
;Image Data Size: It is constantly changed based on the image size and its own bits.
 
  
 
==Raster Data==
 
==Raster Data==

Revision as of 11:07, 21 October 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 and XBOX 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 NativeTexturePC_Header
{
    struct {
        unsigned int platformId;
        unsigned int filterMode : 8;
        unsigned int uAddressing : 4;
        unsigned int vAddressing : 4;
        char name[32];
        char maskName[32];
    } TextureFormat;
    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;
};
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 Flags
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
Texture Wrap
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
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).