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


Фотография
- - - - -

WDR


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 41

#1 Dageron

Dageron

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

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


Отправлено 07 August 2009 - 09:54

Это тема для обсуждения статьи: WDR
в проекте gtamodding.ru: декабрь 2008 - декабрь 2012

#2 Dageron

Dageron

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

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


Отправлено 07 August 2009 - 10:11

Посмотрел-таки я наконец формат моделей - *.wdr. Уже программ чтобы работать с ним достаточно всяких разных (один только анализатор на Java чего стоит, интересная штука), а вот описаний практически нет.

Весь смысл в том чтобы сконвертировать *.xdr от DLC надо сначала изучить в достаточной степени *.wdr. А поэтому не помешает немного публичных описаний Windows-форматов (как с *.wtd было), вдруг да и пригодится кому?

Как обычно, структура заголовка в виде шаблона 010 (основано на w_ak47.wdr):
struct GTA_Windows_Model {
	 int VTable;// for .wdr is always 0x695254
	 GetOffset offset_to_end_of_linknodes; // (structs link to corresponding object names)
	 GetOffset offset_to_struct_unknown1;
	 GetOffset offset_to_struct_unknown2;
	 float unknown_floats_1[3];
	 int unknown_magic_number_1;
	 float unknown_floats_2[3];
	 int unknown_magic_number_2;
	 float unknown_floats_3[3];
	 int unknown_magic_number_3;
	 GetOffset offset_to_somerthing; //(is in data section, with object names and textures)
	 int always_zero[3];
	 int unknown_dwords_1[4];//each dword is always 1176255488 (0x461C3C00)
	 int number_of_geometric_objects; 
	 byte unknown_padding[12];//each dword is 0xFFFFFFFF
	 int unknown_float;
	 int unknown_dwords_3[3];// always zero?
	 int unknown_dwords_4[2];// always zero?
	 byte padding1[8];// (0xCDCDCDCD);
	 int number_of_linknodes;
	 byte padding2[12];// (0xCDCDCDCD);
 }header;

Ну и GetOffset функция (она для всех ресурсов на обоих платформах используется) - выкладывал ранее в теме про wtd:
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;
	  }

Самое главное - понять где лежат указатели на геометрию, vertex-ы и текстурные координаты. Пока что у меня это не получилось. Более того, каждый wdr-файл может содержать несколько моделей (точнее, одну в нескольких частях).

Вот базовый скрипт для импорта в макс (w_ak47.wdr тот же самый):
fname = getOpenFileName types:"Whatever (*.*)|*.*|"
 if fname != undefined do (
	 clearListener ()
	 voffset = 8192 -- оффсет начала vertex блока
	  eov = 126416 -- оффсет конца vertex блока
	 f = fopen fname "rb"
	  fseek f voffset #seek_set	
	 verts = #()
	 format "\nVertex-Stuff: \n"
	 while (ftell f) < eov do
	 (
		 f1 = ReadFloat f -- x
		 f2 = ReadFloat f -- y
		 f3 = ReadFloat f -- z
		 f4 = ReadFloat f
		 f5 = ReadFloat f
		 f6 = ReadFloat f		
		 append verts [f1,f2,f3]
		 vr = ReadByte f #unsigned
		 vg = ReadByte f #unsigned
		 vb = ReadByte f #unsigned
		 va = ReadByte f #unsigned		
		 f7 = ReadFloat f 
		 f8 = ReadFloat f
		 f9 = ReadFloat f 
		 f10 = ReadFloat f
		 f11 = ReadFloat f 
		 f12 = ReadFloat f
		 format "[%, %, %, %] \n" vr vg vb va	
	 )  
	 foffset = 126448 -- оффсет начала геометрии
	 eof = 138604 -- оффсет конца геометрии
	 fseek f foffset #seek_set
	 format "\nFace-Stuff: \n"	
	 faces = #()	
	 while (ftell f) < eof do
	 (
		 fx = ReadShort f	
		 fy = ReadShort f
		 fz = ReadShort f		
		 append faces [fx+1,fy+1,fz+1]		
		 format "[%, %, %]\n" fx fy fz	
	 )
	 fclose f	
	 format "\n\n % - %\n" (verts.count) (faces.count)	
	 bat_mesh = mesh vertices:verts faces:faces	
 )
