DFF — различия между версиями
Материал из GTAModding.ru
DK22 (обсуждение | вклад) м (→Подсекция Native Data PLG) |
|||
Строка 65: | Строка 65: | ||
В заголовке секции можно найти закодированный номер версии RenderWare, под которую скомпилирован DFF-файл: | В заголовке секции можно найти закодированный номер версии RenderWare, под которую скомпилирован DFF-файл: | ||
− | 3.0.0.0 - | + | 3.0.0.0.2 - 0x00000302 - остатки альфа-объектов GTA3, геометрия хранится в секции атомика (Sony PlayStation 2) |
− | 3. | + | 3.0.0.0.4 - 0x00000304 - Grand Theft Auto III (Sony PlayStation 2) |
+ | 3.0.0.0.10 - 0x00000310 - Grand Theft Auto III (Sony PlayStation 2, Microsoft Windows (MultiDFF и Generic)) | ||
+ | 3.2.0.0 - 0x0800FFFF - Grand Theft Auto III (Microsoft Windows) | ||
3.3.0.2 - 0x0C02FFFF - Grand Theft Auto: Vice City (Microsoft Windows) | 3.3.0.2 - 0x0C02FFFF - Grand Theft Auto: Vice City (Microsoft Windows) | ||
3.4.0.3 - 0x1003FFFF - Grand Theft Auto III и Grand Theft Auto: Vice City (Microsoft Xbox) | 3.4.0.3 - 0x1003FFFF - Grand Theft Auto III и Grand Theft Auto: Vice City (Microsoft Xbox) |
Версия 20:35, 12 января 2014
DFF — формат файлов, использующийся Rockstar Games для хранения трёхмерных визуальных моделей в Grand Theft Auto III, Grand Theft Auto: Vice City, Grand Theft Auto: San Andreas и некоторых других RenderWare-играх. Является кроссплатформенным форматом.
Содержание |
Основные данные
Все трёхмерные модели в RenderWare-играх закодированы в виде бинарных потоков. Все бинарные потоки с визуальными моделями имеют расширение DFF (для хранения отдельных объектов) или BSP (для хранения одного игрового уровня). Для просмотра и редактирования иерархии потоков DFF и BSP существует программа RW Analyze, автором которой является Steve M. Для работы с DFF в Autodesk 3ds Max используются KAM's Scripts или SA Tools (автор — DENISka). Импорт и экспорт DFF также присутствует в Zanoza Modeler.
Структура
В узлах иерархии бинарных потоков 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
Полный список идентификаторов можно найти в этой статье.
По имени секции можно догадаться, что в ней хранится (например, rwDATA, что находится в rwGEOMETRY, содержит все вершины и нормали трёхмерных объектов, а rwDATA из секции rwGEOMETRYLIST содержит число и имена геометрических объектов).
Версии DFF
В заголовке секции можно найти закодированный номер версии RenderWare, под которую скомпилирован DFF-файл:
3.0.0.0.2 - 0x00000302 - остатки альфа-объектов GTA3, геометрия хранится в секции атомика (Sony PlayStation 2) 3.0.0.0.4 - 0x00000304 - Grand Theft Auto III (Sony PlayStation 2) 3.0.0.0.10 - 0x00000310 - Grand Theft Auto III (Sony PlayStation 2, Microsoft Windows (MultiDFF и Generic)) 3.2.0.0 - 0x0800FFFF - Grand Theft Auto III (Microsoft Windows) 3.3.0.2 - 0x0C02FFFF - Grand Theft Auto: Vice City (Microsoft Windows) 3.4.0.3 - 0x1003FFFF - Grand Theft Auto III и Grand Theft Auto: Vice City (Microsoft Xbox) 3.4.0.5 - 0x1005FFFF - Grand Theft Auto: Vice City (Android) 3.5.0.0 - 0x1400FFFF - Grand Theft Auto III (Android) 3.6.0.3 - 0x1803FFFF - Grand Theft Auto: San Andreas и Manhunt
Содержимое DFF
Секция Clump
Clump → Data
|начало секции|
4 bytes - int - количество объектов
|конец секции|
Секция Frame List
Frame List → Data
|начало секции|
4 bytes - int - количество фреймов (информация о фрейме) {ARRAY OF SIZE: [количество фреймов]} 36 bytes - float matrix (3 x 3) - матрица вращения 12 bytes - float - смещение координат 4 bytes - int - родительский фрейм 4 bytes - int - неизвестно {END ARRAY}
|конец секции|
Frame List → Frame
|начало секции|
[Section Size] bytes - string - имя фрейма
|конец секции|
Секция Geometry List
Geometry List → Data
|начало секции|
4 bytes - int - количество геометрических объектов
|конец секции|
Geometry List → Material Split
|начало секции|
(заголовок) 4 bytes - int - Triangle Strip 4 bytes - int - количество разделений 4 bytes - int - количество полигонов (информация о разделении) {ARRAY OF SIZE: [заголовок → количество разделений]} 4 bytes - int - индекс полигона 4 bytes - int - индекс материала (информация о вершинах) {ARRAY OF SIZE: [индекс полигона]} 4 bytes - int - веришина 1 {END ARRAY}
|конец секции|
Секция Geometry
(заголовок) 4 bytes - int - формат 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 - имеет нормали
(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}
(нормали) {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
4 bytes - int - Face type (Apparently always 1, representing a triangle strip) 4 bytes - int - количество разделений материала 4 bytes - int - количество полигонов
Количество разделений материала задаёт размер массива, который управляет структурой нижнего уровня. Структура элементов массива (TMaterialSplitData) соединяет индекс разделения материала с точками геометрии:
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
(заголовок секции) 4 bytes - int - 5 4 bytes - hex - VertexOffset 2 bytes - int - VertexUnknow 2 bytes - int - MaterialCount 4 bytes - int - 6 4 bytes - int - VertexCount 4 bytes - int - 32 4 bytes - hex - 0x164314
(заголовок материала) 4 bytes - int - 0 4 bytes - int - unknow1 4 bytes - int - unknow2
(Material tristrips info) {ARRAY OF SIZE: MaterialCount*24 bytes} 4 bytes - int - MaterialCount.VertexCountStart 4 bytes - int - MaterialCount.VertexCountEnd 4 bytes - int - MaterialCount.TristripsCount 4 bytes - int - MaterialCount.UnknowCount 4 bytes - hex - Unknow3 (in fist = 0x17AB78) 4 bytes - hex - 0x19ED91 {END ARRAY}
(Padding) {ARRAY OF SIZE: 16 - (12+MaterialCount*24 bytes) mod 16} 1 byte - hex - 0xCD {END ARRAY}
(Tristrips) {ARRAY OF SIZE: MaterialCount.TristripsCount*2 bytes} 2 bytes - int - Vertex {END ARRAY}
(Padding) {ARRAY OF SIZE: unknow} 1 byte - hex - 0xCD {END ARRAY}
(Verticles) {ARRAY OF SIZE: Vertex Count*(24 or 32) bytes} 4 bytes - float - Coordinate X 4 bytes - float - Coordinate Y 4 bytes - float - Coordinate Z 1 byte - int - Color R 1 byte - int - Color G 1 byte - int - Color B 1 byte - int - Color Alpha 4 bytes - float - U 4 bytes - float - V {IF Textured_2=1 in flags THEN} 4 bytes - float - U 4 bytes - float - V {END IF} {END ARRAY}
(Padding) {ARRAY OF SIZE: unknow} 1 byte - hex - 0xCD {END ARRAY}
(Normals) {IF Normals=1 in Flags THEN} {ARRAY OF SIZE: Vertex Count*12 bytes} 4 bytes - float - Coordinate X 4 bytes - float - Coordinate Y 4 bytes - float - Coordinate Z {END ARRAY} {END IF}
(Padding) {ARRAY OF SIZE: unknow} 1 byte - hex - 0xCD {END ARRAY}
Format - определяет формат геометрии.
struct GeometryFormat{ unsigned short Flags; // флаги, см. ниже unsigned char NumTexCoorsCustom; // если это значение больше нуля, флаги Textured и Textured_2 // игнорируются. Позволяет указывать произвольное (1 - 8) кол-во текстурных координат. unsigned char GeometryNativeFlags; // 0x01 rpGEOMETRYNATIVE // 0x02 rpGEOMETRYNATIVEINSTANCE };
Флаги - значения, определяющие содержимое секции геометрии. Раскладываются на логические значения путём деления на 2 и проверки остатка (либо можно просто проверять каждый бит). Значения в итерациях:
Флаг | Двоичный вид | Имя | Описание |
---|---|---|---|
1 | 0000 0001 | rpWORLDTRISTRIP | на модели используются Triangle strip (обычно в DFF начиная с версии 3.4), экспортируются скриптами Дениски. |
2 | 0000 0010 | Meshes | в геометрии есть секции Verticles и Faces |
4 | 0000 0100 | rpWORLDTEXTURED | в геометрии есть секция UV Mapping level 1, для экспорта опция UV в скриптах Кама должна быть включена |
8 | 0000 1000 | rpWORLDPRELIT | в геометрии есть секция Vertex Colors, для экспорта опция VCol в скриптах Кама должна быть включена |
16 | 0001 0000 | rpWORLDNORMALS | в геометрии есть секция Normals, для экспорта опция Nor в скриптах Кама должна быть включена |
32 | 0010 0000 | rpWORLDLIGHT | определяет некий dynamic vertex lightning |
64 | 0100 0000 | rpWORLDMODULATEMATERIALCOLOR | цвет материала, для экспорта опция 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|
Форматы файлов | .bik • .bsp • .col • .dff • .grf • .gxt • .ifp • .inst • .fxp • .mls • .pak • .rib • .raw/.sdt/.lst • .scc • .spl • .txd |
Инструменты | Clump Viewer • Col-IO • Collision File Editor II • DFF Viewer • G-Tools • Kam's Max Scripts • PS2 TXD Mod PS2 TXD Viewer • RW Analyze • ViceTXD • TXD Workshop • ZModeler |