DFF
Материал из GTAModding.ru
Версия от 16:21, 4 августа 2012; Dageron (обсуждение | вклад)
Эта статья требует полного или частичного перевода. Часть этой статьи написана на иностранном языке. Если вы знаете его, пожалуйста, помогите с ее переводом на русский язык. |
DFF – формат, использующийся RockStar Games для хранения трёхмерных игровых моделей в таких играх как GTA 3, Vice City, 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 ).
Каждая секция имеет заголовок, по которой можно её идентифицировать:
* (Заголовок секции) 4 bytes - int - Идентификатор секции 4 bytes - int - Размер секции 4 bytes - hex - Версия DFF * (Данные секции) [Размер секции] bytes - data - данные внутри секции
Идентификатор секции определяет, как данные должны быть обработаны. Например если идентификатор секции = rwDATA, rwSTRING, rwFRAME или rwMATERIALSPLIT, то для анализа секции нужно спуститься на один уровень вниз по иерархии - в данные, где расположены другие секции, как например здесь:
*(Заголовок секции) 4 bytes - int - rwCLUMP 4 bytes - int - 48 2 bytes - int - Unknown 2 bytes - int - 4099 *(Данные секции) (Заголовок секции) 4 bytes - int - rwDATA 4 bytes - int - 8 2 bytes - int - Unknown 2 bytes - int - 4099 (Данные секции) 4 bytes - int - Some Number 4 bytes - int - Some Number
(Заголовок секции) 4 bytes - int - rwSTRING 4 bytes - int - 16 2 bytes - int - Unknown 2 bytes - int - 4099 (Данные секции) 16 bytes - string - Data
Список таких идентификаторов, определяющих иерархию компонентов DFF:
1 = rwDATA 2 = rwSTRING 3 = rwEXTENSION 6 = rwTEXTURE 7 = rwMATERIAL 8 = rwMATERIALLIST 14 = rwFRAMELIST 15 = rwGEOMETRY 16 = rwCLUMP 20 = rwATOMIC 26 = rwGEOMETRYLIST 1294 = rwMATERIALSPLIT 39056126 = rwFRAME
Полный список идентификаторов можно найти в отдельной статье: list of RW section IDs
По имени секции можно догадаться, что в ней хранится (например rwGEOMETRY -> rwDATA содержит все вершины, нормали трёхмерных объектов, в то время как rwGEOMETRYLIST -> rwDATA содержит число и имена геометрических объектов).
Версии DFF
В заголовке секции можно найти закодированные номера версий RenderWare, под которую скомпелирован DFF:
3.0.0.0 - 0x00000310 - только для мульти-dff и генерика, остатки от ранних версий GTA III. 3.2.0.0 - 0x0800FFFF - PS2 и PC GTA III 3.3.0.2 - 0x0C02FFFF - GTA VC 3.4.0.3 - 0x1003FFFF - X-BOX GTA III, GTA VC 3.5.0.0 - 0x1400FFFF - Android GTA III 3.6.0.3 - 0x1803FFFF - GTA SA
Содержимое DFF
- Clump (id16,size,RWver)
- Struct (id1,size,RWver, ObjectCount)
- Frame List (id14,size,RWver)
- Geometry List (id26,size,RWver)
- Struct (id1,size,RWver, ObjectCount)
- Geometry * (id15,size,RWver)
- Struct (id1,size,RWver, flags, FaceCount, VertexCount, FrameCount, ...)
- Material List (id8,size,RWver)
- Struct (id1,size,RWver, MaterialCount, -1, -1, -1)
- Material * (id7,size,RWver)
- Struct (id1,size,RWver, 0, RGBA, 0x094B5D54, TextureCount, ...)
- Texture - optional (id6,size,RWver)
- Extension
- Material Effects PLG - optional (id288,size,RWver, 1, 1, 1, 1)
- Texture - optional (See Material Effects PLG for more information) (id6,size,RWver)
- Struct (id1,size,RWver, FilterFlag, 1)
- String - environment map name (id2,size,RWver, string)
- String - alpha texture name (id2,size,RWver, string)
- Extension (id3,size,RWver)
- Texture - optional (See Material Effects PLG for more information) (id6,size,RWver)
- Texture - optional (See Material Effects PLG for more information) (id6,size,RWver)
- Reflection Material - optional
- Specular Material - optional
- UV Animation PLG - optional
- Material Effects PLG - optional (id288,size,RWver, 1, 1, 1, 1)
- Extension
- Bin Mesh PLG
- Native Data PLG (on Xbox and PS2)
- Struct (5, VertexOffset, VertexUnknow, 6, VertexCount, 32, 0x164314, ...)
- 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
(Header) 2 bytes - int - Flags 2 bytes - int - Unknown 4 bytes - int - Face Count 4 bytes - int - Vertex Count 4 bytes - int - Frame Count
(Lighting Header) {IF RWver = 3.0.0.0 THEN} 4 bytes - float - Ambient 4 bytes - float - Diffuse 4 bytes - float - Specular {END IF}
(Vertex Colors) {IF Prelit=1 in flags THEN} {ARRAY OF SIZE = Vertex Count*4 bytes} 1 byte - byte - Red 1 byte - byte - Green 1 byte - byte - Blue 1 byte - byte - Alpha {END ARRAY} {END IF}
(UV Mapping level 1) {IF Textured=1 or Textured_2=1 in flags THEN} {ARRAY OF SIZE: Vertex Count*8 bytes} 4 bytes - float - U 4 bytes - float - V {END ARRAY} {END IF}
(UV Mapping level 2) {IF Textured_2=1 in flags THEN} {ARRAY OF SIZE: Vertex Count*8 bytes} 4 bytes - float - U 4 bytes - float - V {END ARRAY} {END IF}
(UV Mapping level 3) {IF Textured_2=1 in flags THEN} {ARRAY OF SIZE: Vertex Count*8 bytes} 4 bytes - float - U 4 bytes - float - V {END ARRAY} {END IF}
(Faces) {ARRAY OF SIZE: Face Count*8 bytes} 2 bytes - int - Vertex 2 2 bytes - int - Vertex 1 2 bytes - int - Vertex Alpha 2 bytes - int - Vertex 3 {END ARRAY}
(Bounding Sphere) 4 bytes - float - Coordinate X 4 bytes - float - Coordinate Y 4 bytes - float - Coordinate Z 4 bytes - float - Radius 4 bytes - int - Has Position 4 bytes - int - Has Normals
(Verticles) {ARRAY OF SIZE: Vertex Count*12 bytes} 4 bytes - float - Coordinate X 4 bytes - float - Coordinate Y 4 bytes - float - Coordinate Z {END ARRAY}
(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}
Подсекция Bin Mesh PLG
4 bytes - int - Face type (Apparently always 1, representing a triangle strip) 4 bytes - int - Number of material splits 4 bytes - int - Number of faces
The number of material splits defines the size of an array which directly follows the structure above. The structure of the array elements (TMaterialSplitData) links the material split index to the vertices of the geometry:
4 bytes - int - Number of vertices 4 bytes - int - Material index X bytes - - Array of DWORDs, each entry representing an vertex index. Array size gets defined by the number of vertices
Подсекция Native Data PLG
(Section Header) 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
(Material Header) 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}
(выравнивание) {ARRAY OF SIZE: 16 - (12+MaterialCount*24 bytes) mod 16} 4 bytes - hex - 0xFFFFFFFF {END ARRAY}
(Tristrips) {ARRAY OF SIZE: MaterialCount.TristripsCount*2 bytes} 2 bytes - int - Vertex {END ARRAY}
(выравнивание) {ARRAY OF SIZE: unknow} 4 bytes - hex - 0xFFFFFFFF {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}
(выравнивание) {ARRAY OF SIZE: unknow} 4 bytes - hex - 0xFFFFFFFF {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}
(выравнивание) {ARRAY OF SIZE: unknow} 4 bytes - hex - 0xFFFFFFFF {END ARRAY}
Flags - значение, определяющее содержимое секции геометрии. Раскладывается на логические значения путём деления на 2 и проверки остатка (либо можно просто проверять каждый бит). Значения в итерациях:
Флаг | Двоичный вид | Имя | Описание |
---|---|---|---|
1 | 0000 0001 | Tristrips | на модели используются Triangle strip (обычно в DFF начиная с версии 3.4), экспортируются скриптами Дениски. |
2 | 0000 0010 | Positions | в геометрии есть секции Verticles и Faces |
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 | определяет некий dynamic vertex lightning |
64 | 0100 0000 | Modulate Material Color | цвет материала, для экспорта опция MMC в скриптах Кама или Дениски должна быть включена |
128 | 1000 0000 | Textured_2 | в геометрии есть секции UV Mapping level 1, UV Mapping level 2 и UV Mapping level 3, экспорт поддерживается только официальным экспортёром в DFF от Criterion Games. |
Section: Material List
Material List - Data
|SECTION START|
4 bytes - int - Material Count
|SECTION END|
Section: Material
Material - Data
|SECTION START|
4 bytes - int - Unknown 4 bytes - RGBA - Colour 4 bytes - int - Unknown 4 bytes - int - Texture Count 4 bytes - float - Unknown 4 bytes - float - Unknown 4 bytes - float - Unknown
|SECTION END|
Section: Texture
Texture - Data
|SECTION START|
2 bytes - int - Texture Filter Mode Flags 2 bytes - int - Unknown
|SECTION END|
Section: Atomic
Atomic - Data
|SECTION START|
4 bytes - int - Frame Number 4 bytes - int - Geometry Number 4 bytes - int - Unknown 4 bytes - int - Unknown
|SECTION END|