Difference between revisions of "Texture Native Struct"

From GTAMods Wiki
Jump to navigation Jump to search
(Replaced content with "{{request-delete}}")
(Tag: Replaced)
 
(38 intermediate revisions by 4 users not shown)
Line 1: Line 1:
{{RW Section|Struct|0x0001}}
+
{{request-delete}}
 
 
''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, 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==
 
 
 
There is a ''86 byte'' header with general image information:
 
 
 
<source lang="cpp">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;
 
};</source>
 
 
 
<source lang="cpp">struct NativeTexturePS2_Header
 
{
 
    struct {
 
        unsigned int platformId;
 
        unsigned int filterMode : 8;
 
        unsigned int uAddressing : 4;
 
        unsigned int vAddressing : 4;
 
    } TextureFormat;
 
 
 
    // CHUNK_STRING for name
 
    // CHUNK_STRING for alpha-mask name
 
 
 
    //size: 64 bytes
 
    struct RasterFormat
 
    {
 
        unsigned int width, height;
 
        unsigned int depth;
 
        unsigned int rasterFormat;
 
       
 
        // See http://mtz01-a.stanford.edu/resources/SonyPS2/pdf00005.pdf
 
        unsigned long long tex0;    // PS2 TEX0 GS register
 
        unsigned long long tex1;    // PS2 TEX1 GS register
 
        unsigned long long miptbp1;  // PS2 MIPTBP1 GS register
 
        unsigned long long miptbp2;  // PS2 MIPTBP2 GS register
 
 
 
        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, '''PS2\0''' FourCC for GTA SA on PS2, 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, D3DFMT_X8R8G8B8)
 
FORMAT_555            0x0A00 (RGB 5 bits each - rare, use 565 instead, D3DFMT_X1R5G5B5)
 
 
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 [[Wikipedia:S3 Texture Compression|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 <code>FORMAT_EXT_PAL8 | FORMAT_8888</code> or <code>FORMAT_EXT_PAL8 | FORMAT_888</code>, 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 ''[[Wikipedia:mipmap|mipmap]]s'' are included (<code>FORMAT_EXT_MIPMAP</code>) 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.
 
 
 
<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[4];    // same in every TXD
 
 
 
    unsigned long long trxpos;  // PS2 GS transmission rectangle settings (only dsax and dsay are important)
 
 
 
    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.
 

Latest revision as of 12:04, 11 September 2020

Delete.png This article has been requested for deletion
You may suggest different in the discussion page.