Перейти к содержимому


Фотография

[WIP] TXD_2048 v0.2


Сообщений в теме: 87

#21 XEPOMAHT007

XEPOMAHT007

    Активный участник

  • LCSTeam
  • PipPipPip
  • 472 сообщений
  • Пол:Мужчина


Отправлено 04 August 2011 - 14:37

структура TM2 расписана мной тут: http://gtamodding.ru/wiki/TIM2


Но там расписаны только заголовки и дан сишный код свизилинга без комментариев (соответственно, как он работает, в корне не ясно людям, далёких от программирования). Про то как вывести на экран палитру и растр PS2-текстуры, в твоей статье нету ни слова.

a4ea86ab343c.gif
BETA 4.0 COMING SOON


#22 Lego

Lego

    Активный участник

  • Пользователи
  • PipPipPip
  • 343 сообщений
  • Пол:Не определился


Отправлено 04 August 2011 - 14:54

я думаю, даже если я тебе скину код, то ты не поймёшь, как его использовать в самой программе. вывод на экран это ж не готовая функция draw_image_on_form( ). нужно описывать создание хэндла DIB, создание формы и т.д. ну не в статье о TIM2 же это делать? это статья не учебник по проге, а описание структуры. а это, грубо говоря, всё, что нужно чтобы его создать. P.S. скинул код для работы с TM2 в личку.

Сообщение отредактировал Lego: 04 August 2011 - 15:00


#23 XEPOMAHT007

XEPOMAHT007

    Активный участник

  • LCSTeam
  • PipPipPip
  • 472 сообщений
  • Пол:Мужчина


Отправлено 04 August 2011 - 15:08

Готовая функция с созданием форм и т.д. мне не требуется. В твоей статье не хватает самого главного - как читается непосредственно сама текстура - например первый байт кодирует цвет R, второй G, третий B, четвёртый - альфу и т.д... И как расшифровать палитру PS2. Та структура, что описана у тебя, описывает только заголовки, которые каждый производитель консольных игр для PS2 делает такой, какой захочет, поэтому толку от них нету никакого (разве только для конвертирования текстур из PS2 в TM2). За код работы с TM2 спасибо большое - попробую в нём разобраться и написать свой аналог на Дельфе.

Сообщение отредактировал XEPOMAHT007: 04 August 2011 - 15:11

a4ea86ab343c.gif
BETA 4.0 COMING SOON


#24 Lego

Lego

    Активный участник

  • Пользователи
  • PipPipPip
  • 343 сообщений
  • Пол:Не определился


Отправлено 04 August 2011 - 15:50

