DFF
Материал из GTAModding.ru
DFF (Dive File Format) — формат файлов движка RenderWare 3.x, использующийся в GTA 3, GTA VC, GTA SA, Manhunt и Bully для хранения трёхмерных моделей. Является кроссплатформенным.
DFF был разработан Criterion Games для RenderWare 3.0. После версии 3.2 развитие формата было остановлено, а расширения DFF осуществлялись только самими разработчиками игр с помощью плагинов. Несмотря на то, что в RenderWare 3.5 на смену устаревшего DFF был добавлен новый формат - RWS, в Rockstar North продолжали использовать DFF в GTA: San Andreas.
Содержание |
Основные данные
Все трёхмерные модели в играх на движке RenderWare закодированы в виде иерархически структурированных бинарных потоков. Бинарные потоки разделяются по принципу использования - на динамические (имеют расширение *.dff) и статические (*.bsp). В GTA специфика открытого мира предполагает использование только DFF (аналог BSP - формат WRLD используется только в GTA: LCS и VCS в силу аппаратных ограничений платформы PSP). Для просмотра и редактирования структуры DFF существует программа RW Analyze, автором которой является Steve M. Для работы с DFF в Autodesk 3ds Max используются KAM's Scripts или SA Tools (автор — DENISka). Импорт и экспорт DFF также присутствует в Zanoza Modeler.
Структура
Основной секцией бинарного потока DFF является Clump - объект рендеринга. Clump разделяется на секции:
- Frame - "скелет" модели и его положение в пространстве;
- Atomic - подчинённые узлам "скелета" составные части модели;
- GeometryList - (в DFF с версии 3.0.0.2) для поддержки скининга туда вынесена вся геометрия из секции Atomic;
- Light - (в DFF с версии 3.2.0.4) позиция и настройки источника освещения модели;
- Camera - (в DFF с версии 3.2.0.4) позиция и настройки для просмотра модели;
Каждая секция бинарного потока имеет универсальный заголовок, по которому происходит идентификация:
* (заголовок секции) 4 bytes - int - идентификатор секции 4 bytes - int - размер данных секции 4 bytes - hex - версия DFF/версия RenderWare * (данные секции) [размер данных секции] bytes - data - данные внутри секции
Идентификатор секции определяет, как данные должны быть обработаны. Список таких идентификаторов, определяющих иерархию компонентов DFF:
0х14 − rwID_ATOMIC - составная часть модели (тип RpAtomic) 0х05 − rwID_CAMERA - камера (тип RwCamera) 0х10 − rwID_CLUMP - Clump (тип RpClump) 0х0F − rwID_GEOMETRY - геометрия модели (тип RpGeometry) 0х18 − rwID_IMAGE - картинка (тип RwImage) 0х12 − rwID_LIGHT - источник освещения (тип RpLight) 0х07 − rwID_MATERIAL - материал модели (тип RpMaterial) 0х0D − rwID_MATRIX - матрица (тип RwMatrix) 0х16 − rwID_TEXDICTIONARY - список текстур (тип RwTexDictionary) 0х06 − rwID_TEXTURE - текстура (тип RwTexture) 0х0B − rwID_WORLD - мир/уровень (тип RpWorld) 0х29 − rwID_CHUNKGROUPSTART – старт группы Chunk (тип RwChunkGroup) 0х2A − rwID_CHUNKGROUPEND – конец группы Chunk (тип RwChunkGroup)
Полный список идентификаторов можно найти в этой статье.
По имени секции можно догадаться, что в ней хранится (например, rwDATA, что находится в rwGEOMETRY, содержит все вершины и нормали трёхмерных объектов, а rwDATA из секции rwGEOMETRYLIST содержит число и имена геометрических объектов).
Версии DFF
В заголовке секции можно найти закодированный номер SDK-версии RenderWare, под которую собран DFF-файл:
3.0.2 - 0x00000302 - остатки альфа-объектов GTA3, геометрия хранится в секции атомика (PlayStation 2) 3.0.4 - 0x00000304 - Grand Theft Auto III (PlayStation 2) 3.1.0 - 0x00000310 - Grand Theft Auto III (PlayStation 2, Windows (MultiDFF и Generic))
Начиная с RenderWare 3.1, был добавлен номер версии бинарного потока, по которому и стоит различать DFF при чтении (сама версия SDK тут уже особой роли не играет), тот же самый номер (всегда 0) присутствует и в версиях до 3.2, сохраняя совместимость (т.к. это место было зарезервировано).
3.1.0.1 - 0x0401FFFF - Grand Theft Auto III (Windows) 3.2.0.0 - 0x0800FFFF - Grand Theft Auto III (Windows) 3.5.0.0 - 0x1400FFFF - Grand Theft Auto III (Android) 3.3.0.2 - 0x0C02FFFF - Grand Theft Auto: Vice City (Windows) 3.4.0.3 - 0x1003FFFF - Grand Theft Auto III и Grand Theft Auto: Vice City (Xbox) 3.6.0.3 - 0x1803FFFF - Grand Theft Auto: San Andreas и Manhunt 3.4.0.5 - 0x1005FFFF - Grand Theft Auto: Vice City (Android) и Manhunt (???) 3.7.10.2 - 0x1C02000A - Bully (PlayStation 2) 3.7.101.2 - 0x1C020065 - Silent Hill Origins (PlayStation 2) 0x00746578 - Grand Theft Auto: LCS, Grand Theft Auto: VCS (т.к. уже не RenderWare)
Обработкой версии занимается функция RwEngineGetCurrentVersion. Значение версии разбивается на 3 числа:
- новая версия SDK (байт), значение которой делиться на 4 и к результату плюсуется 0х300 (максимальная версия = 3.9.5)
- версия бинарного потока (байт), для GTA самая старая - 0, самая последняя - 5 для Android-ов
- старая версия SDK (два байта), значение просто разбивается на 4 4-х битных числа, из которых первое отбрасывается (максимальная версия = 3.15.15)
Если значение старой версии = -1, то истинной считается новая версия SDK (исключая RenderWare 3.7, не поддерживающую форматы старой версии DFF).
Содержимое DFF
Секция Clump
Главная секция DFF, содержащая всю информацию о трёхмерной модели. Если в DFF хранится несколько моделей, то и Clump-ов будет так же несколько - они следуют один за другим без иерархии, образовывая т.н. Multi-DFF.
Clump → Struct
4 bytes - int - количество составных частей модели (секций Atomic в Clump) {IF RWver > 0x33000 and RWsize >= 12 THEN} 4 bytes - int - количество источников освещения (секций Light в Clump) 4 bytes - int - количество камер (секций Camera в Clump)
Секция Frame List
Подсекция Clump-а, хранит список всех фреймов модели (составные запчасти модели а-ля узлы "скелета", связанных друг с другом в виде иерархического дерева).
Frame List → Struct
4 bytes - int - общее количество фреймов модели (информация о фрейме) {ARRAY OF SIZE: [количество фреймов]} 36 bytes - float Rotation matrix (3 x 3) - матрица наклона фрейма в 3D 12 bytes - float Position XYZ (3) - координаты фрейма в 3D 4 bytes - int - номер родительского фрейма 4 bytes - int - указатель прародителя (используется для пропуска "виртуальных" фреймов) {END ARRAY}
Frame List → Extension → R* Frame [количество фреймов]
Расширение структуры фрейма от Rockstar North, содержащее его имя. Необходимо только для моделей, обращение к фреймам которой происходит по именам/суффиксам, для штатных моделей игры - не обязательна и может не записываться в DFF.
[Section Size] bytes - string - имя фрейма
Секция Geometry List
Подсекция Clump-а, хранит список всех геометрических объектов модели (собственно то, что игрок видит в игре)
Geometry List → Struct
4 bytes - int - количество геометрических объектов
Секция Geometry
Подсекция Geometry List, хранит саму геометрию объекта модели.
Geometry → Struct
(заголовок) 4 bytes - int - Format (см. ниже) 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 - имеет нормали
(вершины) {ARRAY OF SIZE: количество_вершин*12 bytes} 4 bytes - float - координата X 4 bytes - float - координата Y 4 bytes - float - координата 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 (или Material Split)
Расширение секции Geometry, дублирующее данные треугольников и идентификаторов материалов к ним, но хранящееся в оптимизированном для движка виде, поэтому аналогичные данные секции Geometry просто подменяются при загрузке DFF. Секция не является обязательной, поэтому DFF может работать и без неё.
(заголовок) 4 bytes - int - тип хранения треугольника (0 - Triangle List, 1 - Triangle Strip) 4 bytes - int - количество групп треугольников, отсортированных по материалу 4 bytes - int - общее количество идентификаторов вершин треугольников
Количество групп треугольников задаёт размер массива, который управляет структурой нижнего уровня. Структура элементов массива (TMaterialSplitData) соединяет индекс разделения материала с точками геометрии:
(информация о группах треугольников) {ARRAY OF SIZE: [заголовок → количество групп треугольников]} 4 bytes - int - индекс фейса 4 bytes - int - индекс материала (информация о вершинах) {ARRAY OF SIZE: [индекс полигона]} 4 bytes - int - веришина 1 {END ARRAY}
|конец секции|
Подсекция 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 NumTexCoorsCustom; // если это значение больше нуля, флаги Textured и Textured_2 // игнорируются. Позволяет указывать произвольное (1 - 8) кол-во текстурных координат. unsigned char GeometryNativeFlags; // 0x01 rpGEOMETRYNATIVE // 0x02 rpGEOMETRYNATIVEINSTANCE };
Флаги - значения, определяющие содержимое секции геометрии. Раскладываются на логические значения путём деления на 2 и проверки остатка (либо можно просто проверять каждый бит). Значения в итерациях:
Флаг | Двоичный вид | Имя | Описание |
---|---|---|---|
1 | 0000 0001 | TRISTRIP | TRUE - тип треугольников triangle strip (для оптимизации памяти), экспортируются скриптами Дениски.
FALSE - тип треугольников обычный. |
2 | 0000 0010 | POSITIONS | применять трансляцию вершин. |
4 | 0000 0100 | TEXTURED | в геометрии есть таблица UV Mapping level 1, для её экспорта опция UV в скриптах Кама должна быть включена. |
8 | 0000 1000 | PRELIT | в геометрии есть таблица Vertex Colors, для её экспорта опция VCol в скриптах Кама должна быть включена. |
16 | 0001 0000 | NORMALS | в геометрии есть таблица Normals, для её экспорта опция Nor в скриптах Кама должна быть включена. |
32 | 0010 0000 | LIGHT | применять динамическое освещение, задаваемое секцией Light. |
64 | 0100 0000 | MODULATEMATERIALCOLOR | применять цвет материала, опция MMC в скриптах Кама или Дениски должна быть включена. |
128 | 1000 0000 | TEXTURED2 | в геометрии есть секции 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|
Секция Atomic
Atomic → Struct
|начало секции|
4 bytes - int - номер родительского фрейма 4 bytes - int - номер дочерней геометрии 4 bytes - int - флаги (0x01 rpATOMICCOLLISIONTEST и 0x04 rpATOMICRENDER) 4 bytes - int - выравнивание (не используется)
|конец секции|
Форматы файлов | .bik • .bsp • .col • .dff • .grf • .gxt • .ifp • .inst • .fxp • .mls • .pak • .rib • .raw/.sdt/.lst • .scc • .spl • .txd |
Инструменты | Clump Viewer • Col-IO • Collision File Editor II • DFF Viewer • G-Tools • Kam's Max Scripts • PS2 TXD Mod PS2 TXD Viewer • RW Analyze • ViceTXD • TXD Workshop • ZModeler |