DFF — различия между версиями

Материал из GTAModding.ru
Перейти к: навигация, поиск
 
(не показаны 32 промежуточные версии 7 участников)
Строка 1: Строка 1:
{{stub}}
+
'''DFF''' (Dive File Format) — формат файлов движка [[RenderWare]] 3.x, использующийся в [[GTA 3]], [[GTA VC]], [[GTA SA]], [[Manhunt]] и Bully для хранения трёхмерных моделей. Является кроссплатформенным.
'''DFF''' формат, использующийся RockStar Games для хранения трёхмерных игровых моделей в таких играх как [[GTA 3]], [[Vice City]], [[San Andreas]], [[Manhunt]]. Является кросс платформенным форматом.
+
  
== Основные данные ==
+
DFF был разработан Criterion Games для RenderWare 3.0. После версии 3.2 развитие формата было остановлено, а расширения DFF осуществлялись только самими разработчиками игр с помощью плагинов. Несмотря на то, что в RenderWare 3.5 на смену устаревшего DFF был добавлен новый формат - RWS, в [[Rockstar North]] продолжали использовать DFF в GTA: San Andreas.
Все трёхмерные модели в GTA третьей серии закодированы в виде бинарных потоков - [[RenderWare binary stream file]], специализированных для движка RenderWare, используемого в игре. Все бинарные потоки с моделями имеют расширение [[DFF]] (для коллекции разнообразных моделей - генерика, персонажей, оружия, автомобилей и т.д.) или [[BSP]] (для хранения одного игрового уровня). Для просмотра и редактирования иерархии потоков [[DFF]] и [[BSP]] существует программа [[RW Analyze]] от Steve M. Для импорта/экспорта DFF в 3D Studio MAX пользуются [[GTA Tools]] (скрипты КАМа) или [[SA Tools]] (скрипты Дениски). Импорт/экспорт DFF в Zanoza Modeler присутствует в версиях начиная с 1.06.
+
  