(Если синтаксис не очень понятен то смотрите учебник, хороший кстати).
Оригинал структур и скрипт взят с gtaF, когда начинали разговаривать про формат.

Сообщение отредактировал Dageron: 17 August 2011 - 12:39

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

#3 Chipsman

Chipsman

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

  • Главные администраторы
  • PipPipPip
  • 786 сообщений
  • Пол:Не определился


Отправлено 07 August 2009 - 18:04

да, мне тоже это все интересно, и вообще можно поподробнее что в нем(вдр) вообще есть, что такое шейдергрупы и за что они отвечает? и что за уровни детализации какие-то?

#4 listener

listener

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

  • Главные администраторы
  • PipPipPip
  • 356 сообщений
  • Пол:Мужчина
  • Город:Ft.Lauderdale


Отправлено 08 August 2009 - 00:22

Шейдергруппы отвечают за навешенные на модель шейдеры. Еще там есть скелет с инверсной кинематикой. И вообще, на самом деле там почти все не так. Самая полная структура из публичных есть в SparkIV, но там ее нужно выдирать из кучи C#-ских исходников. Некоторое количество инфы есть у меня в базе. Плюс к тому, у меня описано некоторое количество нарытого в кучеразных мест (заметки по ходу ресерсинга, асечные логи и т.д.), но я уже месяц никак не могу выкроить время, чтобы собрать это все вместе.
You think your day was surreal? Try mine.

#5 Dageron

Dageron

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

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


Отправлено 08 August 2009 - 04:45

В структуру я пока больше не лез, но вот непосредственную геометрию изучал.

К примеру:
w_ak47.wdr.rsc
Геометрия 1 Vertex start: 8192 Vertex end: 126416 Mesh start: 126448 Mesh end: 138604
Геометрия 2 Vertex start: 139264 Vertex end: 189472 Mesh start: 189504 Mesh end: 194610
w_ak47.xdr.rsc
Геометрия 1 Vertex start: 8192 Vertex end: 71840 Mesh start: 106496 Mesh end: 118652
Геометрия 2 Vertex start: 73728 Vertex end: 100752 Mesh start: 100784 Mesh end: 105976
(отсчет идет от начала cpu-части, т.е. от начала файла - cpu и gpu слиты в одно целое)
Все оффсеты можно получить визуально. Постараюсь сконвертировать с x360 в 3ds Max модель, скажу что получилось.
в проекте gtamodding.ru: декабрь 2008 - декабрь 2012

#6 Dageron

Dageron

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

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


Отправлено 08 August 2009 - 09:19

Кое-что доделал.

Теперь можно полностью извлечь из x360 моделей геометрию (достаточно узнать начало и конец блока данных, но это как я уже говорил, не сложно), с вертексами пока ничего вообще не понятно. Написал небольшую программку для удобного извлечения данных и endian-convert (в геометрии каждые два байта меняются местами так как там short, в вертексах каждые четыре так как там float).
Размер массива вертексов на x360 приблизительно в два раза меньше чем на ПК, предположительно он содержит меньше float-значений и они идут в другом порядке. Хотелось бы что-нибудь узнать по этому поводу.

Еще появилась хорошая информация по *.wdr: на англовики.
в проекте gtamodding.ru: декабрь 2008 - декабрь 2012

#7 listener

listener

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

  • Главные администраторы
  • PipPipPip
  • 356 сообщений
  • Пол:Мужчина
  • Город:Ft.Lauderdale


Отправлено 08 August 2009 - 13:04

По смещению 0x40 в rmcDrawable и сабклассах находится массив из четырех указателей на указатель на CPtrCollection<grmGeometry>. Самое сложное в геометриях - это vertex declaration. Она разворачивается в стандартный FVF по таблице. Есть геометрии, у которых > 100 байт на вертекс.
You think your day was surreal? Try mine.

#8 Dageron

Dageron

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

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


Отправлено 09 August 2009 - 05:31

