WDR
#1
Отправлено 07 August 2009 - 09:54
#2
Отправлено 07 August 2009 - 10:11
Весь смысл в том чтобы сконвертировать *.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
#3
Отправлено 07 August 2009 - 18:04
#4
Отправлено 08 August 2009 - 00:22
#5
Отправлено 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 модель, скажу что получилось.
#6
Отправлено 08 August 2009 - 09:19
Теперь можно полностью извлечь из x360 моделей геометрию (достаточно узнать начало и конец блока данных, но это как я уже говорил, не сложно), с вертексами пока ничего вообще не понятно. Написал небольшую программку для удобного извлечения данных и endian-convert (в геометрии каждые два байта меняются местами так как там short, в вертексах каждые четыре так как там float).
Размер массива вертексов на x360 приблизительно в два раза меньше чем на ПК, предположительно он содержит меньше float-значений и они идут в другом порядке. Хотелось бы что-нибудь узнать по этому поводу.
Еще появилась хорошая информация по *.wdr: на англовики.
#7
Отправлено 08 August 2009 - 13:04
#8
Отправлено 09 August 2009 - 05:31
В любом случае, теперь я могу импортировать в 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.
#9
Отправлено 10 August 2009 - 14:38
#10
Отправлено 11 August 2009 - 06:59
#11
Отправлено 13 August 2009 - 12:16
#12
Отправлено 13 August 2009 - 12:36
Сообщение отредактировал listener: 13 August 2009 - 12:42
#13
Отправлено 13 August 2009 - 12:40
#14
Отправлено 13 August 2009 - 12:44
#15
Отправлено 13 August 2009 - 12:52
#16
Отправлено 13 August 2009 - 14:02
#17
Отправлено 13 August 2009 - 16:24
#18
Отправлено 13 August 2009 - 17:02
#19
Отправлено 14 August 2009 - 01:04
#20
Отправлено 14 August 2009 - 10:28
Немного посмотрел WBN. pgPtr_f8C дает некую структуру количеством wChildCount или же _f92.
struct vectors { Vector3 m_Vector3; DWORD __pad_1C <format=hex>; Vector3 m_Vector3; DWORD __pad_1C <format=hex>; };
Количество пользователей, читающих эту тему: 3
0 пользователей, 3 гостей, 0 анонимных