Просмотры
DFF
Материал из GTAModding.ru
DFF – формат, использующийся RockStar Games для хранения трёхмерных игровых моделей в таких играх как GTA 3, Vice City, San Andreas, Manhunt. Является кросс платформенным форматом.
Содержание |
Основные данные
Все трёхмерные модели в 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 ).
Каждая секция имеет заголовок, по которой можно её идентифицировать:
* (Заголовок секции)
4 bytes - int - Идентификатор секции
4 bytes - int - Размер секции
2 bytes - int - Размер дочерней секции
2 bytes - int - Версия секции
* (Данные секции)
[Размер секции] bytes - data - данные внутри секции
Идентификатор секции определяет, как данные должны быть обработаны. Например если идентификатор секции = rwDATA, rwSTRING, rwFRAME или rwMATERIALSPLIT, то для анализа секции нужно спуститься на один уровень вниз по иерархии - в данные, где расположены другие секции, как например здесь:
*(Заголовок секции)
4 bytes - int - rwCLUMP
4 bytes - int - 48
2 bytes - int - Unknown
2 bytes - int - 4099
*(Данные секции)
(Заголовок секции)
4 bytes - int - rwDATA
4 bytes - int - 8
2 bytes - int - Unknown
2 bytes - int - 4099
(Данные секции)
4 bytes - int - Some Number
4 bytes - int - Some Number
(Заголовок секции)
4 bytes - int - rwSTRING
4 bytes - int - 16
2 bytes - int - Unknown
2 bytes - int - 4099
(Данные секции)
16 bytes - string - Data
Список таких идентификаторов, определяющих иерархию компонентов DFF:
1 = rwDATA 2 = rwSTRING 3 = rwEXTENSION 6 = rwTEXTURE 7 = rwMATERIAL 8 = rwMATERIALLIST 14 = rwFRAMELIST 15 = rwGEOMETRY 16 = rwCLUMP 20 = rwATOMIC 26 = rwGEOMETRYLIST 1294 = rwMATERIALSPLIT 39056126 = rwFRAME
Полный список идентификаторов можно найти в отдельной статье: list of RW section IDs
По имени секции можно догадаться, что в ней хранится (например rwGEOMETRY -> rwDATA содержит все вершины, нормали трёхмерных объектов, в то время как rwGEOMETRYLIST -> rwDATA содержит число и имена геометрических объектов).
Версии DFF
В заголовке секции можно найти закодированные номера версий RenderWare, под которую скомпелирован DFF:
3.0.0.3 - 0x0003FFFF 3.?.?.? - 0x0800FFFF (GTA III) 3.1.0.0 - 0x00000310 (GTA III) 3.3.0.2 - 0x0C02FFFF (GTA VC) 3.4.0.3 - 0x1003FFFF (GTA VC) 3.6.0.3 - 0x1803FFFF (GTA SA)
Содержимое DFF
- Clump
- Struct
- Frame List
- Geometry List
- Struct
- Geometry *
- Struct
- Material List
- Struct
- Material *
- Struct
- Texture - optional
- Extension
- Material Effects PLG - optional
- Reflection Material - optional
- Specular Material - optional
- UV Animation PLG - optional
- Extension
- Bin Mesh PLG
- Native Data PLG (on Xbox and PS2)
- Skin PLG
- Mesh Extension - optional
- Night Vertex Colors - optional (static objects only)
- Morph PLG
- 2dfx - optional
- Atomic *
- Struct
- Extension
- Right To Render - optional
- Particles PLG - optional
- Material Effects PLG - optional
- Pipeline Set - optional
- Extension
- Collision Model - vehicles only
* Эти разделы (и их дочерние разделы) могут повторятся несколько раз.
Секция: Clump
Clump - Data
|SECTION START|
4 bytes - int - Object Count
|SECTION END|
Секция: Frame List
Frame List - Data
|SECTION START|
4 bytes - int - Frame Count
(Frame Information)
{ARRAY OF SIZE: [Frame Count]}
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}
|SECTION END|
Frame List - Frame
|SECTION START|
[Section Size] bytes - string - Frame Name
|SECTION END|
Секция: Geometry List
Geometry List - Data
|SECTION START|
4 bytes - int - Geometry Count
|SECTION END|
Geometry List - Material Split
|SECTION START|
(Header)
4 bytes - int - Triangle Strip
4 bytes - int - Split Count
4 bytes - int - Face Count
(Split Information)
{ARRAY OF SIZE: [Header - Split Count]}
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|
Секция: Geometry
Geometry - Data
|SECTION START|
(Header)
2 bytes - int - Flags
2 bytes - int - Unknown
4 bytes - int - Triangle Count
4 bytes - int - Vertex Count
4 bytes - int - Morph Target Count
(Lighting Header)
{IF Version Number = 4099 THEN}
4 bytes - float - Ambient
4 bytes - float - Diffuse
4 bytes - float - Specular
{END IF}
(Colour Information)
{IF rwOBJECT_VERTEX_COLOR in [Header - Flags] THEN}
{ARRAY OF SIZE: [Header - Vertex Count]}
1 byte - byte - Red
1 byte - byte - Green
1 byte - byte - Blue
1 byte - byte - Alpha
{END ARRAY}
{END IF}
(Texture Mapping Information)
{IF rwOBJECT_VERTEX_UV in [Header - Flags] THEN}
{ARRAY OF SIZE: [Header - Vertex Count]}
4 bytes - float - U
4 bytes - float - V
{END ARRAY}
{END IF}
(Face Information)
{ARRAY OF SIZE: [Header - Triangle Count]}
2 bytes - int - Vertex 2
2 bytes - int - Vertex 1
2 bytes - int - Flags
2 bytes - int - Vertex 3
{END ARRAY}
(Unknown)
4 bytes - float - Bounding Sphere X
4 bytes - float - Bounding Sphere Y
4 bytes - float - Bounding Sphere Z
4 bytes - float - Bounding Sphere Radius
4 bytes - int - Has Position
4 bytes - int - Has Normals
(Vertex Information)
{ARRAY OF SIZE: [Header - Vertex Count]}
4 bytes - float - X
4 bytes - float - Y
4 bytes - float - Z
{END ARRAY}
(Normal Information)
{IF rwOBJECT_VERTEX_NORMAL in [Header - Flags] THEN}
{ARRAY OF SIZE: [Header - Vertex Count]}
4 bytes - float - X
4 bytes - float - Y
4 bytes - float - Z
{END ARRAY}
{END IF}
|SECTION END|
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 12 bytes - RGBA - Colour 4 bytes - int - Unknown 4 bytes - int - Texture Count 4 bytes - float - Unknown 4 bytes - float - Unknown 4 bytes - float - Unknown
|SECTION END|
Section: Texture
Texture - Data
|SECTION START|
2 bytes - int - Texture Filter Mode Flags 2 bytes - int - Unknown
|SECTION END|
Section: Atomic
Atomic - Data
|SECTION START|
4 bytes - int - Frame Number 4 bytes - int - Geometry Number 4 bytes - int - Unknown 4 bytes - int - Unknown
|SECTION END|