Если смотреть на прогресс развития Zmodeler2 то скоро появится функция импорта/экспорта WDR, начиная с оружия (как было заявлено Олегом на его же форуме). Это заставляет задуматься над тем, нужен ли вообще прямой конвертер *.xdr->.wdr для портирования нескольких десятков моделей с DLC.

В любом случае, теперь я могу импортировать в 3ds Max и vertex-ы с XDR моделей.
(
		 f1 = ReadFloat f -- x
		 f2 = ReadFloat f -- y
		 f3 = ReadFloat f -- z
		 f4 = ReadFloat f --  not sure
		 vr = ReadByte f #unsigned
		 vg = ReadByte f #unsigned
		 vb = ReadByte f #unsigned
		 va = ReadByte f #unsigned	
		 append verts [f1,f2,f3]		 
		 f5 = ReadFloat f -- Texcoord u
		 f6 = ReadFloat f --Texcoord v	  
		 format "[%, %, %, %] \n" vr vg vb va	
	 )

listener, не мог бы ты выложить оружие с DLC в распакованном виде на дропбокс (ну или на публику даже если хочешь, хотя оно мало кому нужно - все равно не доберутся до текущих разборов, а доберутся так может не так уж плохо это), а то мой lzx-распаковщик обрезает концы файлов. Хочется подтвердить догадки и дописать наконец соответствующий софт/скрипт для конвертирования всего в 3ds Max.
в проекте gtamodding.ru: декабрь 2008 - декабрь 2012

#9 listener

listener

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

  • Главные администраторы
  • PipPipPip
  • 356 сообщений
  • Пол:Мужчина
  • Город:Ft.Lauderdale


Отправлено 10 August 2009 - 14:38

Я сделал лучше: выложил свой распаковщик на dropbox
You think your day was surreal? Try mine.

#10 Dageron

Dageron

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

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


Отправлено 11 August 2009 - 06:59

Благодарю, теперь дело сдвинется. В общем теперь импортировать модели в макс можно, правда с текстурами никак не разберусь, точнее с uv maps. Самое сложное начинается в *.img-архивах где содержатся новые модели объектов карты. В каждом по несколько частей и эти части идут вперемешку с непонятными данными (шейдеры?). Короче работать еще и работатать... Все и сразу сконвертировать будет сложно.
в проекте gtamodding.ru: декабрь 2008 - декабрь 2012

#11 Dageron

Dageron

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

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


Отправлено 13 August 2009 - 12:16

Дописал наконец насколько это возможно шаблон 010 для работы с *.wdr, насколько имеющиеся описания позволяют. Просто удивляет огромное число многоуровневых коллекций. Многое сразу становится понятно - почему при импорте в макс авторами используются промежуточные форматы и вообще редактирование не развито (если даже на написание шаблона для чтения уходит несколько часов). Одно хорошо - теперь мне все понятно с "объявлением" данных gpu. Прикрепленный файл  010_WDR_Template.png   403.69К   18 загрузок Кому-нибудь пригодится этот шаблон? (выложу в вики если надо)
в проекте gtamodding.ru: декабрь 2008 - декабрь 2012

#12 listener

listener

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

  • Главные администраторы
  • PipPipPip
  • 356 сообщений
  • Пол:Мужчина
  • Город:Ft.Lauderdale


Отправлено 13 August 2009 - 12:36

