WTD — различия между версиями
Материал из GTAModding.ru
Seemann (обсуждение | вклад) |
DK22 (обсуждение | вклад) м |
||
(не показаны 18 промежуточных версий 8 участников) | |||
Строка 1: | Строка 1: | ||
+ | {{Ресурс | ||
+ | | name = Texture Dictionary | ||
+ | | versionw = 8 ([[GTA IV]]), 11 ([[MP 3]]) | ||
+ | | versionx = 7 ([[GTA IV]]), 13 ([[GTA V]]) | ||
+ | | versionc = 7 ([[GTA IV]]), 13 ([[GTA V]]) | ||
+ | | extensionw = .wtd | ||
+ | | extensionx = .xtd | ||
+ | | extensionc = .ctd | ||
+ | | entryw = rage::pgDictionary<rage::grcTexturePC> | ||
+ | | entryx = rage::pgDictionary<rage::grcTextureXenon> | ||
+ | | entryc = rage::pgDictionary<rage::grcTextureGCM> | ||
+ | | description = Хранилище текстур, содержит преобразованные в ресурсы файлы типа *.DDS | ||
+ | }} | ||
'''WTD''' - '''W'''indows '''T'''exture '''D'''ictionary | '''WTD''' - '''W'''indows '''T'''exture '''D'''ictionary | ||
− | Формат текстур [[GTA | + | Формат ПК-текстур [[GTA IV]] и [[GTA V]]. Работа с [[GTA IV]]-версиями поддерживается в [[OpenIV]], [[SparkIV]] и [[G-Texture]]. |
− | [[Категория:GTA 4]] [[Категория: Форматы файлов]] | + | На Xbox360 текстуры имеют формат '''XTD''' - '''X'''enon '''T'''exture '''D'''ictionary. Просмотр был реализован в ранних версиях [[OpenIV]] и [[SparkIV]], но не поддерживается публичными вариантами. |
+ | |||
+ | На PlayStation 3 текстуры имеют формат '''CTD''' - '''C'''ell '''T'''exture '''D'''ictionary. | ||
+ | |||
+ | == Структура == | ||
+ | <div class="NavFrame collapsed"><div class="NavHead">'''Структура WTD 7 в 010 Editor'''</div> | ||
+ | <div class="NavContent"> | ||
+ | |||
+ | <source lang="cpp" line> | ||
+ | //--- 010 Editor v3.0.5 Binary Template | ||
+ | // File: wtd.bt | ||
+ | // Version: 0.1 | ||
+ | // Author: Dageron | ||
+ | // Site: www.GTAModding.ru | ||
+ | //-------------------------------------- | ||
+ | // Based on: | ||
+ | //http://public.sannybuilder.com/GTA4/rsc_en.txt | ||
+ | //http://gtaivtools.googlecode.com/ | ||
+ | //-------------------------------------- | ||
+ | //Simple function to get offset | ||
+ | typedef int GetOffset <read=GetOffsetRead>; | ||
+ | string GetOffsetRead(GetOffset f) | ||
+ | { | ||
+ | string s; | ||
+ | if (f == 0) s="0"; | ||
+ | else | ||
+ | if (f >> 28 != 5) s="0"; //wrong offset | ||
+ | else | ||
+ | SPrintf( s, "%i", f & 0x0fffffff); | ||
+ | return s; | ||
+ | } | ||
+ | //-------------------------------------- | ||
+ | struct GTA_Windows_Texture { | ||
+ | LittleEndian(); | ||
+ | struct pgDictionary | ||
+ | { | ||
+ | SetBackColor( cLtGreen ); | ||
+ | int VTable; | ||
+ | GetOffset BlockMapOffset; | ||
+ | int ParentDictionary; // always 0 in file | ||
+ | int UsageCount; // always 1 in file | ||
+ | GetOffset HashTableOffset; | ||
+ | short TextureCount; | ||
+ | short TextureCount2; | ||
+ | GetOffset TextureListOffset; | ||
+ | short TextureCount3; | ||
+ | short TextureCount4; | ||
+ | FSeek(BlockMapOffset & 0x0fffffff); | ||
+ | SetBackColor( cLtGray ); | ||
+ | struct | ||
+ | { | ||
+ | int zero; | ||
+ | ` byte padding[524]; | ||
+ | } BlockMap; | ||
+ | }Header; | ||
+ | struct | ||
+ | { | ||
+ | FSeek(Header.HashTableOffset & 0x0fffffff); | ||
+ | SetBackColor( cLtGreen ); | ||
+ | local int i; | ||
+ | local int total = 16-(Header.TextureCount*4%16); | ||
+ | for(i = 0; i < Header.TextureCount; i++ ) | ||
+ | { | ||
+ | uint Hash; | ||
+ | } | ||
+ | SetBackColor( cLtGray ); byte padding1[total]; SetBackColor( cLtGreen ); | ||
+ | }HashTable; | ||
+ | |||
+ | struct | ||
+ | { | ||
+ | FSeek(Header.TextureListOffset & 0x0fffffff); | ||
+ | SetBackColor( cLtGreen ); | ||
+ | local int i; | ||
+ | local int total = 16-(Header.TextureCount*4%16); | ||
+ | for(i = 0; i < Header.TextureCount; i++ ) | ||
+ | { | ||
+ | GetOffset InfoOffsets; | ||
+ | } | ||
+ | SetBackColor( cLtGray ); byte padding1[total]; SetBackColor( cLtGreen ); | ||
+ | }TextureListTable; | ||
+ | |||
+ | struct | ||
+ | { | ||
+ | local int i; | ||
+ | for(i = 0; i < Header.TextureCount; i++ ) | ||
+ | { | ||
+ | FSeek(TextureListTable.InfoOffsets[i]& 0x0fffffff); | ||
+ | SetBackColor(cLtYellow); | ||
+ | struct | ||
+ | { | ||
+ | uint VTable; | ||
+ | GetOffset BlockMapOffset; | ||
+ | uint Unknown1; | ||
+ | uint Unknown2; | ||
+ | uint Unknown3; | ||
+ | GetOffset m_pszTextureName; //pointer to texture filename | ||
+ | uint Unknown4; | ||
+ | ushort m_wWidth; //texture width (edge length for cube texture) | ||
+ | ushort m_wHeight; SetBackColor(cLtGreen); //texture height | ||
+ | byte m_pixelFormat[4]; SetBackColor(cLtYellow); //texture pixel format | ||
+ | short m_BytesPerLine; //number of bytes per pixel line | ||
+ | byte m_TextureType; //texture type: 1 - cube texture, 2 - volume texture, other - regular texture | ||
+ | byte m_nbLevels; //number of levels in the texture | ||
+ | float UnknownFloat1; | ||
+ | float UnknownFloat2; | ||
+ | float UnknownFloat3; | ||
+ | float UnknownFloat4; | ||
+ | float UnknownFloat5; | ||
+ | float UnknownFloat6; | ||
+ | GetOffset m_pPrev; //PrevTextureInfoOffset | ||
+ | GetOffset m_pNext; //NextTextureInfoOffset | ||
+ | int RawDataOffset; | ||
+ | uint Unknown6; | ||
+ | }TextureInfo; | ||
+ | } | ||
+ | for(i = 0; i < Header.TextureCount; i++ ) | ||
+ | { | ||
+ | FSeek(TextureInfo[i].m_pszTextureName& 0x0fffffff); | ||
+ | SetBackColor( cLtGreen ); | ||
+ | struct { | ||
+ | string Name; | ||
+ | SetBackColor(cLtYellow); | ||
+ | }TextureName; | ||
+ | } | ||
+ | }grcTexturePC; | ||
+ | }dictionary; | ||
+ | |||
+ | </source> | ||
+ | |||
+ | </div></div> | ||
+ | |||
+ | === Заголовок WTD (полностью аналогичен WDD) === | ||
+ | |||
+ | ид секции (224103129) | ||
+ | оффсет 1 (секция 1) | ||
+ | 0 | ||
+ | 1 | ||
+ | оффсет 2 (секция 2) | ||
+ | количество контейнеров текстур для секции 2 | ||
+ | оффсет 3 (секция 3) | ||
+ | количество контейнеров текстур для секции 3 | ||
+ | |||
+ | секция 1 | ||
+ | |||
+ | 0 | ||
+ | неизвестно | ||
+ | |||
+ | секция 2 | ||
+ | |||
+ | массив, длинна строки: 4 байт. Количество элементов массива = количество контейнеров текстур внутри WTD. | ||
+ | |||
+ | секция 3 | ||
+ | |||
+ | массив оффсетов на заголовки контейнеров текстур, длинна строки: 4 байт. Количество элементов массива = количество контейнеров текстур внутри WTD. | ||
+ | |||
+ | === Заголовок контейнера текстуры === | ||
+ | |||
+ | ид секции (25288138) | ||
+ | 0 | ||
+ | 8 байт: неизвестно | ||
+ | х у | ||
+ | мипмап | ||
+ | 0 | ||
+ | неизвестно | ||
+ | оффсет АА (секция АА) | ||
+ | 16 байт: неизвестно | ||
+ | оффсет AБ (секция АБ) | ||
+ | |||
+ | секция АА | ||
+ | |||
+ | имя текстуры | ||
+ | |||
+ | === Текстуры === | ||
+ | |||
+ | Массивы растров текстур, выровнены относительно блока заголовков. | ||
+ | |||
+ | ==Ссылки== | ||
+ | [http://sannybuilder.com/forums/viewtopic.php?id=1176 Компонент для чтения WTD для Delphi] | ||
+ | [[Категория:GTA 4]] [[Категория: Форматы файлов]][[Категория: Ресурсы]] | ||
+ | |||
+ | {{GTA5-navi}}{{GTA4-navi}} | ||
+ | [[Категория:GTA 4]][[Категория:GTA 5]][[Категория: Форматы файлов]][[Категория: Ресурсы]] |
Текущая версия на 22:10, 27 марта 2014
Версия объекта: |
| |||
---|---|---|---|---|
Расширение файла: |
| |||
Содержащийся объект: |
|
WTD - Windows Texture Dictionary
Формат ПК-текстур GTA IV и GTA V. Работа с GTA IV-версиями поддерживается в OpenIV, SparkIV и G-Texture.
На Xbox360 текстуры имеют формат XTD - Xenon Texture Dictionary. Просмотр был реализован в ранних версиях OpenIV и SparkIV, но не поддерживается публичными вариантами.
На PlayStation 3 текстуры имеют формат CTD - Cell Texture Dictionary.
Содержание |
Структура
Структура WTD 7 в 010 Editor
//--- 010 Editor v3.0.5 Binary Template
// File: wtd.bt
// Version: 0.1
// Author: Dageron
// Site: www.GTAModding.ru
//--------------------------------------
// Based on:
//http://public.sannybuilder.com/GTA4/rsc_en.txt
//http://gtaivtools.googlecode.com/
//--------------------------------------
//Simple function to get offset
typedef int GetOffset <read=GetOffsetRead>;
string GetOffsetRead(GetOffset f)
{
string s;
if (f == 0) s="0";
else
if (f >> 28 != 5) s="0"; //wrong offset
else
SPrintf( s, "%i", f & 0x0fffffff);
return s;
}
//--------------------------------------
struct GTA_Windows_Texture {
LittleEndian();
struct pgDictionary
{
SetBackColor( cLtGreen );
int VTable;
GetOffset BlockMapOffset;
int ParentDictionary; // always 0 in file
int UsageCount; // always 1 in file
GetOffset HashTableOffset;
short TextureCount;
short TextureCount2;
GetOffset TextureListOffset;
short TextureCount3;
short TextureCount4;
FSeek(BlockMapOffset & 0x0fffffff);
SetBackColor( cLtGray );
struct
{
int zero;
` byte padding[524];
} BlockMap;
}Header;
struct
{
FSeek(Header.HashTableOffset & 0x0fffffff);
SetBackColor( cLtGreen );
local int i;
local int total = 16-(Header.TextureCount*4%16);
for(i = 0; i < Header.TextureCount; i++ )
{
uint Hash;
}
SetBackColor( cLtGray ); byte padding1[total]; SetBackColor( cLtGreen );
}HashTable;
struct
{
FSeek(Header.TextureListOffset & 0x0fffffff);
SetBackColor( cLtGreen );
local int i;
local int total = 16-(Header.TextureCount*4%16);
for(i = 0; i < Header.TextureCount; i++ )
{
GetOffset InfoOffsets;
}
SetBackColor( cLtGray ); byte padding1[total]; SetBackColor( cLtGreen );
}TextureListTable;
struct
{
local int i;
for(i = 0; i < Header.TextureCount; i++ )
{
FSeek(TextureListTable.InfoOffsets[i]& 0x0fffffff);
SetBackColor(cLtYellow);
struct
{
uint VTable;
GetOffset BlockMapOffset;
uint Unknown1;
uint Unknown2;
uint Unknown3;
GetOffset m_pszTextureName; //pointer to texture filename
uint Unknown4;
ushort m_wWidth; //texture width (edge length for cube texture)
ushort m_wHeight; SetBackColor(cLtGreen); //texture height
byte m_pixelFormat[4]; SetBackColor(cLtYellow); //texture pixel format
short m_BytesPerLine; //number of bytes per pixel line
byte m_TextureType; //texture type: 1 - cube texture, 2 - volume texture, other - regular texture
byte m_nbLevels; //number of levels in the texture
float UnknownFloat1;
float UnknownFloat2;
float UnknownFloat3;
float UnknownFloat4;
float UnknownFloat5;
float UnknownFloat6;
GetOffset m_pPrev; //PrevTextureInfoOffset
GetOffset m_pNext; //NextTextureInfoOffset
int RawDataOffset;
uint Unknown6;
}TextureInfo;
}
for(i = 0; i < Header.TextureCount; i++ )
{
FSeek(TextureInfo[i].m_pszTextureName& 0x0fffffff);
SetBackColor( cLtGreen );
struct {
string Name;
SetBackColor(cLtYellow);
}TextureName;
}
}grcTexturePC;
}dictionary;
Заголовок WTD (полностью аналогичен WDD)
ид секции (224103129) оффсет 1 (секция 1) 0 1 оффсет 2 (секция 2) количество контейнеров текстур для секции 2 оффсет 3 (секция 3) количество контейнеров текстур для секции 3
секция 1
0 неизвестно
секция 2
массив, длинна строки: 4 байт. Количество элементов массива = количество контейнеров текстур внутри WTD.
секция 3
массив оффсетов на заголовки контейнеров текстур, длинна строки: 4 байт. Количество элементов массива = количество контейнеров текстур внутри WTD.
Заголовок контейнера текстуры
ид секции (25288138) 0 8 байт: неизвестно х у мипмап 0 неизвестно оффсет АА (секция АА) 16 байт: неизвестно оффсет AБ (секция АБ)
секция АА
имя текстуры
Текстуры
Массивы растров текстур, выровнены относительно блока заголовков.
Ссылки
Компонент для чтения WTD для Delphi