ну статья немного не дописана, но это не должно мешать тебе с твоей прогой. похоже ты просто не понимаешь устройства растрового изображения. это в школе на информатике объясняют. (в любом случае, палитра и растр хранятся в готовом для экспорта в ТМ2 формате, не считая swizzling'а.) палитра в формате RGBA, растр это набор индексов этой палитры (т.е. 1 - это 1ый цвет палитры, 2 - второй и т.д.) размер индекса 1 байт для 8бит на пиксель, что логично и 4 бита для 4 бит на пиксель. палитра представляет набор цветов в формат RGBA, размер каждого двета 4 байта, по байту на канал. 32-битные картинки не имею палитры, но тебя сейчас это не должно волновать.

Сообщение отредактировал Lego: 04 August 2011 - 15:50


#25 Dageron

Dageron

    Активный участник

  • Пользователи
  • PipPipPip
  • 1130 сообщений
  • Пол:Мужчина
  • Город:Пермь


Отправлено 04 August 2011 - 16:51

XEPOMAHT007
Могу скинуть готовые процедуры чтения на Delphi с примерами, нужно?
У меня все комплексно собрано в нескольких *.pas-файлах, недавно все структурировал и доделал до конца как раз.

Console.Graphics.Core.pas - unit по перерисовке графики, среди процедур есть следующая:
procedure DrawImage(WorkFile :TStream; WorkMode: string; dwWidth, dwHeight, dwBPP, dwOffset, dwMipMap, dwMipMaps: DWORD; bSwizzleMode, bAlphaMode: boolean; var Image:TImage);
На входе в процедуру подается поток памяти, режим работы (в данном случае - "PS2"), параметры текстур (ширина, высота, bpp, текущий уровень MipMap, общее число MipMaps), а также нужен ли swizzling и выводить ли текстуру в альфа-режиме. На выходе получается обычная TImage, также процедуру легко переделать под экспорт *.bmp-файла.

Также есть Console.Graphics.Swizzling.PS2.pas - главный unit по swizzling-у на PS2, эти процедуры вызываются из DrawImage:
procedure UnSwizzle8(var Source, Dest; const dwWidth, dwHeight: Integer);
procedure UnSwizzle4(var Source, Dest; const dwWidth, dwHeight: Integer; bInverted: Boolean = False);

в проекте gtamodding.ru: декабрь 2008 - декабрь 2012

#26 Lego

Lego

    Активный участник

  • Пользователи
  • PipPipPip
  • 343 сообщений
  • Пол:Не определился


Отправлено 04 August 2011 - 16:57

а зачем bInverted?

#27 XEPOMAHT007

XEPOMAHT007

    Активный участник

  • LCSTeam
  • PipPipPip
  • 472 сообщений
  • Пол:Мужчина


Отправлено 04 August 2011 - 16:58

Про палитру понятно, но как читать единицы изображения из растра? Например тело текстуры 512х512 весит 0х20000, получается полбайта на пиксель (т.е. 4х битная текстура), соответственно, за 1 байт читается 2 пикселя. Но как в 4х битах зашифрованы индексы палитры (всего 16 цветов) - не ясно кардинально.

a4ea86ab343c.gif
BETA 4.0 COMING SOON


#28 Dageron

Dageron

    Активный участник

  • Пользователи
  • PipPipPip
  • 1130 сообщений
  • Пол:Мужчина
  • Город:Пермь


Отправлено 04 August 2011 - 16:59

Lego
Не помню уже, просто данный параметр был в оригинальной процедуре unswizzling-а, и ряд условий как раз на этот счет подразумевается.
Кстати, ты посмотрел C#-код, который я тебе скидывал?
в проекте gtamodding.ru: декабрь 2008 - декабрь 2012

#29 Lego

Lego

    Активный участник

  • Пользователи
  • PipPipPip
  • 343 сообщений
  • Пол:Не определился


Отправлено 04 August 2011 - 17:03

XEPOMAHT007, смотри:
допустим, у тебя байт 0xF3, это значит что F - номер первого цвета, 3 - номер второго.

тогда у меня такой код (создаёт массив для 24-битного изображения из палитры и растра 16 битного)

this->pal b this->res это палитра и ресурс 16-битного BMP. (с TM2 всё аналогично, только у тебя будет не RGBTRIPLE)

...
long px = 0;
for( long i=0; i<this->info_header.biHeight; i++ ) { // идём по выстое
	for( long j=0; j<this->info_header.biWidth; j++ ) { // по ширине
		pixels[px] = *(RGBTRIPLE*)&this->pal[   // pixels - массив RRBTRIPLE-структур (представляет собой 3байтовую структуру BGR)
							// тут мы проверяем, если пиксель чётный то берём младшие 4 бита, если нечётный, то старшие 4 бита.
							( !(px%2) ? 0x0F & this->res[px>>1] :  ( 0xF0 & this->res[px>>1])>>4 )  % colors
						];
		px++; // увеличиваем номер текущего пикселя
	}
}

Сообщение отредактировал Lego: 04 August 2011 - 17:06


#30 XEPOMAHT007

XEPOMAHT007

    Активный участник

  • LCSTeam
  • PipPipPip
  • 472 сообщений
  • Пол:Мужчина


Отправлено 04 August 2011 - 17:08

XEPOMAHT007, смотри:
допустим, у тебя байт 0xF3, это значит что F - номер первого цвета, 3 - номер второго.


Понятно, спс огромное!!! Теперь вся структура TEX мне полностью ясна. :) (за исключением свизилинга)