Шаблон, разумеется, пригодится. Вот только, в свете свеженакопанного, там все чуточку не так. Плюс к тому, я-таки немного переписал свои старые исходники загрузчика, так что все стало единообразно. Я ввел два класса: pgPtr и pgObjectPtr. Первый из них - просто указатель, который правится в собственном же конструкторе, второй - правится и вызывает конструктор объекта, на который указывает. В пару к ним есть два массива: pgArray и pgObjectArray (раньше они назывались CSimpleCollection и CPtrCollection). Теперь, чтобы загрузить любой объект и любую структуру из RSC достаточно просто описания этой структуры. Весь код для правки указателей, генерируется компилятором автоматически. Сравнил результат с тем, что есть в .exe - получается практически идентично. С шаблонами для 010 чуть сложнее: там нет шаблонов ;) Поэтому приходится городить pgPtr_grcTexturePC вместо pgPtr<grcTexturePC>. И так для каждой комбинации типов. Сегодня-завтра, если будет минутка, попробую перетащить свежие структуры из базы в 010. PS. Касательно редактирования, импорта и экспорта. Я не думаю, что в R* подозревали, что найдутся маньяки, которые будут что-то делать с бинарной формой. Судя по сохранившимся остаткам кода, у них вся работа делается либо с .xml, либо с промежуточным текстовым форматом (пример которого можно увидеть в "GTA IV\common\data\fragments\"). А в бинарный вид все сбрасывается на последней фазе экспорта.

Сообщение отредактировал listener: 13 August 2009 - 12:42

You think your day was surreal? Try mine.

#13 Chipsman

Chipsman

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

  • Главные администраторы
  • PipPipPip
  • 786 сообщений
  • Пол:Не определился


Отправлено 13 August 2009 - 12:40

кто-нибудь знает зачем везде W-координата? (сначала думал что это ротейшн в виде кватерниона, но както не сходится(или может не нормирован?) ? )

#14 listener

listener

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

  • Главные администраторы
  • PipPipPip
  • 356 сообщений
  • Пол:Мужчина
  • Город:Ft.Lauderdale


Отправлено 13 August 2009 - 12:44

В большинстве случаев, это не W-координата. Это просто Vector3 содержит поле выравнивания (заполняемое случайным значением), чтобы можно было SSE использовать (чтобы получилось 128-бит занчение, выровненное на границу 16 байт)
You think your day was surreal? Try mine.

#15 Chipsman

Chipsman

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

  • Главные администраторы
  • PipPipPip
  • 786 сообщений
  • Пол:Не определился


Отправлено 13 August 2009 - 12:52

спс, буду знать

#16 Dageron

Dageron

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

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


Отправлено 13 August 2009 - 14:02

Выложил в вики текущую версию шаблона). Замечания и пожелания приветствуются.
в проекте gtamodding.ru: декабрь 2008 - декабрь 2012

#17 listener

listener

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

  • Главные администраторы
  • PipPipPip
  • 356 сообщений
  • Пол:Мужчина
  • Город:Ft.Lauderdale


Отправлено 13 August 2009 - 16:24

Текущая версия - это, конечно, хорошо. Но как-то там всего мало... У меня сейчас, без шейдерных групп, и геометрий (со всем находящимся в них барахлом) - уже 330 строк. В полном виде оно будет, как минимум, вдвое больше.
You think your day was surreal? Try mine.

#18 Chipsman

Chipsman

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

  • Главные администраторы
  • PipPipPip
  • 786 сообщений
  • Пол:Не определился


Отправлено 13 August 2009 - 17:02

очень ждем)

#19 listener

listener

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

  • Главные администраторы
  • PipPipPip
  • 356 сообщений
  • Пол:Мужчина
  • Город:Ft.Lauderdale


Отправлено 14 August 2009 - 01:04

Ну, вот оно. Из вкусного: есть vertex format (к нему нужны только D3DVERTEXDECLARATION9, соответствующие индексам), описан массив crBone (в котором есть неявное поле с размером, генерируемое компилятором). Нет тех структур, котоыре я пока не нашел. Вообще, еще есть куда расти. Можно, например, нормально описать параметры шейдеров. Этот же шаблон, с минимальными изменениями, можно использовать для wtd и wdd Прикрепленный файл  iv_wdr_07.rar   3.24К   16 загрузок
You think your day was surreal? Try mine.

#20 Dageron

Dageron

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

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


Отправлено 14 August 2009 - 10:28

Мне вот нравится что есть возможность локации grcTexture прямо в *.wdr (второе поле grmShaderGroup). С технической точки зрения должно быть удобно.

Немного посмотрел WBN. pgPtr_f8C дает некую структуру количеством wChildCount или же _f92.
struct vectors {
				Vector3 m_Vector3;	
				DWORD __pad_1C <format=hex>; 
				Vector3 m_Vector3;	
				DWORD __pad_1C <format=hex>;	 
};

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




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

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