txd-texture-dictionary-darkbg-www.sigmaco.org

Texture Dictionary (.txd)

62 / 100

Dicionário De Textura, ou (em inglês) Texture Dictionary, frequentemente referido como TXD, é um arranjo conveniente para armazenamento de texturas usando o mesmo formato binário de recurso do middleware RenderWare (.rws). TXDs são arquivos de fácil localização devido ao uso da extensão de nome de arquivo .txd, podendo ser observados em diretórios ou pacotes de games populares, tais como GTA III, GTA Vice City, GTA San Andreas, e Manhunt.

A denominação do arquivo como sendo um “dicionário” é imprecisa. Quando um modelo solicita uma textura, o mecanismo de gestão de texturas de RenderWare faz uma “consulta” no que é, de fato, o tal dicionário de texturas, que existe apenas na RAM. Assim sendo, o dicionário de texturas existe apenas em tempo de execução da aplicação, composto por todos os arquivos TXDs então carregados e mantidos na RAM. Isto significa que um arquivo TXD representa apenas um “catálogo” dentro deste grande e único dicionário virtual.

Especificação

Um arquivo TXD é uma representação binária, escrevível a e legível de disco, de um RwTexDictionary, uma estrutura de dados da API de RenderWare 3. Dentro desta estrutura, encontra-se descritores de texturas e imagens cujo o mapa de pixel pode ser empacotado ou indexado (a.k.a. paletizado). Tais imagens podem armazenar dados em formato genérico mas, visando melhor desempenho computacional, tendem a armazenar de dados optimizados para um renderizador premeditado; diz-se de imagem dependente de dispositivo.

A seguir, descreveremos uma estrutura binária de um arquivo TXD exportado para um renderizador Direct3D, numa abordagem mais habitual a um programador. Tentamos usar offsets mas não funcionou bem devido as capacidades expansivas do formato RenderWare, que parece um fita bidimensional de Turing.

struct
{
    uint32_t txdId; // 0x16
    uint32_t txdLen;
    uint32_t txdVer;
    struct
    {
        uint32_t txdStrucId; // 0x01
        uint32_t txdStrucLen;
        uint32_t txdStrucVer;
        struct
        {
            uint16_t nofTextures;
            uint16_t deviceId;
        } txdStruc;
        
        // array of native textures, if is there anyone. The following block repeats as much as rws.txd.struc.nofTextures determine.
        struct
        {
            uint32_t texNatId; // 0x15
            uint32_t texNatLen;
            uint32_t texNatVer;
            struct
            {
                uint32_t texNatStrucId; // 0x01
                uint32_t texNatStrucLen;
                uint32_t texNatStrucVer;
                struct
                {
                    int32_t deviceId;
                    int32_t filterAndAddr;
                    int8_t name;
                    int8_t maskName;
                    
                    // Here we are working with Direct3D-dependent raster.
                    uint32_t rasterFormat;
                    int32_t rasterD3dFormat;
                    uint16_t rasterWidth;
                    uint16_t rasterHeight;
                    uint8_t rasterDepth;
                    uint8_t rasterNumMipLevels;
                    uint8_t rasterType;
                    uint8_t rasterFlags; // This raster has an alpha component, automipmapgen, etc
                } texNatStruc;
                
                // colormap, indexmap, etc
                
                // extension
                uint32_t texNatExtId; // 0x03
                uint32_t texNatExtLen;
                uint32_t texNatExtVer;
                struct
                {
                    // extension entries
                } texNatExt;
            } texNat;
        } texture[rws.txd.txdStruc.nofTextures];
        
        // extension
        uint32_t txdExtId; // 0x03
        uint32_t txdExtLen;
        uint32_t txdExtVer;
        struct
        {
            // extension entries
        } txdExt;
    } txd;
} rws;

NOTA: A descrição do formato não está completa, necessitando de ser continuada.

Responses