DFF — различия между версиями
Материал из GTAModding.ru
НикИТОС (обсуждение | вклад) |
|||
Строка 1: | Строка 1: | ||
− | + | '''DFF''' — формат файлов, использующийся Rockstar Games для хранения трёхмерных визуальных моделей в Grand Theft Auto III, Grand Theft Auto: Vice City, Grand Theft Auto: San Andreas и некоторых других RenderWare-играх. Является кроссплатформенным форматом. | |
− | + | ==Основные данные== | |
+ | Все трёхмерные модели в RenderWare-играх закодированы в виде [[RenderWare binary stream file|бинарных потоков]]. Все бинарные потоки с визуальными моделями имеют расширение [[DFF]] (для хранения отдельных объектов) или [[BSP]] (для хранения одного игрового уровня). Для просмотра и редактирования иерархии потоков [[DFF]] и [[BSP]] существует программа [[RW Analyze]], автором которой является Steve M. Для работы с DFF в Autodesk 3ds Max используются [[KAM's Scripts]] или [[SA Tools]] (автор — DENISka). Импорт и экспорт DFF также присутствует в Zanoza Modeler. | ||
− | == | + | ==Структура== |
− | + | В узлах иерархии бинарных потоков DFF расположены секции, в которых закодированы различные данные трёхмерных объектов: основные и дополнительные. В DFF можно найти секции специфичные для [[RenderWare]] секции и секции, написанные программистами Rockstar Games специально для определённой игры и расширяющие её возможности по сравнению со стандартным форматом RenderWare (Pipeline Set, Specular Material, 2DFX, Night Vertex Colors, Collision Model, Reflection Material, Mesh Extension, Frame). | |
− | + | Каждая секция имеет заголовок, по которому можно секцию идентифицировать: | |
− | + | ||
− | + | * (заголовок секции) | |
+ | 4 bytes - int - идентификатор секции | ||
+ | 4 bytes - int - размер секции | ||
+ | 4 bytes - hex - версия DFF | ||
+ | * (данные секции) | ||
+ | [размер секции] bytes - data - данные внутри секции | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
+ | Идентификатор секции определяет, как данные должны быть обработаны. Например, если идентификатор секции = rwDATA, rwSTRING, rwFRAME или rwMATERIALSPLIT, то для анализа секции нужно спуститься на один уровень вниз по иерархии — к данным, где расположены другие секции, как например здесь: | ||
− | + | *(заголовок секции) | |
− | + | ||
− | *( | + | |
4 bytes - int - rwCLUMP | 4 bytes - int - rwCLUMP | ||
4 bytes - int - 48 | 4 bytes - int - 48 | ||
2 bytes - int - Unknown | 2 bytes - int - Unknown | ||
2 bytes - int - 4099 | 2 bytes - int - 4099 | ||
− | *( | + | *(данные секции) |
− | ( | + | (заголовок секции) |
4 bytes - int - rwDATA | 4 bytes - int - rwDATA | ||
4 bytes - int - 8 | 4 bytes - int - 8 | ||
2 bytes - int - Unknown | 2 bytes - int - Unknown | ||
2 bytes - int - 4099 | 2 bytes - int - 4099 | ||
− | ( | + | (данные секции) |
4 bytes - int - Some Number | 4 bytes - int - Some Number | ||
4 bytes - int - Some Number | 4 bytes - int - Some Number | ||
− | ( | + | (заголовок секции) |
4 bytes - int - rwSTRING | 4 bytes - int - rwSTRING | ||
4 bytes - int - 16 | 4 bytes - int - 16 | ||
2 bytes - int - Unknown | 2 bytes - int - Unknown | ||
2 bytes - int - 4099 | 2 bytes - int - 4099 | ||
− | ( | + | (данные секции) |
16 bytes - string - Data | 16 bytes - string - Data | ||
Строка 60: | Строка 58: | ||
39056126 = rwFRAME | 39056126 = rwFRAME | ||
− | Полный список идентификаторов можно найти в | + | Полный список идентификаторов можно найти в [http://www.gtamodding.com/index.php?title=List_of_RW_section_IDs этой] статье. |
− | По имени секции можно догадаться, что в ней хранится (например | + | По имени секции можно догадаться, что в ней хранится (например, rwDATA, что находится в rwGEOMETRY, содержит все вершины и нормали трёхмерных объектов, а rwDATA из секции rwGEOMETRYLIST содержит число и имена геометрических объектов). |
− | === Версии DFF === | + | ===Версии DFF=== |
− | В заголовке секции можно найти | + | В заголовке секции можно найти закодированный номер версии RenderWare, под которую скомпилирован DFF-файл: |
− | 3.0.0.0 - 0x00000310 - только для | + | 3.0.0.0 - 0x00000310 - только для MultiDFF и Generic, остатки от ранних версий Grand Theft Auto III |
− | 3.2.0.0 - 0x0800FFFF - | + | 3.2.0.0 - 0x0800FFFF - Grand Theft Auto III (Sony PlayStation 2 и Microsoft Windows) |
− | 3.3.0.2 - 0x0C02FFFF - | + | 3.3.0.2 - 0x0C02FFFF - Grand Theft Auto: Vice City (Microsoft Windows) |
− | 3.4.0.3 - 0x1003FFFF - | + | 3.4.0.3 - 0x1003FFFF - Grand Theft Auto III и Grand Theft Auto: Vice City (Microsoft Xbox) |
− | 3.4.0.5 - 0x1005FFFF - | + | 3.4.0.5 - 0x1005FFFF - Grand Theft Auto: Vice City (Android) |
− | 3.5.0.0 - 0x1400FFFF - | + | 3.5.0.0 - 0x1400FFFF - Grand Theft Auto III (Android) |
− | 3.6.0.3 - 0x1803FFFF - | + | 3.6.0.3 - 0x1803FFFF - Grand Theft Auto: San Andreas и Manhunt |
− | === Содержимое DFF === | + | ===Содержимое DFF=== |
− | ==== Секция | + | ====Секция Clump==== |
− | Clump | + | Clump → Data |
− | | | + | |начало секции| |
− | 4 bytes - int - | + | 4 bytes - int - количество объектов |
− | | | + | |конец секции| |
− | ==== Секция | + | ====Секция Frame List==== |
− | Frame List | + | Frame List → Data |
− | | | + | |начало секции| |
− | 4 bytes - int - | + | 4 bytes - int - количество фреймов |
− | ( | + | (информация о фрейме) |
− | {ARRAY OF SIZE: [ | + | {ARRAY OF SIZE: [количество фреймов]} |
− | 36 bytes - float matrix (3 x 3) - | + | 36 bytes - float matrix (3 x 3) - матрица вращения |
− | 12 bytes - float - | + | 12 bytes - float - смещение координат |
− | 4 bytes - int - | + | 4 bytes - int - родительский фрейм |
− | 4 bytes - int - | + | 4 bytes - int - неизвестно |
{END ARRAY} | {END ARRAY} | ||
− | | | + | |конец секции| |
− | Frame List | + | Frame List → Frame |
− | | | + | |начало секции| |
− | [Section Size] bytes - string - | + | [Section Size] bytes - string - имя фрейма |
− | | | + | |конец секции| |
{| {{Таблица}} | {| {{Таблица}} | ||
|+ Стандартные фреймы транспорта | |+ Стандартные фреймы транспорта | ||
|- | |- | ||
− | ! Версия игры !! | + | ! Версия игры !! Фреймы !! Назначение |
|- | |- | ||
− | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Sa.png|16px]] [[Изображение:Lcs.png|16px]] [[Изображение:Vcs.png|16px]] || wheel_rf_dummy, wheel_rm_dummy, wheel_rb_dummy, wheel_lf_dummy, wheel_lm_dummy, wheel_lb_dummy || | + | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Sa.png|16px]] [[Изображение:Lcs.png|16px]] [[Изображение:Vcs.png|16px]] || wheel_rf_dummy, wheel_rm_dummy, wheel_rb_dummy, wheel_lf_dummy, wheel_lm_dummy, wheel_lb_dummy || Информационные узлы колёс; 3D-модели колёс грузятся из Wheels.DFF (Grand Theft Auto III, Grand Theft Auto: Vice City), из DFF-файла транспортного средства (Grand Theft Auto: San Andreas), из GAME.DTZ (Grand Theft Auto: San Andreas) |
|- | |- | ||
− | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Sa.png|16px]] [[Изображение:Lcs.png|16px]] [[Изображение:Vcs.png|16px]] || bump_front_dummy || | + | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Sa.png|16px]] [[Изображение:Lcs.png|16px]] [[Изображение:Vcs.png|16px]] || bump_front_dummy || Информационный узел заднего бампера |
|- | |- | ||
− | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Sa.png|16px]] [[Изображение:Lcs.png|16px]] [[Изображение:Vcs.png|16px]] || bonnet_dummy || | + | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Sa.png|16px]] [[Изображение:Lcs.png|16px]] [[Изображение:Vcs.png|16px]] || bonnet_dummy || Ось вращения капота |
|- | |- | ||
− | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Sa.png|16px]] [[Изображение:Lcs.png|16px]] [[Изображение:Vcs.png|16px]] || wing_rf_dummy, wing_rr_dummy, wing_lf_dummy, wing_lr_dummy || | + | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Sa.png|16px]] [[Изображение:Lcs.png|16px]] [[Изображение:Vcs.png|16px]] || wing_rf_dummy, wing_rr_dummy, wing_lf_dummy, wing_lr_dummy || Информационные узлы передних и задних «крыльев» автомобиля |
|- | |- | ||
− | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Sa.png|16px]] [[Изображение:Lcs.png|16px]] [[Изображение:Vcs.png|16px]] || door_rf_dummy, door_rr_dummy, door_lf_dummy, door_lr_dummy || | + | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Sa.png|16px]] [[Изображение:Lcs.png|16px]] [[Изображение:Vcs.png|16px]] || door_rf_dummy, door_rr_dummy, door_lf_dummy, door_lr_dummy || Информационные узлы передних и задних дверей |
|- | |- | ||
− | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Sa.png|16px]] [[Изображение:Lcs.png|16px]] [[Изображение:Vcs.png|16px]] || boot_dummy || | + | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Sa.png|16px]] [[Изображение:Lcs.png|16px]] [[Изображение:Vcs.png|16px]] || boot_dummy || Ось вращения багажника |
|- | |- | ||
− | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Sa.png|16px]] [[Изображение:Lcs.png|16px]] [[Изображение:Vcs.png|16px]] || bump_rear_dummy || | + | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Sa.png|16px]] [[Изображение:Lcs.png|16px]] [[Изображение:Vcs.png|16px]] || bump_rear_dummy || Информационный узел переднего бампера |
|- | |- | ||
− | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Sa.png|16px]] [[Изображение:Lcs.png|16px]] [[Изображение:Vcs.png|16px]] || windscreen_dummy || | + | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Sa.png|16px]] [[Изображение:Lcs.png|16px]] [[Изображение:Vcs.png|16px]] || windscreen_dummy || Информационный узел стекла переднего окна |
|- | |- | ||
− | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Sa.png|16px]] [[Изображение:Lcs.png|16px]] [[Изображение:Vcs.png|16px]] || ped_frontseat || | + | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Sa.png|16px]] [[Изображение:Lcs.png|16px]] [[Изображение:Vcs.png|16px]] || ped_frontseat || Расположение водителя и пассажира на передних сидениях |
|- | |- | ||
− | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Sa.png|16px]] [[Изображение:Lcs.png|16px]] [[Изображение:Vcs.png|16px]] || ped_backseat || | + | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Sa.png|16px]] [[Изображение:Lcs.png|16px]] [[Изображение:Vcs.png|16px]] || ped_backseat || Расположение пассажиров на заднем сидении |
|- | |- | ||
− | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Sa.png|16px]] [[Изображение:Lcs.png|16px]] [[Изображение:Vcs.png|16px]] || headlights || | + | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Sa.png|16px]] [[Изображение:Lcs.png|16px]] [[Изображение:Vcs.png|16px]] || headlights || Переднее освещение (фары) |
|- | |- | ||
− | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Sa.png|16px]] [[Изображение:Lcs.png|16px]] [[Изображение:Vcs.png|16px]] || taillights || | + | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Sa.png|16px]] [[Изображение:Lcs.png|16px]] [[Изображение:Vcs.png|16px]] || taillights || Задние габаритные огни |
|- | |- | ||
− | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Sa.png|16px]] [[Изображение:Lcs.png|16px]] [[Изображение:Vcs.png|16px]] || exhaust || | + | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Sa.png|16px]] [[Изображение:Lcs.png|16px]] [[Изображение:Vcs.png|16px]] || exhaust || Информационный узел дыма выхлопной трубы |
|- | |- | ||
− | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Sa.png|16px]] [[Изображение:Lcs.png|16px]] [[Изображение:Vcs.png|16px]] || extra1, extra2, extra3, extra4, extra5, extra6 || | + | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Sa.png|16px]] [[Изображение:Lcs.png|16px]] [[Изображение:Vcs.png|16px]] || extra1, extra2, extra3, extra4, extra5, extra6 || Дополнительные части авто, появляющиеся от случая к случаю |
|- | |- | ||
| || || | | || || | ||
Строка 196: | Строка 194: | ||
| [[Изображение:Lcs.png|16px]] || car4_dummy || | | [[Изображение:Lcs.png|16px]] || car4_dummy || | ||
|- | |- | ||
− | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Lcs.png|16px]] || chassis_dummy || | + | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Lcs.png|16px]] || chassis_dummy || Информационный узел кузова |
|- | |- | ||
| [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Lcs.png|16px]] || toprotor || | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Lcs.png|16px]] || toprotor || | ||
Строка 236: | Строка 234: | ||
| || || | | || || | ||
|- | |- | ||
− | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Sa.png|16px]] [[Изображение:Lcs.png|16px]] [[Изображение:Vcs.png|16px]] || _dam || | + | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Sa.png|16px]] [[Изображение:Lcs.png|16px]] [[Изображение:Vcs.png|16px]] || _dam || Суффикс, маркирующий повреждённую деталь транспорта |
|- | |- | ||
− | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Sa.png|16px]] [[Изображение:Lcs.png|16px]] [[Изображение:Vcs.png|16px]] || _ok || | + | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Sa.png|16px]] [[Изображение:Lcs.png|16px]] [[Изображение:Vcs.png|16px]] || _ok || Суффикс, маркирующий неповреждённую деталь транспорта |
|- | |- | ||
− | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Sa.png|16px]] [[Изображение:Lcs.png|16px]] [[Изображение:Vcs.png|16px]] || _hi || | + | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Sa.png|16px]] [[Изображение:Lcs.png|16px]] [[Изображение:Vcs.png|16px]] || _hi || Суффикс, маркирующий высокодетализированную часть транспорта |
|- | |- | ||
| [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Sa.png|16px]] [[Изображение:Lcs.png|16px]] [[Изображение:Vcs.png|16px]] || extra || | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Sa.png|16px]] [[Изображение:Lcs.png|16px]] [[Изображение:Vcs.png|16px]] || extra || | ||
|- | |- | ||
− | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Sa.png|16px]] [[Изображение:Lcs.png|16px]] [[Изображение:Vcs.png|16px]] || _lo || | + | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Sa.png|16px]] [[Изображение:Lcs.png|16px]] [[Изображение:Vcs.png|16px]] || _lo || Суффикс, маркирующей низкодетализированную часть транспорта |
|- | |- | ||
− | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Sa.png|16px]] [[Изображение:Lcs.png|16px]] [[Изображение:Vcs.png|16px]] || _vlo || | + | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Sa.png|16px]] [[Изображение:Lcs.png|16px]] [[Изображение:Vcs.png|16px]] || _vlo || Суффикс, маркирующий низкодетализированную модель транспорта |
|- | |- | ||
| [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Sa.png|16px]] [[Изображение:Lcs.png|16px]] [[Изображение:Vcs.png|16px]] || boat_hi || | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Sa.png|16px]] [[Изображение:Lcs.png|16px]] [[Изображение:Vcs.png|16px]] || boat_hi || | ||
Строка 252: | Строка 250: | ||
|} | |} | ||
− | ==== Секция | + | ====Секция Geometry List==== |
− | Geometry List | + | Geometry List → Data |
− | | | + | |начало секции| |
− | 4 bytes - int - | + | 4 bytes - int - количество геометрических объектов |
− | | | + | |конец секции| |
− | Geometry List | + | Geometry List → Material Split |
− | | | + | |начало секции| |
− | ( | + | (заголовок) |
4 bytes - int - Triangle Strip | 4 bytes - int - Triangle Strip | ||
− | 4 bytes - int - | + | 4 bytes - int - количество разделений |
− | 4 bytes - int - | + | 4 bytes - int - количество полигонов |
− | ( | + | (информация о разделении) |
− | {ARRAY OF SIZE: [ | + | {ARRAY OF SIZE: [заголовок → количество разделений]} |
− | 4 bytes - int - | + | 4 bytes - int - индекс полигона |
− | 4 bytes - int - | + | 4 bytes - int - индекс материала |
− | ( | + | (информация о вершинах) |
− | {ARRAY OF SIZE: [ | + | {ARRAY OF SIZE: [индекс полигона]} |
− | 4 bytes - int - | + | 4 bytes - int - веришина 1 |
{END ARRAY} | {END ARRAY} | ||
− | | | + | |конец секции| |
− | ==== Секция | + | ====Секция Geometry==== |
− | ( | + | (заголовок) |
− | 4 bytes - int - | + | 4 bytes - int - формат |
− | 4 bytes - int - | + | 4 bytes - int - количество полигонов |
− | 4 bytes - int - | + | 4 bytes - int - количество вершин |
− | 4 bytes - int - | + | 4 bytes - int - количество фреймов |
− | ( | + | (заголовок подсекции освещения) |
{IF RWver = 3.0.0.0 THEN} | {IF RWver = 3.0.0.0 THEN} | ||
− | 4 bytes - float - | + | 4 bytes - float - равномерное |
− | 4 bytes - float - | + | 4 bytes - float - рассеянное |
− | 4 bytes - float - | + | 4 bytes - float - зеркальное |
{END IF} | {END IF} | ||
− | ( | + | (цвета точек) |
{IF Prelit=1 in flags THEN} | {IF Prelit=1 in flags THEN} | ||
− | {ARRAY OF SIZE = | + | {ARRAY OF SIZE = количество_точек*4 bytes} |
− | 1 byte - byte - | + | 1 byte - byte - красный |
− | 1 byte - byte - | + | 1 byte - byte - зелёный |
− | 1 byte - byte - | + | 1 byte - byte - голубой |
− | 1 byte - byte - | + | 1 byte - byte - альфа |
{END ARRAY} | {END ARRAY} | ||
{END IF} | {END IF} | ||
− | ( | + | (уровень UV-преобразования 1) |
{IF Textured=1 or Textured_2=1 in flags THEN} | {IF Textured=1 or Textured_2=1 in flags THEN} | ||
− | {ARRAY OF SIZE: | + | {ARRAY OF SIZE: количество_точек*8 bytes} |
4 bytes - float - U | 4 bytes - float - U | ||
4 bytes - float - V | 4 bytes - float - V | ||
Строка 314: | Строка 312: | ||
{END IF} | {END IF} | ||
− | ( | + | (уровень UV-преобразования 2) |
{IF Textured_2=1 in flags THEN} | {IF Textured_2=1 in flags THEN} | ||
− | {ARRAY OF SIZE: | + | {ARRAY OF SIZE: количество_точек*8 bytes} |
4 bytes - float - U | 4 bytes - float - U | ||
4 bytes - float - V | 4 bytes - float - V | ||
Строка 322: | Строка 320: | ||
{END IF} | {END IF} | ||
− | ( | + | (уровень UV-преобразования 3) |
{IF Textured_2=1 in flags THEN} | {IF Textured_2=1 in flags THEN} | ||
− | {ARRAY OF SIZE: | + | {ARRAY OF SIZE: количество_точек*8 bytes} |
4 bytes - float - U | 4 bytes - float - U | ||
4 bytes - float - V | 4 bytes - float - V | ||
Строка 330: | Строка 328: | ||
{END IF} | {END IF} | ||
− | ( | + | (полигоны) |
− | {ARRAY OF SIZE: | + | {ARRAY OF SIZE: количество_точек*8 bytes} |
− | 2 bytes - int - | + | 2 bytes - int - точка 2 |
− | 2 bytes - int - | + | 2 bytes - int - точка 1 |
− | 2 bytes - int - | + | 2 bytes - int - альфа вершины |
− | 2 bytes - int - | + | 2 bytes - int - точка 3 |
{END ARRAY} | {END ARRAY} | ||
− | ( | + | (ограничивающая сфера) |
− | 4 bytes - float - | + | 4 bytes - float - координата X |
− | 4 bytes - float - | + | 4 bytes - float - координата Y |
− | 4 bytes - float - | + | 4 bytes - float - координата Z |
− | 4 bytes - float - | + | 4 bytes - float - радиус |
− | 4 bytes - int - | + | 4 bytes - int - имеет позицию |
− | 4 bytes - int - | + | 4 bytes - int - имеет нормали |
('''Verticles''') | ('''Verticles''') | ||
Строка 353: | Строка 351: | ||
{END ARRAY} | {END ARRAY} | ||
− | ( | + | (нормали) |
{IF Normals=1 in Flags THEN} | {IF Normals=1 in Flags THEN} | ||
− | {ARRAY OF SIZE: | + | {ARRAY OF SIZE: количество_точек*12 bytes} |
− | 4 bytes - float - | + | 4 bytes - float - координата X |
− | 4 bytes - float - | + | 4 bytes - float - координата Y |
− | 4 bytes - float - | + | 4 bytes - float - координата Z |
{END ARRAY} | {END ARRAY} | ||
{END IF} | {END IF} | ||
− | ===== Подсекция Bin Mesh PLG ===== | + | =====Подсекция Bin Mesh PLG===== |
4 bytes - int - Face type (Apparently always 1, representing a triangle strip) | 4 bytes - int - Face type (Apparently always 1, representing a triangle strip) | ||
− | 4 bytes - int - | + | 4 bytes - int - количество разделений материала |
− | 4 bytes - int - | + | 4 bytes - int - количество полигонов |
− | + | Количество разделений материала задаёт размер массива, который управляет структурой нижнего уровня. Структура элементов массива (''TMaterialSplitData'') соединяет индекс разделения материала с точками геометрии: | |
4 bytes - int - Number of vertices | 4 bytes - int - Number of vertices | ||
Строка 376: | Строка 374: | ||
− | ===== Подсекция Native Data PLG ===== | + | =====Подсекция Native Data PLG===== |
− | ( | + | (заголовок секции) |
4 bytes - int - 5 | 4 bytes - int - 5 | ||
4 bytes - hex - VertexOffset | 4 bytes - hex - VertexOffset | ||
Строка 388: | Строка 386: | ||
4 bytes - hex - 0x164314 | 4 bytes - hex - 0x164314 | ||
− | ( | + | (заголовок материала) |
4 bytes - int - 0 | 4 bytes - int - 0 | ||
4 bytes - int - unknow1 | 4 bytes - int - unknow1 | ||
Строка 463: | Строка 461: | ||
// 0x02 rpGEOMETRYNATIVEINSTANCE | // 0x02 rpGEOMETRYNATIVEINSTANCE | ||
}; | }; | ||
− | ''' | + | '''Флаги''' - значения, определяющие содержимое секции геометрии. Раскладываются на логические значения путём деления на 2 и проверки остатка (либо можно просто проверять каждый бит). Значения в итерациях: |
{| {{Таблица}} | {| {{Таблица}} | ||
Строка 536: | Строка 534: | ||
|SECTION END| | |SECTION END| | ||
− | |||
− | |||
{{GTA3-navi}} | {{GTA3-navi}} | ||
[[Категория:Форматы файлов]][[Категория:GTA 3]][[Категория:GTA VC]][[Категория:GTA SA]] | [[Категория:Форматы файлов]][[Категория:GTA 3]][[Категория:GTA VC]][[Категория:GTA SA]] |
Версия 11:35, 24 июля 2013
DFF — формат файлов, использующийся Rockstar Games для хранения трёхмерных визуальных моделей в Grand Theft Auto III, Grand Theft Auto: Vice City, Grand Theft Auto: San Andreas и некоторых других RenderWare-играх. Является кроссплатформенным форматом.
Содержание |
Основные данные
Все трёхмерные модели в RenderWare-играх закодированы в виде бинарных потоков. Все бинарные потоки с визуальными моделями имеют расширение DFF (для хранения отдельных объектов) или BSP (для хранения одного игрового уровня). Для просмотра и редактирования иерархии потоков DFF и BSP существует программа RW Analyze, автором которой является Steve M. Для работы с DFF в Autodesk 3ds Max используются KAM's Scripts или SA Tools (автор — DENISka). Импорт и экспорт DFF также присутствует в Zanoza Modeler.
Структура
В узлах иерархии бинарных потоков DFF расположены секции, в которых закодированы различные данные трёхмерных объектов: основные и дополнительные. В DFF можно найти секции специфичные для RenderWare секции и секции, написанные программистами Rockstar Games специально для определённой игры и расширяющие её возможности по сравнению со стандартным форматом RenderWare (Pipeline Set, Specular Material, 2DFX, Night Vertex Colors, Collision Model, Reflection Material, Mesh Extension, Frame).
Каждая секция имеет заголовок, по которому можно секцию идентифицировать:
* (заголовок секции) 4 bytes - int - идентификатор секции 4 bytes - int - размер секции 4 bytes - hex - версия DFF * (данные секции) [размер секции] bytes - data - данные внутри секции
Идентификатор секции определяет, как данные должны быть обработаны. Например, если идентификатор секции = rwDATA, rwSTRING, rwFRAME или rwMATERIALSPLIT, то для анализа секции нужно спуститься на один уровень вниз по иерархии — к данным, где расположены другие секции, как например здесь:
*(заголовок секции) 4 bytes - int - rwCLUMP 4 bytes - int - 48 2 bytes - int - Unknown 2 bytes - int - 4099 *(данные секции) (заголовок секции) 4 bytes - int - rwDATA 4 bytes - int - 8 2 bytes - int - Unknown 2 bytes - int - 4099 (данные секции) 4 bytes - int - Some Number 4 bytes - int - Some Number
(заголовок секции) 4 bytes - int - rwSTRING 4 bytes - int - 16 2 bytes - int - Unknown 2 bytes - int - 4099 (данные секции) 16 bytes - string - Data
Список таких идентификаторов, определяющих иерархию компонентов DFF:
1 = rwDATA 2 = rwSTRING 3 = rwEXTENSION 6 = rwTEXTURE 7 = rwMATERIAL 8 = rwMATERIALLIST 14 = rwFRAMELIST 15 = rwGEOMETRY 16 = rwCLUMP 20 = rwATOMIC 26 = rwGEOMETRYLIST 1294 = rwMATERIALSPLIT 39056126 = rwFRAME
Полный список идентификаторов можно найти в этой статье.
По имени секции можно догадаться, что в ней хранится (например, rwDATA, что находится в rwGEOMETRY, содержит все вершины и нормали трёхмерных объектов, а rwDATA из секции rwGEOMETRYLIST содержит число и имена геометрических объектов).
Версии DFF
В заголовке секции можно найти закодированный номер версии RenderWare, под которую скомпилирован DFF-файл:
3.0.0.0 - 0x00000310 - только для MultiDFF и Generic, остатки от ранних версий Grand Theft Auto III 3.2.0.0 - 0x0800FFFF - Grand Theft Auto III (Sony PlayStation 2 и Microsoft Windows) 3.3.0.2 - 0x0C02FFFF - Grand Theft Auto: Vice City (Microsoft Windows) 3.4.0.3 - 0x1003FFFF - Grand Theft Auto III и Grand Theft Auto: Vice City (Microsoft Xbox) 3.4.0.5 - 0x1005FFFF - Grand Theft Auto: Vice City (Android) 3.5.0.0 - 0x1400FFFF - Grand Theft Auto III (Android) 3.6.0.3 - 0x1803FFFF - Grand Theft Auto: San Andreas и Manhunt
Содержимое DFF
Секция Clump
Clump → Data
|начало секции|
4 bytes - int - количество объектов
|конец секции|
Секция Frame List
Frame List → Data
|начало секции|
4 bytes - int - количество фреймов (информация о фрейме) {ARRAY OF SIZE: [количество фреймов]} 36 bytes - float matrix (3 x 3) - матрица вращения 12 bytes - float - смещение координат 4 bytes - int - родительский фрейм 4 bytes - int - неизвестно {END ARRAY}
|конец секции|
Frame List → Frame
|начало секции|
[Section Size] bytes - string - имя фрейма
|конец секции|
Секция Geometry List
Geometry List → Data
|начало секции|
4 bytes - int - количество геометрических объектов
|конец секции|
Geometry List → Material Split
|начало секции|
(заголовок) 4 bytes - int - Triangle Strip 4 bytes - int - количество разделений 4 bytes - int - количество полигонов (информация о разделении) {ARRAY OF SIZE: [заголовок → количество разделений]} 4 bytes - int - индекс полигона 4 bytes - int - индекс материала (информация о вершинах) {ARRAY OF SIZE: [индекс полигона]} 4 bytes - int - веришина 1 {END ARRAY}
|конец секции|
Секция Geometry
(заголовок) 4 bytes - int - формат 4 bytes - int - количество полигонов 4 bytes - int - количество вершин 4 bytes - int - количество фреймов
(заголовок подсекции освещения) {IF RWver = 3.0.0.0 THEN} 4 bytes - float - равномерное 4 bytes - float - рассеянное 4 bytes - float - зеркальное {END IF}
(цвета точек) {IF Prelit=1 in flags THEN} {ARRAY OF SIZE = количество_точек*4 bytes} 1 byte - byte - красный 1 byte - byte - зелёный 1 byte - byte - голубой 1 byte - byte - альфа {END ARRAY} {END IF}
(уровень UV-преобразования 1) {IF Textured=1 or Textured_2=1 in flags THEN} {ARRAY OF SIZE: количество_точек*8 bytes} 4 bytes - float - U 4 bytes - float - V {END ARRAY} {END IF}
(уровень UV-преобразования 2) {IF Textured_2=1 in flags THEN} {ARRAY OF SIZE: количество_точек*8 bytes} 4 bytes - float - U 4 bytes - float - V {END ARRAY} {END IF}
(уровень UV-преобразования 3) {IF Textured_2=1 in flags THEN} {ARRAY OF SIZE: количество_точек*8 bytes} 4 bytes - float - U 4 bytes - float - V {END ARRAY} {END IF}
(полигоны) {ARRAY OF SIZE: количество_точек*8 bytes} 2 bytes - int - точка 2 2 bytes - int - точка 1 2 bytes - int - альфа вершины 2 bytes - int - точка 3 {END ARRAY}
(ограничивающая сфера) 4 bytes - float - координата X 4 bytes - float - координата Y 4 bytes - float - координата Z 4 bytes - float - радиус 4 bytes - int - имеет позицию 4 bytes - int - имеет нормали
(Verticles) {ARRAY OF SIZE: Vertex Count*12 bytes} 4 bytes - float - Coordinate X 4 bytes - float - Coordinate Y 4 bytes - float - Coordinate Z {END ARRAY}
(нормали) {IF Normals=1 in Flags THEN} {ARRAY OF SIZE: количество_точек*12 bytes} 4 bytes - float - координата X 4 bytes - float - координата Y 4 bytes - float - координата Z {END ARRAY} {END IF}
Подсекция Bin Mesh PLG
4 bytes - int - Face type (Apparently always 1, representing a triangle strip) 4 bytes - int - количество разделений материала 4 bytes - int - количество полигонов
Количество разделений материала задаёт размер массива, который управляет структурой нижнего уровня. Структура элементов массива (TMaterialSplitData) соединяет индекс разделения материала с точками геометрии:
4 bytes - int - Number of vertices 4 bytes - int - Material index X bytes - - Array of DWORDs, each entry representing an vertex index. Array size gets defined by the number of vertices
Подсекция Native Data PLG
(заголовок секции) 4 bytes - int - 5 4 bytes - hex - VertexOffset 2 bytes - int - VertexUnknow 2 bytes - int - MaterialCount 4 bytes - int - 6 4 bytes - int - VertexCount 4 bytes - int - 32 4 bytes - hex - 0x164314
(заголовок материала) 4 bytes - int - 0 4 bytes - int - unknow1 4 bytes - int - unknow2
(Material tristrips info) {ARRAY OF SIZE: MaterialCount*24 bytes} 4 bytes - int - MaterialCount.VertexCountStart 4 bytes - int - MaterialCount.VertexCountEnd 4 bytes - int - MaterialCount.TristripsCount 4 bytes - int - MaterialCount.UnknowCount 4 bytes - hex - Unknow3 (in fist = 0x17AB78) 4 bytes - hex - 0x19ED91 {END ARRAY}
(Padding) {ARRAY OF SIZE: 16 - (12+MaterialCount*24 bytes) mod 16} 1 byte - hex - 0xCD {END ARRAY}
(Tristrips) {ARRAY OF SIZE: MaterialCount.TristripsCount*2 bytes} 2 bytes - int - Vertex {END ARRAY}
(Padding) {ARRAY OF SIZE: unknow} 1 byte - hex - 0xCD {END ARRAY}
(Verticles) {ARRAY OF SIZE: Vertex Count*(24 or 32) bytes} 4 bytes - float - Coordinate X 4 bytes - float - Coordinate Y 4 bytes - float - Coordinate Z 1 byte - int - Color R 1 byte - int - Color G 1 byte - int - Color B 1 byte - int - Color Alpha 4 bytes - float - U 4 bytes - float - V {IF Textured_2=1 in flags THEN} 4 bytes - float - U 4 bytes - float - V {END IF} {END ARRAY}
(Padding) {ARRAY OF SIZE: unknow} 1 byte - hex - 0xCD {END ARRAY}
(Normals) {IF Normals=1 in Flags THEN} {ARRAY OF SIZE: Vertex Count*12 bytes} 4 bytes - float - Coordinate X 4 bytes - float - Coordinate Y 4 bytes - float - Coordinate Z {END ARRAY} {END IF}
(Padding) {ARRAY OF SIZE: unknow} 1 byte - hex - 0xCD {END ARRAY}
Format - определяет формат геометрии.
struct GeometryFormat{ unsigned short Flags; // флаги, см. ниже unsigned char NumTexCoors; // если это значение больше нуля, флаги Textured и Textured_2 // игнорируются. Позволяет указывать кол-во текстурных координат. unsigned char GeometryNativeFlags; // 0x01 rpGEOMETRYNATIVE // 0x02 rpGEOMETRYNATIVEINSTANCE };
Флаги - значения, определяющие содержимое секции геометрии. Раскладываются на логические значения путём деления на 2 и проверки остатка (либо можно просто проверять каждый бит). Значения в итерациях:
Флаг | Двоичный вид | Имя | Описание |
---|---|---|---|
1 | 0000 0001 | rpWORLDTRISTRIP | на модели используются Triangle strip (обычно в DFF начиная с версии 3.4), экспортируются скриптами Дениски. |
2 | 0000 0010 | Meshes | в геометрии есть секции Verticles и Faces |
4 | 0000 0100 | rpWORLDTEXTURED | в геометрии есть секция UV Mapping level 1, для экспорта опция UV в скриптах Кама должна быть включена |
8 | 0000 1000 | rpWORLDPRELIT | в геометрии есть секция Vertex Colors, для экспорта опция VCol в скриптах Кама должна быть включена |
16 | 0001 0000 | rpWORLDNORMALS | в геометрии есть секция Normals, для экспорта опция Nor в скриптах Кама должна быть включена |
32 | 0010 0000 | rpWORLDLIGHT | определяет некий dynamic vertex lightning |
64 | 0100 0000 | rpWORLDMODULATEMATERIALCOLOR | цвет материала, для экспорта опция MMC в скриптах Кама или Дениски должна быть включена |
128 | 1000 0000 | Textured_2 | в геометрии есть секции UV Mapping level 1, UV Mapping level 2 и UV Mapping level 3, экспорт поддерживается только официальным экспортёром в DFF от Criterion Games. |
Section: Material List
Material List - Data
|SECTION START|
4 bytes - int - Material Count
|SECTION END|
Section: Material
Material - Data
|SECTION START|
4 bytes - int - Unknown 4 bytes - RGBA - Colour 4 bytes - int - Unknown 4 bytes - int - Texture Count 4 bytes - float - Unknown 4 bytes - float - Unknown 4 bytes - float - Unknown
|SECTION END|
Section: Texture
Texture - Data
|SECTION START|
2 bytes - int - Texture Filter Mode Flags 2 bytes - int - Unknown
|SECTION END|
Section: Atomic
Atomic - Data
|SECTION START|
4 bytes - int - Frame Number 4 bytes - int - Geometry Number 4 bytes - int - Unknown 4 bytes - int - Unknown
|SECTION END|