DFF — различия между версиями
Материал из GTAModding.ru
(не показаны 33 промежуточные версии 7 участников) | |||
Строка 1: | Строка 1: | ||
− | + | '''DFF''' (Dive File Format) — формат файлов движка [[RenderWare]] 3.x, использующийся в [[GTA 3]], [[GTA VC]], [[GTA SA]], [[Manhunt]] и Bully для хранения трёхмерных моделей. Является кроссплатформенным. | |
− | '''DFF''' | + | |
− | + | DFF был разработан Criterion Games для RenderWare 3.0. После версии 3.2 развитие формата было остановлено, а расширения DFF осуществлялись только самими разработчиками игр с помощью плагинов. Несмотря на то, что в RenderWare 3.5 на смену устаревшего DFF был добавлен новый формат - RWS, в [[Rockstar North]] продолжали использовать DFF в GTA: San Andreas. | |
− | + | ||
− | == | + | ==Основные данные== |
− | + | Все трёхмерные модели в играх на движке [[RenderWare]] закодированы в виде [[RenderWare binary stream file|иерархически структурированных бинарных потоков]]. Бинарные потоки разделяются по принципу использования - на динамические (имеют расширение *.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) | ||
− | + | Полный список идентификаторов можно найти в [http://gtamods.com/wiki/List_of_RW_section_IDs этой] статье. | |
− | + | По имени секции можно догадаться, что в ней хранится (например, 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. | + | 3.1.0.1 - 0x0401FFFF - Grand Theft Auto III (Windows) |
− | 3. | + | 3.2.0.0 - 0x0800FFFF - Grand Theft Auto III (Windows) |
− | 3. | + | 3.5.0.0 - 0x1400FFFF - Grand Theft Auto III (Android) |
− | 3.3.0.2 - 0x0C02FFFF ( | + | 3.3.0.2 - 0x0C02FFFF - Grand Theft Auto: Vice City (Windows) |
− | 3.4.0.3 - 0x1003FFFF ( | + | 3.4.0.3 - 0x1003FFFF - Grand Theft Auto III и Grand Theft Auto: Vice City (Xbox) |
− | 3.6.0.3 - 0x1803FFFF ( | + | 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 | + | ====Секция 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 | + | Frame List → Struct |
− | + | ||
− | + | ||
− | 4 bytes - int - | + | 4 bytes - int - общее количество фреймов модели |
− | ( | + | (информация о фрейме) |
− | {ARRAY OF SIZE: [ | + | {ARRAY OF SIZE: [количество фреймов]} |
− | 36 bytes - float matrix (3 x 3) - | + | 36 bytes - float Rotation matrix (3 x 3) - матрица наклона фрейма в 3D |
− | 12 bytes - float - | + | 12 bytes - float Position XYZ (3) - координаты фрейма в 3D |
− | 4 bytes - int - | + | 4 bytes - int - номер родительского фрейма |
− | 4 bytes - int - | + | 4 bytes - int - указатель прародителя (используется для пропуска "виртуальных" фреймов) |
{END ARRAY} | {END ARRAY} | ||
− | + | Frame List → Extension → R* Frame [количество фреймов] | |
− | + | Расширение структуры фрейма от Rockstar North, содержащее его имя. Необходимо только для моделей, обращение к фреймам которой происходит по именам/суффиксам, для штатных моделей игры - не обязательна и может не записываться в DFF. | |
− | + | [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 || Информационные узлы колёс; 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]] || 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]] || 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]] || 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]] || 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]] || 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]] || 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]] [[Изображение:Lcs.png|16px]] || boat_moving_hi || | ||
+ | |- | ||
+ | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Lcs.png|16px]] || boat_rudder_hi || | ||
+ | |- | ||
+ | | [[Изображение:Vc.png|16px]] [[Изображение:Lcs.png|16px]] || boat_flap_left || | ||
+ | |- | ||
+ | | [[Изображение:Vc.png|16px]] [[Изображение:Lcs.png|16px]] || boat_flap_right || | ||
+ | |- | ||
+ | | [[Изображение:Vc.png|16px]] [[Изображение:Lcs.png|16px]] || boat_rearflap_left || | ||
+ | |- | ||
+ | | [[Изображение:Vc.png|16px]] [[Изображение:Lcs.png|16px]] || boat_rearflap_right || | ||
+ | |- | ||
+ | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Lcs.png|16px]] || windscreen || | ||
+ | |- | ||
+ | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Lcs.png|16px]] || door_lhs_dummy || | ||
+ | |- | ||
+ | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Lcs.png|16px]] || door_rhs_dummy || | ||
+ | |- | ||
+ | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Lcs.png|16px]] || light_front || | ||
+ | |- | ||
+ | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Lcs.png|16px]] || light_rear || | ||
+ | |- | ||
+ | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Lcs.png|16px]] || ped_left_entry || | ||
+ | |- | ||
+ | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Lcs.png|16px]] || ped_mid_entry || | ||
+ | |- | ||
+ | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Lcs.png|16px]] || ped_right_entry || | ||
+ | |- | ||
+ | | [[Изображение:Lcs.png|16px]] || door_front_dummy || | ||
+ | |- | ||
+ | | [[Изображение:Lcs.png|16px]] || door_back_dummy || | ||
+ | |- | ||
+ | | [[Изображение:Lcs.png|16px]] || ramp_front_dummy || | ||
+ | |- | ||
+ | | [[Изображение:Lcs.png|16px]] || ramp_back_dummy || | ||
+ | |- | ||
+ | | [[Изображение:Lcs.png|16px]] || chim_left || | ||
+ | |- | ||
+ | | [[Изображение:Lcs.png|16px]] || ped_point || | ||
+ | |- | ||
+ | | [[Изображение:Lcs.png|16px]] || car1_dummy || | ||
+ | |- | ||
+ | | [[Изображение:Lcs.png|16px]] || car2_dummy || | ||
+ | |- | ||
+ | | [[Изображение:Lcs.png|16px]] || car3_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]] || toprotor || | ||
+ | |- | ||
+ | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Lcs.png|16px]] || backrotor || | ||
+ | |- | ||
+ | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Lcs.png|16px]] || tail || | ||
+ | |- | ||
+ | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Lcs.png|16px]] || topknot || | ||
+ | |- | ||
+ | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Lcs.png|16px]] || skid_left || | ||
+ | |- | ||
+ | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Lcs.png|16px]] || skid_right || | ||
+ | |- | ||
+ | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Lcs.png|16px]] || wheel_front_dummy || | ||
+ | |- | ||
+ | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Lcs.png|16px]] || wheel_rear_dummy || | ||
+ | |- | ||
+ | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Lcs.png|16px]] || light_tailplane || | ||
+ | |- | ||
+ | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Lcs.png|16px]] || light_left || | ||
+ | |- | ||
+ | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Lcs.png|16px]] || light_right || | ||
+ | |- | ||
+ | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Lcs.png|16px]] || forks_front || | ||
+ | |- | ||
+ | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Lcs.png|16px]] || forks_rear || | ||
+ | |- | ||
+ | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Lcs.png|16px]] || wheel_front || | ||
+ | |- | ||
+ | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Lcs.png|16px]] || wheel_rear || | ||
+ | |- | ||
+ | | [[Изображение:Gta3.png|16px]] [[Изображение:Vc.png|16px]] [[Изображение:Lcs.png|16px]] || mudguard || | ||
+ | |- | ||
+ | | [[Изображение:Vc.png|16px]] [[Изображение:Lcs.png|16px]] || handlebars || | ||
+ | |- | ||
+ | | [[Изображение:Vc.png|16px]] [[Изображение:Lcs.png|16px]] || rearrotor || | ||
+ | |- | ||
+ | | || || | ||
+ | |- | ||
+ | | [[Изображение: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]] || _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]] || _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]] || boat_hi || | ||
+ | |- | ||
+ | |} | ||
− | + | ====Секция Geometry List==== | |
− | + | Подсекция Clump-а, хранит список всех геометрических объектов модели (собственно то, что игрок видит в игре) | |
− | Geometry List | + | Geometry List → Struct |
− | + | 4 bytes - int - количество геометрических объектов | |
− | + | ====Секция Geometry==== | |
− | + | Подсекция Geometry List, хранит саму геометрию объекта модели. | |
− | Geometry | + | 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} |
− | 4 bytes - | + | |
− | 4 bytes - | + | |
− | + | ||
− | + | ||
− | + | ||
− | {END | + | |
− | + | (цвета вершин) | |
+ | {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} | |
− | + | ||
− | + | ||
− | + | ||
− | {IF | + | |
− | 4 bytes - float - | + | |
− | + | ||
− | + | ||
{END IF} | {END IF} | ||
− | ( | + | |
− | {IF | + | (треугольники) |
− | {ARRAY OF SIZE: | + | {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 ARRAY} | ||
{END IF} | {END IF} | ||
− | ( | + | |
− | { | + | =====Подсекция Bin Mesh PLG (или Material Split)===== |
− | {ARRAY OF SIZE: [ | + | |
+ | Расширение секции 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 - U | ||
4 bytes - float - V | 4 bytes - float - V | ||
+ | {END IF} | ||
+ | {END ARRAY} | ||
+ | |||
+ | ('''Padding''') | ||
+ | {ARRAY OF SIZE: unknow} | ||
+ | 1 byte - hex - 0xCD | ||
{END ARRAY} | {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 | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | {IF | + | |
− | {ARRAY OF SIZE: | + | |
− | 4 bytes - float - X | + | |
− | 4 bytes - float - Y | + | |
− | 4 bytes - float - Z | + | |
{END ARRAY} | {END ARRAY} | ||
{END IF} | {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 и проверки остатка (либо можно просто проверять каждый бит). Значения в итерациях: | ||
+ | |||
+ | {| {{Таблица}} | ||
+ | |+ DFF flags | ||
+ | |- | ||
+ | ! Флаг !! Двоичный вид !! Имя !! Описание | ||
+ | |- | ||
+ | | 1 || 0000 0001 || '''TRISTRIP''' || TRUE - тип треугольников [http://en.wikipedia.org/wiki/Triangle_strip 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 ==== | ==== Section: Material List ==== | ||
Строка 274: | Строка 488: | ||
4 bytes - int - Unknown | 4 bytes - int - Unknown | ||
− | + | 4 bytes - RGBA - Colour | |
4 bytes - int - Unknown | 4 bytes - int - Unknown | ||
4 bytes - int - Texture Count | 4 bytes - int - Texture Count | ||
Строка 294: | Строка 508: | ||
|SECTION END| | |SECTION END| | ||
− | ==== | + | ==== Секция Atomic ==== |
− | Atomic | + | Atomic → Struct |
− | | | + | |начало секции| |
− | 4 bytes - int - | + | 4 bytes - int - номер родительского фрейма |
− | 4 bytes - int - | + | 4 bytes - int - номер дочерней геометрии |
− | 4 bytes - int - | + | 4 bytes - int - флаги (0x01 rpATOMICCOLLISIONTEST и 0x04 rpATOMICRENDER) |
− | 4 bytes - int - | + | 4 bytes - int - выравнивание (не используется) |
− | + | ||
− | + | ||
− | + | |конец секции| | |
− | + | ||
− | {{GTA3-navi}} | + | {{SA-navi}}{{VC-navi}}{{GTA3-navi}}{{Manhunt-navi}} |
− | [[Категория: | + | [[Категория:GTA 3]][[Категория:GTA VC]][[Категория:GTA SA]][[Категория:Manhunt]][[Категория:Форматы файлов]] |
Текущая версия на 10:26, 25 апреля 2022
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 |