DFF — различия между версиями
Материал из GTAModding.ru
Строка 13: | Строка 13: | ||
4 bytes - int - Идентификатор секции | 4 bytes - int - Идентификатор секции | ||
4 bytes - int - Размер секции | 4 bytes - int - Размер секции | ||
− | + | 4 bytes - hex - Версия DFF | |
− | + | ||
* (Данные секции) | * (Данные секции) | ||
[Размер секции] bytes - data - данные внутри секции | [Размер секции] bytes - data - данные внутри секции | ||
+ | |||
Идентификатор секции определяет, как данные должны быть обработаны. Например если идентификатор секции = rwDATA, rwSTRING, rwFRAME или rwMATERIALSPLIT, то для анализа секции нужно спуститься на один уровень вниз по иерархии - в данные, где расположены другие секции, как например здесь: | Идентификатор секции определяет, как данные должны быть обработаны. Например если идентификатор секции = rwDATA, rwSTRING, rwFRAME или rwMATERIALSPLIT, то для анализа секции нужно спуститься на один уровень вниз по иерархии - в данные, где расположены другие секции, как например здесь: | ||
Строка 66: | Строка 66: | ||
В заголовке секции можно найти закодированные номера версий RenderWare, под которую скомпелирован DFF: | В заголовке секции можно найти закодированные номера версий RenderWare, под которую скомпелирован DFF: | ||
− | 3.0.0. | + | 3.0.0.0 - 0x00000310 - только для мульти-dff и генерика, остатки от ранних версий GTA III, которые DMA Designe переделывать не стали. |
− | + | 3.2.0.0 - 0x0800FFFF - GTA III | |
− | 3. | + | 3.3.0.2 - 0x0C02FFFF - GTA VC |
− | 3.3.0.2 - 0x0C02FFFF | + | 3.4.0.3 - 0x1003FFFF - GTA VC |
− | 3.4.0.3 - 0x1003FFFF | + | 3.6.0.3 - 0x1803FFFF - GTA SA |
− | 3.6.0.3 - 0x1803FFFF | + | |
=== Содержимое DFF === | === Содержимое DFF === | ||
− | * [[Clump (RW Section)|Clump]] | + | * [[Clump (RW Section)|Clump]] (id16,size,RWver) |
− | ** [[Struct (RW Section)#Clump|Struct]] | + | ** [[Struct (RW Section)#Clump|Struct]] (id1,size,RWver, ObjectCount) |
− | ** [[Frame List (RW Section)|Frame List]] | + | ** [[Frame List (RW Section)|Frame List]] (id14,size,RWver) |
− | *** [[Struct (RW Section)#Frame_List|Struct]] | + | *** [[Struct (RW Section)#Frame_List|Struct]] (id1,size,RWver, FrameCount, ...) |
− | *** [[Extension (RW Section)|Extension]] * | + | *** [[Extension (RW Section)|Extension]] * (id3,size,RWver) |
− | **** [[Frame (RW Section)|Frame]] | + | **** [[Frame (RW Section)|Frame]] (id39056126,size,RWver, string) |
**** [[HAnim PLG (RW Section)|HAnim PLG]] | **** [[HAnim PLG (RW Section)|HAnim PLG]] | ||
− | ** [[Geometry List (RW Section)|Geometry List]] | + | ** [[Geometry List (RW Section)|Geometry List]] (id26,size,RWver) |
− | *** [[Struct (RW Section)#Geometry_List|Struct]] | + | *** [[Struct (RW Section)#Geometry_List|Struct]] (id1,size,RWver, ObjectCount) |
− | *** [[Geometry (RW Section)|Geometry]] * | + | *** [[Geometry (RW Section)|Geometry]] * (id15,size,RWver) |
− | **** [[Struct (RW Section)#Geometry|Struct]] | + | **** [[Struct (RW Section)#Geometry|Struct]] (id1,size,RWver, flags, FaceCount, VertexCount, FrameCount, ...) |
− | **** [[Material List (RW Section)|Material List]] | + | **** [[Material List (RW Section)|Material List]] (id8,size,RWver) |
− | ***** [[Struct (RW Section)#Material_List|Struct]] | + | ***** [[Struct (RW Section)#Material_List|Struct]] (id1,size,RWver, MaterialCount, -1, -1, -1) |
− | ***** [[Material (RW Section)|Material]] * | + | ***** [[Material (RW Section)|Material]] * (id7,size,RWver) |
− | ****** [[Struct (RW Section)#Material|Struct]] | + | ****** [[Struct (RW Section)#Material|Struct]] (id1,size,RWver, 0, RGBA, 0x094B5D54, TextureCount, ...) |
− | ****** [[Texture (RW Section)|Texture]] - optional | + | ****** [[Texture (RW Section)|Texture]] - optional (id6,size,RWver) |
− | ******* [[Struct (RW Section)#Texture|Struct]] | + | ******* [[Struct (RW Section)#Texture|Struct]] (id1,size,RWver, FilterFlag, 0) |
− | ******* [[String (RW Section)|String]] - diffuse texture name | + | ******* [[String (RW Section)|String]] - diffuse texture name (id2,size,RWver, string) |
− | ******* [[String (RW Section)|String]] - alpha texture name | + | ******* [[String (RW Section)|String]] - alpha texture name (id2,size,RWver, string) |
− | ******* [[Extension (RW Section)|Extension]] | + | ******* [[Extension (RW Section)|Extension]] |
******** [[Sky Mipmap Val (RW Section)|Sky Mipmap Val]] ** | ******** [[Sky Mipmap Val (RW Section)|Sky Mipmap Val]] ** | ||
****** [[Extension (RW Section)|Extension]] | ****** [[Extension (RW Section)|Extension]] | ||
− | ******* [[Material Effects PLG (RW Section)|Material Effects PLG]] - optional | + | ******* [[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)'' | + | ******** [[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]] | + | ********* [[Struct (RW Section)#Texture|Struct]] (id1,size,RWver, FilterFlag, 1) |
− | ********* [[String (RW Section)|String]] - environment map name | + | ********* [[String (RW Section)|String]] - environment map name (id2,size,RWver, string) |
− | ********* [[String (RW Section)|String]] - alpha texture name | + | ********* [[String (RW Section)|String]] - alpha texture name (id2,size,RWver, string) |
− | ********* [[Extension (RW Section)|Extension]] | + | ********* [[Extension (RW Section)|Extension]] (id3,size,RWver) |
********** [[Sky Mipmap Val (RW Section)|Sky Mipmap Val]] ** | ********** [[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 | ******* [[Reflection Material (RW Section)|Reflection Material]] - optional | ||
******* [[Specular Material (RW Section)|Specular Material]] - optional | ******* [[Specular Material (RW Section)|Specular Material]] - optional | ||
Строка 194: | Строка 199: | ||
==== Секция: Geometry ==== | ==== Секция: Geometry ==== | ||
− | + | ('''Header''') | |
− | + | ||
− | + | ||
− | + | ||
− | (Header) | + | |
2 bytes - int - Flags | 2 bytes - int - Flags | ||
2 bytes - int - Unknown | 2 bytes - int - Unknown | ||
− | 4 bytes - int - | + | 4 bytes - int - Face Count |
4 bytes - int - Vertex Count | 4 bytes - int - Vertex Count | ||
− | 4 bytes - int - | + | 4 bytes - int - Frame Count |
− | (Lighting Header) | + | |
− | {IF | + | ('''Lighting Header''') |
+ | {IF RWver = 3.0.0.0 THEN} | ||
4 bytes - float - Ambient | 4 bytes - float - Ambient | ||
4 bytes - float - Diffuse | 4 bytes - float - Diffuse | ||
4 bytes - float - Specular | 4 bytes - float - Specular | ||
{END IF} | {END IF} | ||
− | ( | + | |
− | {IF | + | ('''Vertex Colors''') |
− | {ARRAY OF SIZE | + | {IF Prelit=1 in flags THEN} |
+ | {ARRAY OF SIZE = Vertex Count*4 byte} | ||
1 byte - byte - Red | 1 byte - byte - Red | ||
1 byte - byte - Green | 1 byte - byte - Green | ||
Строка 219: | Строка 222: | ||
{END ARRAY} | {END ARRAY} | ||
{END IF} | {END IF} | ||
− | ( | + | |
− | {IF | + | ('''UV Mapping''') |
− | {ARRAY OF SIZE: | + | {IF Textured=1 in flags THEN} |
+ | {ARRAY OF SIZE: Vertex Count*8 byte} | ||
4 bytes - float - U | 4 bytes - float - U | ||
4 bytes - float - V | 4 bytes - float - V | ||
{END ARRAY} | {END ARRAY} | ||
{END IF} | {END IF} | ||
− | ( | + | |
− | {ARRAY OF SIZE: | + | ('''Faces''') |
+ | {ARRAY OF SIZE: Face Count*8 byte} | ||
2 bytes - int - Vertex 2 | 2 bytes - int - Vertex 2 | ||
2 bytes - int - Vertex 1 | 2 bytes - int - Vertex 1 | ||
− | 2 bytes - int - | + | 2 bytes - int - Vertex Alpha |
2 bytes - int - Vertex 3 | 2 bytes - int - Vertex 3 | ||
{END ARRAY} | {END ARRAY} | ||
− | ( | + | |
− | 4 bytes - float - | + | ('''Bounding Sphere''') |
− | 4 bytes - float - | + | 4 bytes - float - Coordinate X |
− | 4 bytes - float - | + | 4 bytes - float - Coordinate Y |
− | 4 bytes - float - | + | 4 bytes - float - Coordinate Z |
+ | 4 bytes - float - Radius | ||
4 bytes - int - Has Position | 4 bytes - int - Has Position | ||
4 bytes - int - Has Normals | 4 bytes - int - Has Normals | ||
− | ( | + | |
− | {ARRAY OF SIZE: | + | ('''Verticles''') |
− | 4 bytes - float - X | + | {ARRAY OF SIZE: Vertex Count*12} |
− | 4 bytes - float - Y | + | 4 bytes - float - Coordinate X |
− | 4 bytes - float - Z | + | 4 bytes - float - Coordinate Y |
+ | 4 bytes - float - Coordinate Z | ||
{END ARRAY} | {END ARRAY} | ||
− | ( | + | |
− | {IF | + | ('''Normals''') |
− | {ARRAY OF SIZE: | + | {IF Normals=1 in Flags THEN} |
− | 4 bytes - float - X | + | {ARRAY OF SIZE: Vertex Count*12} |
− | 4 bytes - float - Y | + | 4 bytes - float - Coordinate X |
− | 4 bytes - float - Z | + | 4 bytes - float - Coordinate Y |
+ | 4 bytes - float - Coordinate Z | ||
{END ARRAY} | {END ARRAY} | ||
{END IF} | {END IF} | ||
− | + | '''Flags''' - значение, определяющее содержимое секции геометрии. Раскладывается на логические значения путём деления на 2 и проверки остатка (либо можно просто проверять каждый бит). Значения в итерациях: | |
+ | # Tristrips | ||
+ | # Positions | ||
+ | # Textured | ||
+ | # Prelit | ||
+ | # Normals | ||
+ | # Light | ||
+ | # Modulate Material Color | ||
+ | # Textured 2 | ||
+ | |||
==== Section: Material List ==== | ==== Section: Material List ==== | ||
Строка 274: | Строка 291: | ||
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 |
Версия 17:36, 9 июля 2012
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 - Размер секции 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, которые DMA Designe переделывать не стали. 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
- 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)
- 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 byte} 1 byte - byte - Red 1 byte - byte - Green 1 byte - byte - Blue 1 byte - byte - Alpha {END ARRAY} {END IF}
(UV Mapping) {IF Textured=1 in flags THEN} {ARRAY OF SIZE: Vertex Count*8 byte} 4 bytes - float - U 4 bytes - float - V {END ARRAY} {END IF}
(Faces) {ARRAY OF SIZE: Face Count*8 byte} 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} 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} 4 bytes - float - Coordinate X 4 bytes - float - Coordinate Y 4 bytes - float - Coordinate Z {END ARRAY} {END IF}
Flags - значение, определяющее содержимое секции геометрии. Раскладывается на логические значения путём деления на 2 и проверки остатка (либо можно просто проверять каждый бит). Значения в итерациях:
- Tristrips
- Positions
- Textured
- Prelit
- Normals
- Light
- Modulate Material Color
- Textured 2
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|