== Структура ==
+
==Основные данные==
В узлах иерархии бинарных потоков DFF расположены секции, в которых закодированы различные данные трёхмерных объектов - основные и дополнительные. В DFF можно найти секции, специфичные для [[RenderWare]] и не специфичные, написанные программистами RockStar Games специально под определённую игру и расширяющие её возможности по сравнению со стандартным RenderWare ( [[Pipeline Set]], [[Specular Material]], [[2dfx]], [[Night Vertex Colors]], [[Collision Model]], [[Reflection Material]], [[Mesh Extension]], [[Frame]] ).
+
Все трёхмерные модели в играх на движке [[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
+
    * (Данные секции)
+
        [Размер секции] bytes - data - данные внутри секции
+
  
 +
    * (заголовок секции)
 +
        4 bytes - int - идентификатор секции
 +
        4 bytes - int - размер данных секции
 +
        4 bytes - hex - версия DFF/версия RenderWare
 +
    * (данные секции)
 +
        [размер данных секции] bytes - data - данные внутри секции
  
Идентификатор секции определяет, как данные должны быть обработаны. Например если идентификатор секции = rwDATA, rwSTRING, rwFRAME или rwMATERIALSPLIT, то для анализа секции нужно спуститься на один уровень вниз по иерархии - в данные, где расположены другие секции, как например здесь:
+
Идентификатор секции определяет, как данные должны быть обработаны. Список таких идентификаторов, определяющих иерархию компонентов DFF:
  
    *(Заголовок секции)
+
0х14 − rwID_ATOMIC - составная часть модели (тип RpAtomic)
        4 bytes - int - rwCLUMP
+
0х05 − rwID_CAMERA - камера (тип RwCamera)
        4 bytes - int - 48
+
0х10 − rwID_CLUMP - Clump (тип RpClump)
        2 bytes - int - Unknown
+
0х0F − rwID_GEOMETRY - геометрия модели (тип RpGeometry)
        2 bytes - int - 4099
+
0х18 − rwID_IMAGE - картинка (тип RwImage)
    *(Данные секции)
+
0х12 − rwID_LIGHT - источник освещения (тип RpLight)
        (Заголовок секции)
+
0х07 − rwID_MATERIAL - материал модели (тип RpMaterial)
            4 bytes - int - rwDATA
+
0х0D − rwID_MATRIX - матрица (тип RwMatrix)
            4 bytes - int - 8
+
0х16 − rwID_TEXDICTIONARY - список текстур (тип RwTexDictionary)
            2 bytes - int - Unknown
+
0х06 − rwID_TEXTURE - текстура (тип RwTexture)
            2 bytes - int - 4099
+
0х0B − rwID_WORLD - мир/уровень (тип RpWorld)
        (Данные секции)
+
0х29 − rwID_CHUNKGROUPSTART – старт группы Chunk (тип RwChunkGroup)
            4 bytes - int - Some Number
+
0х2A − rwID_CHUNKGROUPEND – конец группы Chunk (тип RwChunkGroup)
            4 bytes - int - Some Number
+
  
        (Заголовок секции)
+
Полный список идентификаторов можно найти в [http://gtamods.com/wiki/List_of_RW_section_IDs этой] статье.
            4 bytes - int - rwSTRING
+
            4 bytes - int - 16
+
            2 bytes - int - Unknown
+
            2 bytes - int - 4099
+
        (Данные секции)
+
            16 bytes - string - Data
+
  
Список таких идентификаторов, определяющих иерархию компонентов DFF:
+
По имени секции можно догадаться, что в ней хранится (например, rwDATA, что находится в rwGEOMETRY, содержит все вершины и нормали трёхмерных объектов, а rwDATA из секции rwGEOMETRYLIST содержит число и имена геометрических объектов).
  
    1 = rwDATA
+
===Версии DFF===
    2 = rwSTRING
+
В заголовке секции можно найти закодированный номер SDK-версии RenderWare, под которую собран DFF-файл:
    3 = rwEXTENSION
+
    6 = rwTEXTURE
+
    7 = rwMATERIAL
+
    8 = rwMATERIALLIST
+
    14 = rwFRAMELIST
+
    15 = rwGEOMETRY
+
    16 = rwCLUMP
+
    20 = rwATOMIC
+
    26 = rwGEOMETRYLIST
+
    1294 = rwMATERIALSPLIT
+
    39056126 = rwFRAME
+
  
Полный список идентификаторов можно найти в отдельной статье: [[list of RW section IDs]]
+
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))
  
По имени секции можно догадаться, что в ней хранится (например rwGEOMETRY -> rwDATA содержит все вершины, нормали трёхмерных объектов, в то время как rwGEOMETRYLIST -> rwDATA содержит число и имена геометрических объектов).
+
Начиная с RenderWare 3.1, был добавлен номер версии бинарного потока, по которому и стоит различать DFF при чтении (сама версия SDK тут уже особой роли не играет), тот же самый номер (всегда 0) присутствует и в версиях до 3.2, сохраняя совместимость (т.к. это место было зарезервировано).
  
=== Версии DFF ===
+
3.1.0.1 - 0x0401FFFF - Grand Theft Auto III (Windows)
В заголовке секции можно найти закодированные номера версий RenderWare, под которую скомпелирован DFF:
+
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)
  
3.0.0.0 - 0x00000310 - только для мульти-dff и генерика, остатки от ранних версий GTA III, которые DMA Designe переделывать не стали.
+
Обработкой версии занимается функция RwEngineGetCurrentVersion. Значение версии разбивается на 3 числа:
3.2.0.0 - 0x0800FFFF - GTA III
+
3.3.0.2 - 0x0C02FFFF - GTA VC
+
3.4.0.3 - 0x1003FFFF - GTA VC
+
3.6.0.3 - 0x1803FFFF - GTA SA
+
  
=== Содержимое DFF ===
+
* новая версия SDK (байт), значение которой делиться на 4 и к результату плюсуется 0х300 (максимальная версия = 3.9.5)
 +
* версия бинарного потока (байт), для GTA самая старая - 0, самая последняя - 5 для Android-ов
 +
* старая версия SDK (два байта), значение просто разбивается на 4 4-х битных числа, из которых первое отбрасывается (максимальная версия = 3.15.15)
  