Сообщение отредактировал XEPOMAHT007: 04 August 2011 - 17:09

a4ea86ab343c.gif
BETA 4.0 COMING SOON


#31 Dageron

Dageron

    Активный участник

  • Пользователи
  • PipPipPip
  • 1130 сообщений
  • Пол:Мужчина
  • Город:Пермь


Отправлено 04 August 2011 - 17:19

XEPOMAHT007
Получил сообщение, скинул тебе что нужно. И как раз про swizzling.

Lego
Может быть все-таки если в Manhunt и Bully версии ресурсов RenderWare другие, можно обойти поддержку этих игр стороной?
А так конечно же наличие подобной программы для редактирования текстур III/VC/SA на PS2 - очень даже интересная штука :) .
в проекте gtamodding.ru: декабрь 2008 - декабрь 2012

#32 Lego

Lego

    Активный участник

  • Пользователи
  • PipPipPip
  • 343 сообщений
  • Пол:Не определился


Отправлено 04 August 2011 - 17:20

XEPOMAHT007, вообщем-то не за что.
можешь тогда скинуть в личку или на имейл (removed) инфу по TEX? может, таки когда-нибудь поддержку сделаю.

Dageron, в коде много лишнего и не хватает полного описания класса, чтобы его можно было тупо использовать. Но всё равно спасибо.
Похоже, придётся самому разбирать алгоритм swizzling'a... не получается схалтурить как с 8 битами.





Может быть все-таки если в Manhunt и Bully версия ресурса RenderWare другая, можно обойти поддержку этих игр стороной?

ну, вообще, можно жёстко запретить по RW версии поддержку этих игр. меня сейчас это не особо волнует.
я специально ими заниматься не буду, для меня приоритетная задача - полная поддержка именно GTA 3, так как именно с ней основные проблемы.

с другой стороны, глупо в проге полностью поддерживающей Bully, запретить открывать ресурсы этой игры.
я не вижу веских доводов это делать. любой более-менее адекватный пользователь может поменять версию в RW Analyze и потом открыть файл в моей программе.


Сообщение отредактировал Lego: 16 October 2013 - 22:58


#33 Dageron

Dageron

    Активный участник

  • Пользователи
  • PipPipPip
  • 1130 сообщений
  • Пол:Мужчина
  • Город:Пермь


Отправлено 04 August 2011 - 17:37

Lego

в коде много лишнего и не хватает полного описания класса, чтобы его можно было тупо использовать. Но всё равно спасибо.
Похоже, придётся самому разбирать алгоритм swizzling'a... не получается схалтурить как с 8 битами.

Можно как-нибудь по-другому сделать тогда... Например, если я скомпилирую *.dll со всеми необходимыми функциями, то ты ведь сможешь ее использовать в своей программе? Только тогда нужно как следует подумать над тем, что в *.dll должно передаваться и что программа должна получать обратно.

ну, вообще, можно жёстко запретить по RW версии поддержку этих игр. меня сейчас это не особо волнует.
я специально ими заниматься не буду, для меня приоритетная задача - полная поддержка именно GTA 3, так как именно с ней основные проблемы.

Вот именно, лучше сконцентрироваться на главных направлениях и довести их окончательно до ума :) .

с другой стороны, глупо в проге полностью поддерживающей Bully, запретить открывать ресурсы этой игры.
я не вижу веских доводов это делать. любой более-менее адекватный пользователь может поменять версию в RW Analyze и потом открыть файл в моей программе.

