Моддинг LCS и VCS (PSP/PS2)
#362
Отправлено 28 June 2011 - 18:58
хотя нет, вот оно же
P.S. просто смотрел струкутру TXD файлов PS2 - накидал код, который создаёт дерево из секций RW, теперь интересно экспорнуть картинку в BMP или, хотя бы, в нормальный TM2. потом может статейку накидаю, когда сессию закрою.
Сообщение отредактировал Lego: 28 June 2011 - 23:16
#363
Отправлено 29 June 2011 - 03:41
У меня есть код под Delphi для экспорта любого графического сегмента PS2 и в *.bmp, и в *.tm2. Это процедуры, для работы которых нужно знать соответствующие параметры конкретной текстуры. Выписка из моего Console.Graphics.Core.pas (первая процедура - для отрисовки текстур, экспорт в *.bmp реализован в ней самой, вторая процедура - для экспорта в *.tm2):
procedure DrawImage(globalpath: string; WorkMode: string; iWidth, iHeight, iBPP, iOffset, iMipMaps: integer; SwizzleMode, AlphaMode:boolean; var Image:TImage); procedure ExportTM2(globalpath, exportpath: string; WorkMode: string; iWidth, iHeight, iBPP, iOffset, iMipMaps: integer; SwizzleMode:boolean);Я писал их для универсального использования при разборе любых PS2-игр.
Расшифровка параметров:
globalpath - путь к файлу, в котором находится текстура.
WorkMode - режим работы, 'PSP' или 'PS2' (в данном случае 'PS2').
iWidth, iHeight - параметры высоты и ширины.
iBPP - параметр BPP (4 или 8, другие не поддерживаются).
iOffset - оффсет текстуры в файле.
iMipMaps - количество mipmaps (тут могут быть недоработки, но стандартные ситуации проработаны).
SwizzleMode - есть ли swizzling.
В каждой конкретной игре их приходится узнавать по-разному, в данном случае с *.txd - если ты их можешь определить, то теоретически реализовать просмотр и экспортирование можно очень легко. Одна лишь трудность может возникнуть - в PS2 *.txd, насколько я помню, палитра может идти не стандартно "сразу за графическим блоком" (так в LCS/VCS и большинстве игр), а как-то по-другому, так что процедуру нужно будет переделывать.
Прочие параметры:
exportpath (только в ExportTM2) - путь для экспорта *.tm2.
AlphaMode (только в DrawImage) - отрисовывать ли в альфа-режиме.
Image (только в DrawImage) - обычная TImage на форме.
Так что в принципе если опишешь все подробно (ну когда освободишься) или выложишь свой код для разбора *.txd на PS2, то можно будет продумать и просмотр, и экспорт, и даже редактирование.
Кстати про структуру *.tm2, есть чуть более расширенные данные, вот выписка из того же Console.Graphics.Core.pas:
type TIM2Header = record FileId:Array[0..2] of AnsiChar; FormatVersion:AnsiChar; FormatId:SmallInt; Pictures:SmallInt; Padding:Array[0..7] of byte; TotalSize:Integer; ClutSize:Integer; ImageSize:Integer; HeaderSize:SmallInt; ClutColors:SmallInt; PictFormat:byte; MipMapTextures:byte; ClutType:byte; ImageType:byte; ImageWidth:SmallInt; ImageHeight:SmallInt; Unknown_1:Integer; Unknown_2:Integer; Unknown_3:Integer; Unknown_4:Integer; Unknown_5:Integer; Unknown_6:Integer; end;Еще есть написанная процедура записи заголовка *.tm2 исходя из параметров текстуры, она вызывается внутри процедуры ExportTM2 (о ней писал чуть выше). Реализована для всех стандартных случаев, в LCS/VCS работает отлично, ну в III/VC/SA ничего нестандартного в этом плане тоже быть не должно.
#364
Отправлено 29 June 2011 - 07:45
код скинуть могу, но он пока под дос, и выводит дерево из struct, text dict, text native и т.д. на экран рекурсивно обходя дерево, что пока не очень интересно.
вообще, я хочу разработать интерфейс, который смог бы экспортировать данные в TIM2, BMP и т.д. (если формат TXD извсетен) или просто в секцию RW, если формат неизвестен, чтобы можно было потом использовать в RW Analyze или просто собрать новый TXD из текстур другого не вдаваясь в формат.
а вот структурка очень интересная (вроде с типами нигде не напутал)
struct TIM2Header {
char FileId[3];
char FormatVersion; // имхо лишнее, тк версия получается '0'+version_id. всё-таки это была общая сиигнатура TIM2, как написано у BiDi, да и структура называется TIM2.
unsigned short FormatId; // тут по сравнению с версией BiDi получились ещё 12 байт O_o а я на его смещения не смотрел. теперь понятно почему там столько нулей ^_^
unsigned short Pictures;
unsigned char Padding[8];
unsigned long TotalSize;
unsigned long ClutSize;
unsigned long ImageSize;
unsigned short HeaderSize;
unsigned short ClutColors;
unsigned char PictFormat; // это случаем не bpp? в моей TIM2 картинке это поле равно нулю.
unsigned char MipMapTextures; // если есть мипмапы, то их нужно самому сгенерировать в конце файла?
unsigned char ClutType; // интересует ещё это поле, у меня оно равно 0x03
unsigned char ImageType; // и вот это (0x05)
unsigned short ImageWidth;
unsigned short ImageHeight;
unsigned long Unknown_1;
unsigned long Unknown_2;
unsigned long Unknown_3;
unsigned long Unknown_4;
unsigned long Unknown_5;
unsigned long Unknown_6;
};
кстати да, за размер header считать размер этой струкруты минус 16? после заголовка следует изображение, а потом палитра, да?
хм...
в чём может быть ошибка?...
Сообщение отредактировал Lego: 29 June 2011 - 10:29
#365
Отправлено 29 June 2011 - 14:28
Размер header-а всегда (стандартно) равен 48.
PictFormat:=0; //стандартное значение MipMapTextures:=1; //многоуровневые я просто не разбирал, да и это не критично ClutType:=3; //стандартное значение if iBPP=8 then ImageType:=5; //стандартно для bpp равного 8 if iBPP=4 then ImageType:=4; //стандартно для bpp равного 4Вообще самый удобный выход из ситуации - если ты на C++ напишешь программу, которая находила бы в *.txd нужные данные (оффсеты, высоту, ширину, bpp), а дальше уже все можно продумать.
#366
Отправлено 29 June 2011 - 16:35
а, ну это и есть sizeof(TIM2Header)-0x10. хорошо.Размер header-а всегда (стандартно) равен 48.
за описание полей - спасибо. надо бы оформить это на вики.
так это и есть результат экспорта в .TM2 при помощи моей программы на C++Вообще самый удобный выход из ситуации - если ты на C++ напишешь программу, которая находила бы в *.txd нужные данные (оффсеты, высоту, ширину, bpp)
офсеты, разрешения и палитра, кстати, верные, как у steve-m. ну и остальные данные тоже. я пользовался инфой с gtamodding.com, в частности этой.
тогда такой ворос: как определить, есть ли swizzling у конкретной текстуры или нет? (мб значение есть в структуре флажков или на PS2 всегда так?)
я просто думал что swizzling - это фишка TIM2 и для экспорта в TIM2 можно никак не изменять исходное изображение.
Сообщение отредактировал Lego: 29 June 2011 - 16:41
#367
Отправлено 29 June 2011 - 17:31
#368
Отправлено 29 June 2011 - 18:03
в остальном, структура PS2 TXD мне больше нравится, тк теоретически она поддерживает названия текстур любой длины и содержит удобную сигнатуру "PS2", по которой её можно легко распознать.
#372
Отправлено 02 July 2011 - 07:55
Hey @Silent Pawel, You can find my updates on gtaforums "[WIP] ViceCityStories PC Edition" topic, last pages.XEPOMAHT007
Вторая ссылка на медиафайр уже тоже мертва... Точнее я хз в ссылке хакмена тоже самое что по ссылкам твоим?
By the way, nice progress is here
#373
Отправлено 02 July 2011 - 16:56
Сообщение отредактировал solom: 02 July 2011 - 16:58
#374
Отправлено 02 July 2011 - 17:21
I don't think because there are offsets to texture source; 4 bytes before chk parameters header (like size and bpp).я мысленно представил одну проблему в редактировании текстур врлдшных. Как понятно, в 3д максе(и в любом 3д редакторе) на объект накладывается текстура с именем, которую вы назвали(эту текстуру). Но при переименовании этой текстуры, на обьекте теряется просмотр текстуры в сцене на модели. Так вот, как пример, рокстары добавляли эти текстуры с опр. именами, которая использует модель. Ну вот вопрос - при замены текстуры в wrldшный .chk и ее сохранения, станет ли модель белой? Я имею ввиду редактирование без таблицы имени текстур в .chk?
Models must have path to them inside. There is just needed to replace texture source, no headers, because if You replace 64x64 to 128x128, then all ofsets will going wrong.
Ответить

Количество пользователей, читающих эту тему: 2
0 пользователей, 2 гостей, 0 анонимных















