MDL — различия между версиями
Материал из GTAModding.ru
DenielX (обсуждение | вклад) м |
|||
Строка 12: | Строка 12: | ||
== Структура == | == Структура == | ||
− | |||
− | |||
Общее для всех [[MDL|<code>*.mdl</code>]] - наличие глобального заголовка и atomic-заголовка. Остальные секции [[MDL|<code>*.mdl</code>]] строго специфические для каждой из поддерживаемых платформ - PSP или PS2 | Общее для всех [[MDL|<code>*.mdl</code>]] - наличие глобального заголовка и atomic-заголовка. Остальные секции [[MDL|<code>*.mdl</code>]] строго специфические для каждой из поддерживаемых платформ - PSP или PS2 | ||
− | + | '''Структура глобального заголовка MDL (на основе данных Хероманта):''' | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | '''Структура заголовка MDL (на основе данных Хероманта):''' | + | |
0х00 4b: сигнатура "LDM" | 0х00 4b: сигнатура "LDM" | ||
− | 0х04 4b: | + | 0х04 4b: флаг MultiMDL/WRLD (0 - MDL содержит 1 модель; 1 - MDL содержит много моделей) |
0х08 4b: размер MDL | 0х08 4b: размер MDL | ||
− | 0х0С 4b: | + | 0х0С 4b: переход на таблицу смещений для распределения файла в памяти (глобалсекция на жаргоне) |
− | 0х10 4b: | + | 0х10 4b: переход на таблицу смещений для распределения файла в памяти (повторяется) |
− | 0х14 4b: количество | + | 0х14 4b: количество смещений в глобалсекции |
0х18 4b: адрес на конец глобалсекции (на последний оффсет в таблице адресов) | 0х18 4b: адрес на конец глобалсекции (на последний оффсет в таблице адресов) | ||
0х1С 2b: не используется (всегда 0) | 0х1С 2b: не используется (всегда 0) | ||
− | 0х1E 2b: тип MDL | + | 0х1E 2b: тип чтения MDL (0х01 - модель со скинингом, 0хХС - 1цветное авто, 0хХЕ - 0цветное авто 0х1Х - 2цветное авто и т.д.) |
− | 0х20 4b: адрес 1 ( | + | '''Заголовок MDL''' |
− | . | + | |
+ | 0х20 4b: адрес 1 (зависит от типа MDL) | ||
+ | 0x24 4b: адрес 2 или количество добавочных элементов в модели (зависит от типа MDL) | ||
+ | 0х28 4b: переход на добавочные элементы в модели (зависит от типа MDL) | ||
+ | 0х2С 212b: массив переходов на материалы, перекрашиваемые цветами [[carcols.dat]] (зависит от типа MDL) | ||
− | == | + | ==Clump:Struct== |
− | 4b: | + | 4b: тип секции |
4b: переход на первый фрейм | 4b: переход на первый фрейм | ||
− | 4b: | + | 4b: переход на первый атомик |
− | === | + | ===Clump:FrameList:Struct=== |
− | 4b: | + | 4b: тип секции |
4b: 0 в первом фрейме либо переход на первый фрейм | 4b: 0 в первом фрейме либо переход на первый фрейм | ||
4b: позиция в файле | 4b: позиция в файле | ||
Строка 74: | Строка 70: | ||
4b: выравнивание (FFFFFFFF) | 4b: выравнивание (FFFFFFFF) | ||
4b: 0 | 4b: 0 | ||
− | 4b: переход на | + | 4b: 0 или переход на Clump:FrameList:Extension:Frame |
4b: неизвестно | 4b: неизвестно | ||
− | |||
− | ==Clump== | + | ==Clump:TextureList:Struct== |
− | 4b: | + | 4b: тип секции |
− | 4b: | + | 4b: 0 |
− | 4b: | + | 4b: 1 |
+ | 4b: переход на Clump:TextureList:String | ||
+ | 4b: количество текстур | ||
+ | 4b: количество текстур (повторяется) | ||
+ | 4b: 0 | ||
+ | 4b: выравнивание (AAAAAAAA) | ||
− | == | + | ==Atomic== |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
{{Заготовка}} | {{Заготовка}} | ||
''Информация будет добавлена позже...'' | ''Информация будет добавлена позже...'' | ||
+ | |||
+ | ==Список материалов== | ||
====MDL-версия==== | ====MDL-версия==== | ||
− | + | ||
− | + | 12b: point3 X Y Z (не используется) | |
+ | 4b: множитель U | ||
+ | 4b: множитель V | ||
+ | 4b: цвет материала (не используется) | ||
+ | 4b: переход на начало тристрипцев (относительно секции геометрии) | ||
+ | 2b: количество тристрипцев в материале | ||
+ | 2b: номер текстуры из TextureList | ||
====WRLD-версия==== | ====WRLD-версия==== | ||
Строка 140: | Строка 139: | ||
==Список геометрии== | ==Список геометрии== | ||
+ | |||
+ | [[Изображение:Tri-Strip.png|200px|thumb|right|''Tri-Strips'' - серия связанных треугольников и вершин. Специально используется в играх данной серии для быстрого рендеринга.]] | ||
====PS2-версия==== | ====PS2-версия==== | ||
Строка 154: | Строка 155: | ||
* Блок 76 - '''UV''' - содержит все координаты UV-маппинга в тристрипсе. Одна координата закодирована 1м байтом, вычисляется делением на 255 и умножением на 2 (иногда умножение на 2 не требуется - импортёр должен проверять получившуюся цифру после деления). Размер блока = заголовок блока (4 байта) + (UV (2 байта) * количество вершинок в тристрипсе). | * Блок 76 - '''UV''' - содержит все координаты UV-маппинга в тристрипсе. Одна координата закодирована 1м байтом, вычисляется делением на 255 и умножением на 2 (иногда умножение на 2 не требуется - импортёр должен проверять получившуюся цифру после деления). Размер блока = заголовок блока (4 байта) + (UV (2 байта) * количество вершинок в тристрипсе). | ||
− | * Блок 6F - '''Прилайт | + | * Блок 6F - '''Прилайт Stories''' - содержит RGBA для предварительного освещения вершинки. Используется только в [[GTA LCS]] и [[GTA VCS]]. Вычисляется по хитрой формуле AK-73. Размер блока = заголовок блока (4 байта) + (RGBA (2 байта) * количество вершинок в тристрипсе). |
+ | |||
+ | * Блок 6Е - '''Прилайт Manhunt 2''' - содержит RGBA для предварительного освещения вершинки. Используется только в [[Manhunt 2]]. Каждый цвет закодирован одним байтом. Размер блока = заголовок блока (4 байта) + (RGBA (4 байта) * количество вершинок в тристрипсе). | ||
* Блок 6A - '''Нормали''' - содержит все координаты векторов нормалей в трипстрипсе. Одна координата закодирована одним байтом и вычисляется делением на 127. Размер блока = заголовок блока (4 байта) + (XYZ (3 байта) * количество вершинок в тристрипсе). | * Блок 6A - '''Нормали''' - содержит все координаты векторов нормалей в трипстрипсе. Одна координата закодирована одним байтом и вычисляется делением на 127. Размер блока = заголовок блока (4 байта) + (XYZ (3 байта) * количество вершинок в тристрипсе). | ||
Строка 202: | Строка 205: | ||
====Структура файла==== | ====Структура файла==== | ||
− | |||
'''Главный заголовок''' | '''Главный заголовок''' | ||
− | Заголовок 1 имеет типичную структуру во всех файлах движка, отличается лишь сигнатурой. | + | Заголовок 1 имеет типичную структуру во всех файлах движка, отличается лишь сигнатурой (см. ''пункт Структура главного заголовка MDL'') |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
'''Заголовок MDL и цикл чтения моделей''' | '''Заголовок MDL и цикл чтения моделей''' | ||
Строка 225: | Строка 216: | ||
Размер заголовка = 8 байт | Размер заголовка = 8 байт | ||
− | 4b - | + | 4b - Переход на первую строку цикла поиска моделей. |
− | 4b - | + | 4b - Переход на последнюю строку цикла поиска моделей. |
Версия 13:33, 16 февраля 2014
MDL – внутренный формат моделей игр от Rockstar Leeds (не путайте его с другими MDL-файлами, содержащимися в прочих видеоиграх), используемый в GTA LCS, GTA VCS и Manhunt2. Данный формат жестко привязан к игровой платформе (PSP/PS2), т.е. не является кроссплатформенным в отличие от DFF, использовавшегося в предыдущих играх серии GTA до покупки RenderWare фирмой EA Games.
Содержание |
Основные данные
PSP-версия MDL была разобрана J-Fox, им же написана программа, читающая структуру MDL-файлов с рендерингом геометрии и UV-координат с текстурами из *.chk
-файлов. Как и остальной многочисленный софт для GTA: LCS и GTA: VCS, программа от J-Fox не была автором выложена в открытый доступ.
PS2-версия MDL разобрана AK-73 aka Alex, им же написан уникальный скрипт к 3D Studio Max для импорта любого *.mdl
-файла PS2-версии. Подробнее о скрипте читайте в статье о MDL importer.
Структура
Общее для всех *.mdl
- наличие глобального заголовка и atomic-заголовка. Остальные секции *.mdl
строго специфические для каждой из поддерживаемых платформ - PSP или PS2
Структура глобального заголовка MDL (на основе данных Хероманта):
0х00 4b: сигнатура "LDM" 0х04 4b: флаг MultiMDL/WRLD (0 - MDL содержит 1 модель; 1 - MDL содержит много моделей) 0х08 4b: размер MDL 0х0С 4b: переход на таблицу смещений для распределения файла в памяти (глобалсекция на жаргоне) 0х10 4b: переход на таблицу смещений для распределения файла в памяти (повторяется) 0х14 4b: количество смещений в глобалсекции 0х18 4b: адрес на конец глобалсекции (на последний оффсет в таблице адресов) 0х1С 2b: не используется (всегда 0) 0х1E 2b: тип чтения MDL (0х01 - модель со скинингом, 0хХС - 1цветное авто, 0хХЕ - 0цветное авто 0х1Х - 2цветное авто и т.д.)
Заголовок MDL
0х20 4b: адрес 1 (зависит от типа MDL) 0x24 4b: адрес 2 или количество добавочных элементов в модели (зависит от типа MDL) 0х28 4b: переход на добавочные элементы в модели (зависит от типа MDL) 0х2С 212b: массив переходов на материалы, перекрашиваемые цветами carcols.dat (зависит от типа MDL)
Clump:Struct
4b: тип секции 4b: переход на первый фрейм 4b: переход на первый атомик
Clump:FrameList:Struct
4b: тип секции 4b: 0 в первом фрейме либо переход на первый фрейм 4b: позиция в файле 4b: позиция в файле-4
{цикл - чтение матрицы положения пустышки в сцене - 2 раза
4b: matrix3[1][1] 4b: matrix3[1][2] 4b: matrix3[1][3] 4b: не используется (всегда = 0) 4b: matrix3[2][1] 4b: matrix3[2][2] 4b: matrix3[2][3] 4b: не используется (всегда = 0) 4b: matrix3[3][1] 4b: matrix3[3][2] 4b: matrix3[3][3] 4b: не используется (всегда = 0) 4b: X координата относительно центра модели 4b: Y координата относительно центра модели 4b: Z координата относительно центра модели 4b: 1 (конец строки)
конец цикла}
4b: переход на следующий фрейм 4b: 0 4b: переход на первый фрейм 4b: выравнивание (FFFFFFFF) 4b: 0 4b: 0 или переход на Clump:FrameList:Extension:Frame 4b: неизвестно
Clump:TextureList:Struct
4b: тип секции 4b: 0 4b: 1 4b: переход на Clump:TextureList:String 4b: количество текстур 4b: количество текстур (повторяется) 4b: 0 4b: выравнивание (AAAAAAAA)
Atomic
Информация будет добавлена позже...
Список материалов
MDL-версия
12b: point3 X Y Z (не используется) 4b: множитель U 4b: множитель V 4b: цвет материала (не используется) 4b: переход на начало тристрипцев (относительно секции геометрии) 2b: количество тристрипцев в материале 2b: номер текстуры из TextureList
WRLD-версия
Содержится исключительно в *.wrld
и является сжатой по сравнению с *.mdl
-версией для быстрого чтения и экономии памяти консоли. Вместо имён текстур содержит их id (хэши).
Заголовок WRLD версии PS2:
количество материалов[2], размер секции материалов[2]
Заголовок WRLD версии PSP:
количество материалов[4], флаг 1[1], флаг 2[1], флаг 3[1], флаг 4[1]
Длина строки списка геометрии LCS PS2: = 22 байт.
id текстуры[2], Размер тристрипа[2], множитель для U[2], множитель для V[2], unknown2[2], код оптимизации[12]
Длина строки списка геометрии VCS PS2: = 24 байт.
размер тристрипа х2[4], id текстуры[2], множитель для U[2], множитель для V[2], unknown2[2], код оптимизации[12] для получения точного размера тристрипа нужно разделить "размер тристрипа х2" на 2 нацело.
Длина строки списка геометрии LCS PSP может быть в 2х вариантах: 10 байт или 24 байт. Определяется с помощью флага 4 в заголовке: если флаг 4 <>0 то длина строки = 24 байт, если =0 то, соответственно, 10 байт.
id текстуры[2], количество вершин в тристрипе[2], множитель для U[2], множитель для V[2], unknown2[2], код оптимизации[14](секция может отсутствовать)
Длина строки списка геометрии VCS PSP: = 24 байт.
id текстуры[2], количество вершин в тристрипе[2], множитель для U[2], множитель для V[2], unknown2[2], код оптимизации[14]
Множители U и V представляют собой half precision floating point. Описание см. здесь
DTZ-версия
MDL-файлы, "вшитые" внутри DTZ-файла. Формат ничем не отличается, поэтому MDL importer может прочитать DTZ как MDL и импортировать модели.
Список геометрии
PS2-версия
Вся геометрия модели разбита на тристрипсы (поддержка тристрипсов присутствует и в DFF-файлах GTA: SA).
Чтение первого тристрипса в MDL начинается сразу после списка материалов. Началом чтения геометрии тристрипса служит флаг 6С018000. За флагом 2 раза повторяется количество вершинок в тристрипсе. Затем идёт технический сектор 40404020, который необходим для движка (для импорта модели он не важен).
Далее идут собственно блоки, содержащие элементы модели:
- Блок 79 - Гео - содержит все координаты вершинок в тристрипсе. Одна координата закодирована 2мя байтами и представляет собой обычный множитель на размер ограничивающей модель коробки из клампа. Размер блока = заголовок блока (4 байта) + (XYZ (6 байтов) * количество вершинок в тристрипсе).
Блок геометрии заканчивается техническим блоком 50505020, который необходим для движка (для импорта модели он не важен).
- Блок 76 - UV - содержит все координаты UV-маппинга в тристрипсе. Одна координата закодирована 1м байтом, вычисляется делением на 255 и умножением на 2 (иногда умножение на 2 не требуется - импортёр должен проверять получившуюся цифру после деления). Размер блока = заголовок блока (4 байта) + (UV (2 байта) * количество вершинок в тристрипсе).
- Блок 6F - Прилайт Stories - содержит RGBA для предварительного освещения вершинки. Используется только в GTA LCS и GTA VCS. Вычисляется по хитрой формуле AK-73. Размер блока = заголовок блока (4 байта) + (RGBA (2 байта) * количество вершинок в тристрипсе).
- Блок 6Е - Прилайт Manhunt 2 - содержит RGBA для предварительного освещения вершинки. Используется только в Manhunt 2. Каждый цвет закодирован одним байтом. Размер блока = заголовок блока (4 байта) + (RGBA (4 байта) * количество вершинок в тристрипсе).
- Блок 6A - Нормали - содержит все координаты векторов нормалей в трипстрипсе. Одна координата закодирована одним байтом и вычисляется делением на 127. Размер блока = заголовок блока (4 байта) + (XYZ (3 байта) * количество вершинок в тристрипсе).
- Блок 6С - Скиннинг - содержит таблицу весов вершинок для их анимации. Это id косточки (1 байт) + её вес (3 байта). Соответственно, каждая вершинка содержит 4 id (т.е. в анимации она управляется 4 косточками). Размер блока = заголовок блока (4 байта) + ((id_weight (4 байта) * 4) * количество вершинок в тристрипсе.
Чтение следующего тристрипса начинается сразу же за флагом окончания тристрипса - 14000006. Общее количество тристрипсев в модели так же записано в клампе.
PSP-версия
Информация будет добавлена позже...
Геометрия представляет собой массив тристрипсов, UV координат и прилайта и нормалей.
Геометрия WRLD
Количество вершин в тристрипсе записано в строке материала.
Первый тристрипс наченается сразу после списка материалов
Размер тристрипса = количество вершин * 1 строка массива вершин (в WRLD = 10 байт)
Каждый следующий тристрипс начинается после конца предыдущего
Одна строчка массива вершин = 10 байт
2b: UV (координаты рассчитываются аналогично PS2)
2b: Vcol (расчет прилайта аналогичен PS2)
2b: xCoord (рассчитывается с учетом скайлинга в WRLD)
2b: yCoord (рассчитывается с учетом скайлинга в WRLD)
2b: zCoord (рассчитывается с учетом скайлинга в WRLD)
MDL версии Manhunt 2
MDL версии Manhunt 2 на всех версиях кроме Wii имеет схожую структуру и может быть легко сконвертирован в любую из версий простым преобразованием формата, в котором игра хранит геометрию модели.
MDL может содержать как одну, так и нескольно моделей, принцип чтения которых описан ниже.
MDL версии PS2 и PSP имеет расширение .DFF
Структура файла
Главный заголовок
Заголовок 1 имеет типичную структуру во всех файлах движка, отличается лишь сигнатурой (см. пункт Структура главного заголовка MDL)
Заголовок MDL и цикл чтения моделей
Представляет собой цикл считывания каждой отдельной модели.
Размер заголовка = 8 байт
4b - Переход на первую строку цикла поиска моделей. 4b - Переход на последнюю строку цикла поиска моделей.
Строка цикла поиска моделей:
4b - Смещение на следующую суб-модель. 4b - Смещение на предыдущую суб-модель. 4b - Смещение на текущую суб-модель.
При переходе на смещение на текущую суб-модель игра считывает еще одно промежуточное смещение, которое, наконец, приводит к циклу чтения геометрии текущей суб-модели.
Геометрия версии PC
Заголовок
Размер заголовка 180 байт
4b - Смещение на список использованных текстур. Первой текстуре присваивается индекс 0, второй 1 и т.д. 4b - количество использованных текстур в модели. 4b - Смещение на кости для текущей модели. Если =0 - модель не имеет привязанных костей. 4b - неизветно 4b - неизвестно, обычно 1 12b - padding 4b - сигнатура (0х45D454) 4b - размер модели 4b - неизвестно, обычно 0 4b - количество материалов в модели 4b - количество индексов полигонов. (кол-во полигонов = количество индексов полигонов/3) 16b - 4 float - X Y Z и радиус ограничивающей сферы 12b - 3 float, обычно 1.0 1.0 1.0 4b - количество вершин в модели. 12b - padding 4b - шаг чтения одной вершины 44b - неизвестные данные, при любом их изменении или обнулении никакого эффекта в игре не проявляется 4b - параметры вертексов (по данным параметрам игра определяет какие секции имеют вершины - Normals, VCol, Skin и тд) 32b - неизвестные данные, при любом их изменении или обнулении никакого эффекта в игре не проявляется
Список материалов
Расположен сразу за заголовком, длина строки материала = 44 байт
24b - 6 floats - ограничивающая коробка 2b - количество индексов полигонов текущего материала (кол-во полигонов = количество индексов полигонов текущего материала/3). 2b - ID текстуры 2b - количество индексов полигонов, пропускаемых перед началом чтения необходимых индексов для текущего материала. 14b - неизвестно, при любом их изменении или обнулении никакого эффекта в игре не проявляется
Индексы полигонов
Таблица индексов полигонов располагается сразу после списка материалов. Каждый индекс = 2b. Количество индексов указано в заголовке.
Структура вершин и привязанные к ней параметры
В отличии от DFF, где все параметры вертексов расположены в отдельных таблицах, в MDL версии PC все параметры считываются сразу после координат вертекса.
Размер строки вертекса задается параметрами вертексов в заголовке.
Примерная структурная последовательность параметров вертексов в MDL версии PC.
12b - 3 floats - X Y Z 20b - Скиннинг (4 floats[4b] - веса, 4 bytes [1b] - ID костей) 8b - Нормали (3 words [2b] - X Y Z нормали, 2b -0) 4b - VCol (4b, хранится в BGRA а не в RGBA) 8b - UV1 (2 floats) 8b - UV2 (2 floats - обычно встречается в моделях персонажей, развертка для текстур кровяных пятен на теле)