Ну просто мне кажется, что допускать поддержку Manhunt и Bully - все-таки как-то не хорошо... Лишний раз поднимать вокруг этих игр публику, особенно учитывая то, что в определенных кругах они никогда не теряли свою "популярность". И всегда находились желающие вытащить (и даже отредактировать) ресурсы, переделать пиратский перевод и так далее. А это, в свою очередь, может вытащить очередную волну заинтересованных в этих играх сторонних игроков, и так далее... В общем ничего хорошего. И "более-менее адекватных пользователей" у нас не так много, так что все равно лучше сделать хоть какую-то банальную защиту, чем не сделать вовсе ничего...

Но конечне поступай как считаешь нужным, я только высказал свое мнение на этот счет и не более).
в проекте gtamodding.ru: декабрь 2008 - декабрь 2012

#34 Lego

Lego

    Активный участник

  • Пользователи
  • PipPipPip
  • 343 сообщений
  • Пол:Не определился


Отправлено 04 August 2011 - 17:47

Dageron, подумай над моим вторым сообщением в личке :) Насчёт TEX не беспокойся, но поддержку Manhunt я хочу включить, всё-таки это одна из моих любимых игр.

#35 XEPOMAHT007

XEPOMAHT007

    Активный участник

  • LCSTeam
  • PipPipPip
  • 472 сообщений
  • Пол:Мужчина


Отправлено 04 August 2011 - 17:48

XEPOMAHT007, вообщем-то не за что.
можешь тогда скинуть в личку или на имейл xxx [at] nick7.com инфу по TEX? может, таки когда-нибудь поддержку сделаю.


Вот вся моя программа (написано топорно, т.к. на её основе я учился работать с бинарными файлами), главное назначение - потрошение IMG и WRLD. Там есть 2 сырых алгоритма нахождения текстур в TEX и WRLD.

Прикрепленные файлы


a4ea86ab343c.gif
BETA 4.0 COMING SOON


#36 Alexander

Alexander

    Участник

  • Staff
  • PipPip
  • 15 сообщений
  • Пол:Мужчина


Отправлено 04 August 2011 - 18:16

Ну просто мне кажется, что допускать поддержку Manhunt и Bully - все-таки как-то не хорошо... Лишний раз поднимать вокруг этих игр публику, особенно учитывая то, что в определенных кругах они никогда не теряли свою "популярность". И всегда находились желающие вытащить (и даже отредактировать) ресурсы, переделать пиратский перевод и так далее. А это, в свою очередь, может вытащить очередную волну заинтересованных в этих играх сторонних игроков, и так далее... В общем ничего хорошего. И "более-менее адекватных пользователей" у нас не так много, так что все равно лучше сделать хоть какую-то банальную защиту, чем не сделать вовсе ничего...

Чем же Его Величеству помешали Manhunt и Bully ?
retired w/ gta

#37 Lego

Lego

    Активный участник

  • Пользователи
  • PipPipPip
  • 343 сообщений
  • Пол:Не определился


Отправлено 04 August 2011 - 19:37

круть, я смог отрендерить 32-битную текстуру. с ней всё просто оказалось. причём вроде в ней нету swizzling'а. txd_2048_screen04.png глянул файлы, которые у меня есть и в которых имются 32-битные текстуры. всё отлично, осталось только нормально допилить экспорт во всех режимах - и всё круто. кратко о формате: как и 32-битный битмап, НЕ имеет палитры. растр представляет собой массив RGBQUAD ( по байту на R, G, B и альфу). находится точно так же через 80 байт от начала структуры (см Texture Native PS2) для преобразования в 32-битный битмап нужно "флипнуть" растр и поменять местами красный и синий цвета. всё :) 32-битных текстур со swizzling'ом пока не обнаружил. могу, в принципе сделать поддержку 24-битного TM2, но такой я пока нигде не встречал. P.S. Респект тому, кто скинет мне 16-битную TXD-шку (кроме тех, что в GTA3_generic.txd), а также 24-битную (теоретически такое невозможно, но мало ли там по 6 бит/пиксель будет)

Сообщение отредактировал Lego: 05 August 2011 - 10:13


#38 Dageron

