TIM2 — различия между версиями
Материал из GTAModding.ru
Lego (обсуждение | вклад) (→Структура файла) |
Lego (обсуждение | вклад) м (→Swizzling) |
||
Строка 57: | Строка 57: | ||
В TXD-архивах GTA используется технология swizzling'а, которая, в общих чертах, позволяет выиграть в производительности игры за счёт нестандартного расположения пикселей. В зависимости от количества битов на пиксель (bpp) алгоритм подвергается некоторым вариациям. | В TXD-архивах GTA используется технология swizzling'а, которая, в общих чертах, позволяет выиграть в производительности игры за счёт нестандартного расположения пикселей. В зависимости от количества битов на пиксель (bpp) алгоритм подвергается некоторым вариациям. | ||
Следует также отметить, что в GTA3 некоторые текстуры хранятся без swizzling'а т.е. в обычном TIM2-формате. | Следует также отметить, что в GTA3 некоторые текстуры хранятся без swizzling'а т.е. в обычном TIM2-формате. | ||
+ | |||
+ | Код unswizzling'а для 8-битных PS2 текстур выглядит так: | ||
+ | <source lang="cpp"> | ||
+ | void unswizzle8( char* buf, int width, int height ) { | ||
+ | char* swizzled = new char[width*height]; | ||
+ | memcpy(swizzled, buf, width*height); | ||
+ | |||
+ | for (int y = 0; y < height; y++) { | ||
+ | for (int x = 0; x < width; x++) { | ||
+ | int block_location = (y & (~0xf)) * width + (x & (~0xf)) * 2; | ||
+ | int swap_selector = (((y + 2) >> 2) & 0x1) * 4; | ||
+ | int posY = (((y & (~3)) >> 1) + (y & 1)) & 0x7; | ||
+ | int column_location = posY * width * 2 + ((x + swap_selector) & 0x7) * 4; | ||
+ | |||
+ | int byte_num = ((y >> 1) & 1) + ((x >> 2) & 2); // 0,1,2,3 | ||
+ | |||
+ | buf[(y * width) + x] = swizzled[block_location + column_location + byte_num]; | ||
+ | } | ||
+ | } | ||
+ | delete [] swizzled; | ||
+ | } | ||
+ | </source> | ||
==Примечания== | ==Примечания== |
Версия 14:29, 4 августа 2011
TIM2 - растровый графичесий формат приставки Sony Playstation 2. C небольшими изменениями1 используется в PS2 TXD-файлах трилогии GTA, Bully, Manhunt и в других играх.
Содержание |
Структура файла
В начале файла содержится заголовок размером 16 байт, имеющий следующую структуру:
struct tim2_header { BYTE sign[4]; WORD format_id; WORD pictures; BYTE padding[8]; }
-
sign
- 4 байта - всегда равно "TIM2" -
format_id
- 2 байта - равно 4 (??) -
pictures
- 2 байта - количество изображений в файле. -
padding
- 8 байт - зарезервированное место (байты могут быть нулями)
Далее идёт заголовок изображения, повторяющийся N раз (N=picures
) вместе с палитрой и самим растром.
struct tim2_imge_header { DWORD total_size; DWORD clut_size; DWORD image_size; WORD header_size; WORD clut_colors; BYTE pict_format; BYTE mipmaps; BYTE clut_type; BYTE image_type; WORD image_width; WORD image_height; BYTE unknown[24]; };
-
total_size
- 4 байта - общий размер (размер изображения, палитры и заголовка) -
clut_size
- 4 байта - размер палитры (равен количеству цветов, умноженному на 4) -
image_size
- 4 байта - размер изображения (размер растра, равен произведению длины, ширины и размеру пикселя в байтах) -
header_size
- 2 байта - размер заголовка (этой структуры) -
clut_colors
- 2 байта - количество цветов в палитре -
pict_format
- 1 байт - неизвестно, обычно равно 0 (нулю). -
mipmaps
- 1 байт - количество мипмапов. -
clut_type
- 1 байт - неизвестно, обычно равно 3 -
image_type
- 1 байт - тип изображения:
0 - NONE 1 - RGB16 2 - RGB24 3 - RGB32 4 - IDTEX4 - для 4-битных текстур 5 - IDTEX8 - для 8-битных текстур
-
image_width
- 2 байта - ширина изображения в пикселях -
image_height
- 2 байта - высота изображения в пикселях
Далее идут данные растра, за ними - данные палитры.
Swizzling
В TXD-архивах GTA используется технология swizzling'а, которая, в общих чертах, позволяет выиграть в производительности игры за счёт нестандартного расположения пикселей. В зависимости от количества битов на пиксель (bpp) алгоритм подвергается некоторым вариациям. Следует также отметить, что в GTA3 некоторые текстуры хранятся без swizzling'а т.е. в обычном TIM2-формате.
Код unswizzling'а для 8-битных PS2 текстур выглядит так:
void unswizzle8( char* buf, int width, int height ) { char* swizzled = new char[width*height]; memcpy(swizzled, buf, width*height); for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { int block_location = (y & (~0xf)) * width + (x & (~0xf)) * 2; int swap_selector = (((y + 2) >> 2) & 0x1) * 4; int posY = (((y & (~3)) >> 1) + (y & 1)) & 0x7; int column_location = posY * width * 2 + ((x + swap_selector) & 0x7) * 4; int byte_num = ((y >> 1) & 1) + ((x >> 2) & 2); // 0,1,2,3 buf[(y * width) + x] = swizzled[block_location + column_location + byte_num]; } } delete [] swizzled; }
Примечания
^В TXD-файлах текстуры хранятся в с использованием swizzling'а. Исключение составляют только некоторые 4-битные текстуры.
^Для справки: в структурах использованы типы данных: long размером 4 байтам (DWORD), short размером 2 байта (WORD) и char размером 1 байт (BYTE).