* [[Clump (RW Section)|Clump]] (id16,size,RWver)
+
Если значение старой версии = -1, то истинной считается новая версия SDK (исключая RenderWare 3.7, не поддерживающую форматы старой версии DFF).
** [[Struct (RW Section)#Clump|Struct]] (id1,size,RWver, ObjectCount)
+
** [[Frame List (RW Section)|Frame List]] (id14,size,RWver)
+
*** [[Struct (RW Section)#Frame_List|Struct]] (id1,size,RWver, FrameCount, ...)
+
*** [[Extension (RW Section)|Extension]] * (id3,size,RWver)
+
**** [[Frame (RW Section)|Frame]] (id39056126,size,RWver, string)
+
**** [[HAnim PLG (RW Section)|HAnim PLG]]
+
** [[Geometry List (RW Section)|Geometry List]] (id26,size,RWver)
+
*** [[Struct (RW Section)#Geometry_List|Struct]] (id1,size,RWver, ObjectCount)
+
*** [[Geometry (RW Section)|Geometry]] * (id15,size,RWver)
+
**** [[Struct (RW Section)#Geometry|Struct]] (id1,size,RWver, flags, FaceCount, VertexCount, FrameCount, ...)
+
**** [[Material List (RW Section)|Material List]] (id8,size,RWver)
+
***** [[Struct (RW Section)#Material_List|Struct]] (id1,size,RWver, MaterialCount, -1, -1, -1)
+
***** [[Material (RW Section)|Material]] * (id7,size,RWver)
+
****** [[Struct (RW Section)#Material|Struct]] (id1,size,RWver, 0, RGBA, 0x094B5D54, TextureCount, ...)
+
****** [[Texture (RW Section)|Texture]] - optional (id6,size,RWver)
+
******* [[Struct (RW Section)#Texture|Struct]] (id1,size,RWver, FilterFlag, 0)
+
******* [[String (RW Section)|String]] - diffuse texture name (id2,size,RWver, string)
+
******* [[String (RW Section)|String]] - alpha texture name (id2,size,RWver, string)
+
******* [[Extension (RW Section)|Extension]]
+
******** [[Sky Mipmap Val (RW Section)|Sky Mipmap Val]] **
+
****** [[Extension (RW Section)|Extension]]
+
******* [[Material Effects PLG (RW Section)|Material Effects PLG]] - optional (id288,size,RWver, 1, 1, 1, 1)
+
******** [[Texture (RW Section)|Texture]] - optional ''(See [[Material Effects PLG (RW Section)|Material Effects PLG]] for more information)'' (id6,size,RWver)
+
********* [[Struct (RW Section)#Texture|Struct]] (id1,size,RWver, FilterFlag, 1)
+
********* [[String (RW Section)|String]] - environment map name (id2,size,RWver, string)
+
********* [[String (RW Section)|String]] - alpha texture name (id2,size,RWver, string)
+
********* [[Extension (RW Section)|Extension]] (id3,size,RWver)
+
********** [[Sky Mipmap Val (RW Section)|Sky Mipmap Val]] **
+
********* [[Texture (RW Section)|Texture]] - optional ''(See [[Material Effects PLG (RW Section)|Material Effects PLG]] for more information)'' (id6,size,RWver)
+
********** [[Struct (RW Section)#Texture|Struct]] (id1,size,RWver, FilterFlag, 0)
+
********** [[String (RW Section)|String]] - environment map name (id2,size,RWver, string)
+
********** [[String (RW Section)|String]] - alpha texture name (id2,size,RWver, string)
+
********** [[Extension (RW Section)|Extension]] (id3,size,RWver)
+
*********** [[Sky Mipmap Val (RW Section)|Sky Mipmap Val]] **
+
******* [[Reflection Material (RW Section)|Reflection Material]] - optional
+
******* [[Specular Material (RW Section)|Specular Material]] - optional
+
******* [[UV Animation PLG (RW Section)|UV Animation PLG]] - optional
+
**** [[Extension (RW Section)|Extension]]
+
***** [[Bin Mesh PLG (RW Section)|Bin Mesh PLG]]
+
***** [[Native Data PLG (RW Section)|Native Data PLG]] (on Xbox and PS2)
+
***** [[Skin PLG (RW Section)|Skin PLG]]
+
***** [[Mesh Extension (RW Section)|Mesh Extension]] - optional
+
***** [[Night Vertex Colors (RW Section)|Night Vertex Colors]] - optional (static objects only)
+
***** [[Morph PLG (RW Section)|Morph PLG]]
+
***** [[2dfx (RW Section)|2dfx]] - optional
+
** [[Atomic (RW Section)|Atomic]] *
+
*** [[Struct (RW Section)#Atomic|Struct]]
+
*** [[Extension (RW Section)|Extension]]
+
**** [[Right To Render (RW Section)|Right To Render]] - optional
+
**** [[Particles PLG (RW Section)|Particles PLG]] - optional
+
**** [[Material Effects PLG (RW Section)|Material Effects PLG]] - optional
+
**** [[Pipeline Set (RW Section)|Pipeline Set]] - optional
+
** [[Extension (RW Section)|Extension]]
+
*** [[Collision Model (RW Section)|Collision Model]] - vehicles only
+
  
''* Эти разделы (и их дочерние разделы) могут повторятся несколько раз.
+
===Содержимое DFF===
  
==== Секция: Clump ====
+
====Секция Clump====
  
Clump - Data
+
Главная секция DFF, содержащая всю информацию о трёхмерной модели. Если в DFF хранится несколько моделей, то и Clump-ов будет так же несколько - они следуют один за другим без иерархии, образовывая т.н. Multi-DFF.
  
|SECTION START|
+
Clump → Struct
  
     4 bytes - int - Object Count
+
     4 bytes - int - количество составных частей модели (секций Atomic в Clump)
 +
    {IF RWver > 0x33000 and RWsize >= 12 THEN}
 +
        4 bytes - int - количество источников освещения (секций Light в Clump)
 +
        4 bytes - int - количество камер (секций Camera в Clump)
  
|SECTION END|
+
====Секция Frame List====
  
 +
Подсекция Clump-а, хранит список всех фреймов модели (составные запчасти модели а-ля узлы "скелета", связанных друг с другом в виде иерархического дерева).
  
==== Секция: Frame List ====
+
Frame List → Struct
  
Frame List - Data
+
     4 bytes - int - общее количество фреймов модели
 
+
     (информация о фрейме)
|SECTION START|
+
     {ARRAY OF SIZE: [количество фреймов]}
 
+
         36 bytes - float Rotation matrix (3 x 3) - матрица наклона фрейма в 3D
     4 bytes - int - Frame Count
+
         12 bytes - float Position XYZ (3) - координаты фрейма в 3D
     (Frame Information)
+
         4 bytes - int - номер родительского фрейма
     {ARRAY OF SIZE: [Frame Count]}
+
         4 bytes - int - указатель прародителя (используется для пропуска "виртуальных" фреймов)
         36 bytes - float matrix (3 x 3) - Rotational Matrix
+
         12 bytes - float - Coordinates Offset
+
         4 bytes - int - Parent Frame
+
         4 bytes - int - Unknown
+
 
     {END ARRAY}
 
     {END ARRAY}
  
|SECTION END|
+
Frame List → Extension → R* Frame [количество фреймов]
  
Frame List - Frame
+
Расширение структуры фрейма от Rockstar North, содержащее его имя. Необходимо только для моделей, обращение к фреймам которой происходит по именам/суффиксам, для штатных моделей игры - не обязательна и может не записываться в DFF.
  
|SECTION START|
+
    [Section Size] bytes - string - имя фрейма
  
    [Section Size] bytes - string - Frame Name
+
{| {{Таблица}}
 +
|+ Стандартные фреймы транспорта
 +
|-
 +
! Версия игры !! Фреймы !! Назначение
 +
|-
 +
| [[Изображение: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 ||
 +
|-
 +
|}
  
|SECTION END|
+
====Секция Geometry List====
  
==== Секция: Geometry List ====
+
Подсекция Clump-а, хранит список всех геометрических объектов модели (собственно то, что игрок видит в игре)
  
Geometry List - Data
+
Geometry List → Struct
  
|SECTION START|
+
    4 bytes - int - количество геометрических объектов
  
    4 bytes - int - Geometry Count
+
====Секция Geometry====
  
|SECTION END|
+
Подсекция Geometry List, хранит саму геометрию объекта модели.
  
Geometry List - Material Split
+
Geometry → Struct
  
|SECTION START|
+
    (заголовок)
 +
        4 bytes - int - Format (см. ниже)
 +
        4 bytes - int - количество треугольников
 +
        4 bytes - int - количество вершин
 +
        4 bytes - int - количество целей морфинга
  
     (Header)
+
     (заголовок подсекции освещения)
        4 bytes - int - Triangle Strip
+
     {IF RWver = 3.0.0.0 THEN}
        4 bytes - int - Split Count
+
         4 bytes - float - равномерное
        4 bytes - int - Face Count
+
         4 bytes - float - рассеянное
    (Split Information)
+
         4 bytes - float - зеркальное
     {ARRAY OF SIZE: [Header - Split Count]}
+
     {END IF}
         4 bytes - int - Face Index
+
         4 bytes - int - Material Index
+
         (Vertex Information)
+
        {ARRAY OF SIZE: [Face Index]}
+
            4 bytes - int - Vertex 1
+
     {END ARRAY}
+
  
|SECTION 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}
  
==== Секция: Geometry ====
+
     (уровень UV-преобразования 1)
 
+
    {IF Textured=1 or Textured_2=1 in flags THEN}
     ('''Header''')
+
         {ARRAY OF SIZE: количество_вершин*8 bytes}
        2 bytes - int - Flags
+
            4 bytes - float - координата U
         2 bytes - int - Unknown
+
            4 bytes - float - координата V
        4 bytes - int - Face Count
+
         {END ARRAY}
        4 bytes - int - Vertex Count
+
    {END IF}
         4 bytes - int - Frame Count
+
  
     ('''Lighting Header''')
+
     (уровень UV-преобразования 2)
     {IF RWver = 3.0.0.0 THEN}
+
     {IF Textured_2=1 in flags THEN}
         4 bytes - float - Ambient
+
         {ARRAY OF SIZE: количество_вершин*8 bytes}
        4 bytes - float - Diffuse
+
            4 bytes - float - координата U
        4 bytes - float - Specular
+
            4 bytes - float - координата V
 +
        {END ARRAY}
 
     {END IF}
 
     {END IF}
  
     ('''Vertex Colors''')
+
     (уровень UV-преобразования 3)
     {IF Prelit=1 in flags THEN}
+
     {IF Textured_2=1 in flags THEN}
         {ARRAY OF SIZE = Vertex Count*4 byte}
+
         {ARRAY OF SIZE: количество_вершин*8 bytes}
             1 byte - byte - Red
+
             4 bytes - float - координата U
             1 byte - byte - Green
+
             4 bytes - float - координата V
            1 byte - byte - Blue
+
            1 byte - byte - Alpha
+
 
         {END ARRAY}
 
         {END ARRAY}
 
     {END IF}
 
     {END IF}
  
     ('''UV Mapping''')
+
     (треугольники)
     {IF Textured=1 in flags THEN}
+
    {ARRAY OF SIZE: количество_треугольников*8 bytes}
         {ARRAY OF SIZE: Vertex Count*8 byte}
+
        2 bytes - int - вершина 2
             4 bytes - float - U
+
        2 bytes - int - вершина 1
             4 bytes - float - V
+
        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}
  
     ('''Faces''')
+
=====Подсекция Bin Mesh PLG (или Material Split)=====
     {ARRAY OF SIZE: Face Count*8 byte}
+
 
         2 bytes - int - Vertex 2
+
Расширение секции Geometry, дублирующее данные треугольников и идентификаторов материалов к ним, но хранящееся в оптимизированном для движка виде, поэтому аналогичные данные секции Geometry просто подменяются при загрузке DFF. Секция не является обязательной, поэтому DFF может работать и без неё.
         2 bytes - int - Vertex 1
+
 
         2 bytes - int - Vertex Alpha
+
     (заголовок)
         2 bytes - int - Vertex 3
+
        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}
 
     {END ARRAY}
  
     ('''Bounding Sphere''')
+
|конец секции|
         4 bytes - float - Coordinate X
+
 
         4 bytes - float - Coordinate Y
+
=====Подсекция Native Data PLG=====
         4 bytes - float - Coordinate Z
+
 
         4 bytes - float - Radius
+
    (заголовок секции)
         4 bytes - int - Has Position
+
        4 bytes - int - 5
         4 bytes - int - Has Normals
+
        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''')
 
     ('''Verticles''')
     {ARRAY OF SIZE: Vertex Count*12}
+
     {ARRAY OF SIZE: Vertex Count*(24 or 32) bytes}
 
         4 bytes - float - Coordinate X
 
         4 bytes - float - Coordinate X
 
         4 bytes - float - Coordinate Y
 
         4 bytes - float - Coordinate Y
 
         4 bytes - float - Coordinate Z
 
         4 bytes - float - Coordinate Z
     {END ARRAY}
+
        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''')
 
     ('''Normals''')
 
     {IF Normals=1 in Flags THEN}
 
     {IF Normals=1 in Flags THEN}
         {ARRAY OF SIZE: Vertex Count*12}
+
         {ARRAY OF SIZE: Vertex Count*12 bytes}
 
             4 bytes - float - Coordinate X
 
             4 bytes - float - Coordinate X
 
             4 bytes - float - Coordinate Y
 
             4 bytes - float - Coordinate Y
Строка 263: Строка 432:
 
     {END IF}
 
     {END IF}
  
'''Flags''' - значение, определяющее содержимое секции геометрии. Раскладывается на логические значения путём деления на 2 и проверки остатка (либо можно просто проверять каждый бит). Значения в итерациях:
+
    ('''Padding''')
# Tristrips
+
    {ARRAY OF SIZE: unknow}
# Positions
+
        1 byte - hex - 0xCD
# Textured
+
        {END ARRAY}
# Prelit
+
 
# Normals
+
'''Format''' - определяет формат геометрии.
# Light
+
struct GeometryFormat{
# Modulate Material Color
+
    unsigned short Flags;      // флаги, см. ниже
# Textured 2
+
    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 ====
Строка 311: Строка 508:
 
|SECTION END|
 
|SECTION END|
  
==== Section: Atomic ====
+
==== Секция Atomic ====
  
Atomic - Data
+
Atomic → Struct
  
|SECTION START|
+
|начало секции|
  
     4 bytes - int - Frame Number
+
     4 bytes - int - номер родительского фрейма
     4 bytes - int - Geometry Number
+
     4 bytes - int - номер дочерней геометрии
     4 bytes - int - Unknown
+
     4 bytes - int - флаги (0x01 rpATOMICCOLLISIONTEST и 0x04 rpATOMICRENDER)
     4 bytes - int - Unknown
+
     4 bytes - int - выравнивание (не используется)
 
+
|SECTION END|
+
  
==Ссылки==
+
|конец секции|
* [http://www.chronetal.co.uk/gta/index.php?page=dff/ Оригинальная статья KCow на английском языке]
+
  
{{GTA3-navi}}
+
{{SA-navi}}{{VC-navi}}{{GTA3-navi}}{{Manhunt-navi}}
[[Категория:Форматы файлов]][[Категория:GTA 3]][[Категория:GTA VC]][[Категория:GTA SA]][[Категория:Manhunt]]
+
[[Категория: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 - имя фрейма
Стандартные фреймы транспорта
Версия игры Фреймы Назначение
Gta3.png Vc.png Sa.png Lcs.png Vcs.png 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 Vc.png Sa.png Lcs.png Vcs.png bump_front_dummy Информационный узел заднего бампера
Gta3.png Vc.png Sa.png Lcs.png Vcs.png bonnet_dummy Ось вращения капота
Gta3.png Vc.png Sa.png Lcs.png Vcs.png wing_rf_dummy, wing_rr_dummy, wing_lf_dummy, wing_lr_dummy Информационные узлы передних и задних «крыльев» автомобиля
Gta3.png Vc.png Sa.png Lcs.png Vcs.png door_rf_dummy, door_rr_dummy, door_lf_dummy, door_lr_dummy Информационные узлы передних и задних дверей
Gta3.png Vc.png Sa.png Lcs.png Vcs.png boot_dummy Ось вращения багажника
Gta3.png Vc.png Sa.png Lcs.png Vcs.png bump_rear_dummy Информационный узел переднего бампера
Gta3.png Vc.png Sa.png Lcs.png Vcs.png windscreen_dummy Информационный узел стекла переднего окна
Gta3.png Vc.png Sa.png Lcs.png Vcs.png ped_frontseat Расположение водителя и пассажира на передних сидениях
Gta3.png Vc.png Sa.png Lcs.png Vcs.png ped_backseat Расположение пассажиров на заднем сидении
Gta3.png Vc.png Sa.png Lcs.png Vcs.png headlights Переднее освещение (фары)
Gta3.png Vc.png Sa.png Lcs.png Vcs.png taillights Задние габаритные огни
Gta3.png Vc.png Sa.png Lcs.png Vcs.png exhaust Информационный узел дыма выхлопной трубы
Gta3.png Vc.png Sa.png Lcs.png Vcs.png extra1, extra2, extra3, extra4, extra5, extra6 Дополнительные части авто, появляющиеся от случая к случаю
Gta3.png Vc.png Lcs.png boat_moving_hi
Gta3.png Vc.png Lcs.png boat_rudder_hi
Vc.png Lcs.png boat_flap_left
Vc.png Lcs.png boat_flap_right
Vc.png Lcs.png boat_rearflap_left
Vc.png Lcs.png boat_rearflap_right
Gta3.png Vc.png Lcs.png windscreen
Gta3.png Vc.png Lcs.png door_lhs_dummy
Gta3.png Vc.png Lcs.png door_rhs_dummy
Gta3.png Vc.png Lcs.png light_front
Gta3.png Vc.png Lcs.png light_rear
Gta3.png Vc.png Lcs.png ped_left_entry
Gta3.png Vc.png Lcs.png ped_mid_entry
Gta3.png Vc.png Lcs.png ped_right_entry
Lcs.png door_front_dummy
Lcs.png door_back_dummy
Lcs.png ramp_front_dummy
Lcs.png ramp_back_dummy
Lcs.png chim_left
Lcs.png ped_point
Lcs.png car1_dummy
Lcs.png car2_dummy
Lcs.png car3_dummy
Lcs.png car4_dummy
Gta3.png Vc.png Lcs.png chassis_dummy Информационный узел кузова
Gta3.png Vc.png Lcs.png toprotor
Gta3.png Vc.png Lcs.png backrotor
Gta3.png Vc.png Lcs.png tail
Gta3.png Vc.png Lcs.png topknot
Gta3.png Vc.png Lcs.png skid_left
Gta3.png Vc.png Lcs.png skid_right
Gta3.png Vc.png Lcs.png wheel_front_dummy
Gta3.png Vc.png Lcs.png wheel_rear_dummy
Gta3.png Vc.png Lcs.png light_tailplane
Gta3.png Vc.png Lcs.png light_left
Gta3.png Vc.png Lcs.png light_right
Gta3.png Vc.png Lcs.png forks_front
Gta3.png Vc.png Lcs.png forks_rear
Gta3.png Vc.png Lcs.png wheel_front
Gta3.png Vc.png Lcs.png wheel_rear
Gta3.png Vc.png Lcs.png mudguard
Vc.png Lcs.png handlebars
Vc.png Lcs.png rearrotor
Gta3.png Vc.png Sa.png Lcs.png Vcs.png _dam Суффикс, маркирующий повреждённую деталь транспорта
Gta3.png Vc.png Sa.png Lcs.png Vcs.png _ok Суффикс, маркирующий неповреждённую деталь транспорта
Gta3.png Vc.png Sa.png Lcs.png Vcs.png _hi Суффикс, маркирующий высокодетализированную часть транспорта
Gta3.png Vc.png Sa.png Lcs.png Vcs.png extra
Gta3.png Vc.png Sa.png Lcs.png Vcs.png _lo Суффикс, маркирующей низкодетализированную часть транспорта
Gta3.png Vc.png Sa.png Lcs.png Vcs.png _vlo Суффикс, маркирующий низкодетализированную модель транспорта
Gta3.png Vc.png Sa.png Lcs.png Vcs.png boat_hi

Секция 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 и проверки остатка (либо можно просто проверять каждый бит). Значения в итерациях:

DFF flags
Флаг Двоичный вид Имя Описание
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 - выравнивание (не используется)

|конец секции|

п · о · р
San Andreas Grand Theft Auto: San Andreas
Форматы файлов.col.cfg.cut.dff.dat.fxp.gxt.ide.ifp.img.ipl.rep.rrr.scm.txd.set
Документацияcarcols.datCarrecPed EventsPed TypeАдреса Памяти Функций (SA)Анимация моделей в SAВизуальные эффекты в скриптинге
Загруженные звукиКатсценыНомера оружияРисование на экранеТрюки с меткамиСтатистикаСтруктура аудио в SABeta версия
ИнструментыCLEOCollision File Editor IIENBSeriesG-ToolsGXT EditorIMG ToolPS2 TXD ModPS2 TXD ViewerLimit AdjusterMap EditorPathViewer
San Andreas Audio ToolkitSan Andreas Texture PlacerSanny BuilderTXD WorkshopTXDFuckerXBOX TXD PowerTool
ТуториалыРедактирование аудио в SAИзменение cutsceneDecision MakerПропуск роликовКонвертация автомобилей в SA
Основы маппинга GTA:SAДелаем ломающиеся объектыКонвертирование персонажа в SA2dfx в SanAndreasМоддинг San Andreas v2.0
Новая анимация персонажейУниверсальный солдат (GTA SA)
МодыAlien CityDesign Your Own MissionGTA: UnitedGTA StoriesGTA Berlin
МультиплеерgtaTournamentMulti Theft AutoSan Andreas Multiplayer
п · о · р
Vice City Grand Theft Auto: Vice City
Форматы файлов.adf.col.cfg.dff.dat.gxt.ide.ifp.img/.dir.ipl.raw/.sdt.rep.sc.scm.set.txd.zon
ИнструментыCLEOClump ViewerCol-IO‎Collision File Editor IIData toolDFF Viewerdffxbox2pcG-ToolsGame Archive Viewer
GTA Garage Mod ManagerGTA3 Script CompilerGXT EditorIMG ToolKam's Max ScriptsMap EditorMod GeneratorMod InstallerMoo Mapper
PS2 TXD ModPS2 TXD ViewerResourse HackerRotation CalculatorRW AnalyzeSanny BuilderTXD Workshop
TXD_2048TXDFuckerVC Limit AdjusterVC Mission BuilderViceTXDVC SeterVCFCToolWater EditorYAIEZModeler
МодификацииUltimate VCModern ModSnow ModDeluxeMilleniumNew AgeKiller KipAliens vs. Predator
GTA Long NightGTA Liberty CityGTA Myriad IslandsGTA State Of Liberty
ОтечественныеМентовский БеспределCделано в СССРUndergroundLost HeavenКыштымНостальгияXBox Mod (Коктейль)
МультиплейерMulti Theft AutoVice City Online
п · о · р
GTA III Grand Theft Auto III
Форматы файлов.b.a3d.anm.col.cfg.dff.dat.gxt.ide.ifp.img/.dir.ipl.raw/.sdt.rep.sc.scm.set.txd.zon
Документацияcarcols.datCHASE.DATCULLZONE.DATcuts.imgdefault.datfistfite.datflight.datgta3.exegta3.dat
gta3.imggta3.zonhandling.cfgmain.scmmap.datmap.zonobject.datparticle.cfgped.datpedgrp.dat
pedstats.datsfx.rawsurface.datTimeCyc.DATtracks.dattrain.datwater.datwaterpro.datweapon.dat
ИнструментыCLEOClump ViewerCol-IO‎Collision File Editor IIData toolDFF Viewerdffxbox2pcG-ToolsGTA Garage Mod Manager
GXT EditorGTA3 Limit AdjusterGTA3 Mission BuilderGTA3 PatcherIMG ToolKam's Max ScriptsMap Editor
Mod GeneratorMod InstallerMoo MapperPS2 TXD ModPS2 TXD ViewerResourse HackerRotation Calculator
RW AnalyzeViceTXDWater EditorSanny BuilderTXD ToolTXD WorkshopYAIEZModeler
Туториалыраздел в разработке
Классические МодыGPS RadarBye-Bye BikiniUltimate Stunt ParkThe SphereMiss LibertyIllandoIntercity HighwayShoreside Bridge
Rockstar HeightsLighthouse BridgeBlade FunparkOrbital CityLakeside IslandLiberty PenitentiaryJEM Island
Illando HelixCliff Climbing Mountain
Глобальные МодыReal GTA3Twenty TenSnow CityFrosted WinterUltimateBeta modX-box modBad BusinessGTA3 HDUltra mod
OpenTunnelsBack to the Future
МультиплеерMulti Theft AutoLiberty Unleashed
Исходники4x48ballambulanceasukaasusbcameracar_gencatcopcardebugdemodiablofiretruckfrankgates
genstufhealthhjhoodimportintrojoeykenjiloveluigimayhemmeatpickupsrampagerayrcswitch
taxitoniusjwantedyard
п · о · р
Manhunt.png Manhunt
Форматы файлов.bik.bsp.col.dff.grf.gxt.ifp.inst.fxp.mls.pak.rib.raw/.sdt/.lst.scc.spl.txd
ИнструментыClump ViewerCol-IO‎Collision File Editor IIDFF ViewerG-ToolsKam's Max ScriptsPS2 TXD Mod
PS2 TXD ViewerRW AnalyzeViceTXDTXD WorkshopZModeler