Dageron

    Активный участник

  • Пользователи
  • PipPipPip
  • 1130 сообщений
  • Пол:Мужчина
  • Город:Пермь


Отправлено 05 August 2011 - 11:06

Lego
Очень хорошо, что с 32bpp разобрался, они ведь даже в программе от steve-m не поддерживались.

Подумай на счет реализации процедур swizzling-а для 4bpp через подключение *.dll. По идее можно ведь достаточно удобно все реализовать - передавать в библиотеку указатели на области памяти с текстурами под swizzling-ом и все их параметры, а на выходе получать указатели на области памяти с текстурами в нормальном виде (соответственно, при обратной процедуре все наоборот). Саму библиотеку я постарался бы написать исходя из своих готовых процедур, не думаю, что возникнут какие-либо существенные трудности.

А по поводу Manhunt и других игр дело, конечно же, твое. Подобную программу можно было написать для себя ("for own purposes", как говорится), а на публику выложить версию с поддеркой III/VC/SA и только, но конечно решай как знаешь, программа же твоя, каждый разработчик софта выбирает свой стиль работы согласно своим убеждениям.

Alexander
Грубая ирония. Но повторяться не буду, ибо к теме это имеет мало отношения и уже писал об этом достаточно подробно:
http://forums.gtamod...a...post&p=6172
http://forums.gtamod...w...
(см. развитие полемики далее)
в проекте gtamodding.ru: декабрь 2008 - декабрь 2012

#39 Lego

Lego

    Активный участник

  • Пользователи
  • PipPipPip
  • 343 сообщений
  • Пол:Не определился


Отправлено 05 August 2011 - 12:31

программа steve-m, всё-таки, не идеал. она неправильно рендерит текстуры маленького разрешения и делает это заметно дольше чем моя программа.
к тому же поддерживает только 4 и 8 бит, что меня не очень-то устраивает.

оказалось, что есть ещё 16 бит (пока у меня таких всего 2 текстуры). хотя размер пикселя 2 байта (WORD), чё-то у меня пока не получается вывести ни 5-5-5, ни 5-6-5. получилось, только я не знаю что должно получиться, чтобы правильно составить маски.
это вообще самый запутанный формат, даже TXD Workshop (по крайней мере в версии 3.5, которую я использую) работает с 16-битными текстурами неверно.

DLL-ка, на мой взгляд, это лишнее. думаю, я разберусь с swizzling'ом и так.

Более того, судя по всему, swizzling это не операция, а один из возможных фильтров, которые практически не используются, но они есть.
в GTA3.IMG есть 8-битная текстура, котрая ни у меня ни у стива правильно не отображается.
в PC версии Vice City есть текстура INTRO.TXD которая имеет формат GTA3 PS2 (8бит) и она у меня неправильно отображается. в то же время, здесь у стива и в TXD Mod всё верно. то же самое с PARTICLE.TXD Vice City PS2.
я могу это исправить, но не знаю при каких условиях это нужно исправлять (нужно поменять местами каждые два строки и каждые 4 столбца) таким свойством обладают почти все particle-текстуры.
походу, дело в моём коде swizzling'а.
это мой тупак, всё нормально.
такие дела.

Сообщение отредактировал Lego: 05 August 2011 - 15:05


#40 Lego

Lego

    Активный участник

  • Пользователи
  • PipPipPip
  • 343 сообщений
  • Пол:Не определился


Отправлено 06 August 2011 - 15:39

с 16 битами вроде разобрался, но как-то странно. если верить аналогу текстуры из Vice City, то структура 1 пикселя такая: 1 бит альфа, 8 бит цвет (GrayScale), 2 бита хз, 5 бит повторяют цвет, но делённый на какое-то число (даже для альфа-канала слишком маленькие значения). ни на какие знакомые мне форматы это не похоже. когда разберусь с некоторыми багми и со swizzling'ом поэксперементирую и с 16-битными.



Ответить



  


Количество пользователей, читающих эту тему: 4

0 пользователей, 4 гостей, 0 анонимных