MDL — различия между версиями

Материал из GTAModding.ru
Перейти к: навигация, поиск
м
Строка 12: Строка 12:
  
 
== Структура ==
 
== Структура ==
 
[[Изображение:Tri-Strip.png|200px|thumb|right|Изображение одного тристрипса]]
 
  
 
Общее для всех [[MDL|<code>*.mdl</code>]] - наличие глобального заголовка и atomic-заголовка. Остальные секции [[MDL|<code>*.mdl</code>]] строго специфические для каждой из поддерживаемых платформ - PSP или PS2
 
Общее для всех [[MDL|<code>*.mdl</code>]] - наличие глобального заголовка и atomic-заголовка. Остальные секции [[MDL|<code>*.mdl</code>]] строго специфические для каждой из поддерживаемых платформ - PSP или PS2
  
Основные термины:
+
'''Структура глобального заголовка MDL (на основе данных Хероманта):'''
 
+
''Tri-Strips'' - серия связанных треугольников и вершин. Специально используется в играх данной серии  для быстрого рендеринга.
+
 
+
''Pre-Light'' - предварительное освещение модели во время её рендеринга.
+
 
+
'''Структура заголовка MDL (на основе данных Хероманта):'''
+
  
 
   0х00 4b: сигнатура "LDM"
 
   0х00 4b: сигнатура "LDM"
   0х04 4b: не используется (всегда = 0)
+
   0х04 4b: флаг MultiMDL/WRLD (0 - MDL содержит 1 модель; 1 - MDL содержит много моделей)
 
   0х08 4b: размер MDL
 
   0х08 4b: размер MDL
   0х0С 4b: адрес на начало глобалсекции (таблицы адресов для всех подсекций в MDL)
+
   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)
+
'''Заголовок MDL'''
   ...
+
 
 +
   0х20 4b: адрес 1 (зависит от типа MDL)
 +
   0x24 4b: адрес 2 или количество добавочных элементов в модели (зависит от типа MDL)
 +
  0х28 4b: переход на добавочные элементы в модели (зависит от типа MDL)
 +
  0х2С 212b: массив переходов на материалы, перекрашиваемые цветами [[carcols.dat]] (зависит от типа MDL)
 
    
 
    
  
==Atomic==
+
==Clump:Struct==
  
   4b: идентификатор секции
+
   4b: тип секции
 
   4b: переход на первый фрейм
 
   4b: переход на первый фрейм
   4b: ...
+
   4b: переход на первый атомик
  
===Atomic:Frame===
+
===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: неизвестно
  4b: 0
 
  
==Clump==
+
==Clump:TextureList:Struct==
  
   4b: количество адресов либо номер секции (для клампа = 2)
+
   4b: тип секции
   4b: адрес первого фрейма
+
  4b: 0
   4b: адрес первого атомика
+
  4b: 1
 +
  4b: переход на Clump:TextureList:String
 +
  4b: количество текстур
 +
  4b: количество текстур (повторяется)
 +
   4b: 0
 +
   4b: выравнивание (AAAAAAAA)
  
===Clump:Frame===
+
==Atomic==
 
+
  4b: количество адресов либо номер секции (для фрейма = 1)
+
  4b: переход на продолжение
+
 
+
  8b: нули
+
  4b: неизвестно
+
  4b: флаг
+
 
+
==Список материалов==
+
 
{{Заготовка}}
 
{{Заготовка}}
 
''Информация будет добавлена позже...''
 
''Информация будет добавлена позже...''
 +
 +
==Список материалов==
  
 
====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 - '''Прилайт GTA Stories''' - содержит RGBA для предварительного освещения вершинки. Используется только в [[GTA LCS]] и [[GTA VCS]]. Вычисляется по хитрой формуле AK-73. Размер блока = заголовок блока (4 байта) + (RGBA (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 байта) * количество вершинок в тристрипсе).
 
* Блок 6A - '''Нормали''' - содержит все координаты векторов нормалей в трипстрипсе. Одна координата закодирована одним байтом и вычисляется делением на 127. Размер блока = заголовок блока (4 байта) + (XYZ (3 байта) * количество вершинок в тристрипсе).
Строка 202: Строка 205:
  
 
====Структура файла====
 
====Структура файла====
 
  
 
'''Главный заголовок'''
 
'''Главный заголовок'''
  
Заголовок 1 имеет типичную структуру во всех файлах движка, отличается лишь сигнатурой.
+
Заголовок 1 имеет типичную структуру во всех файлах движка, отличается лишь сигнатурой (см. ''пункт Структура главного заголовка MDL'')
 
+
Размер заголовка = 32b
+
 
+
  4b - Сигнатура PMLC 
+
  4b - unknown (обычно = 1)
+
  4b - Размер MDL
+
  4b - Переход на таблицу смещений для распределения файла в памяти
+
  4b - Переход на таблицу смещений для распределения файла в памяти (повторяется)
+
  4b - Количество смещений в таблице выше
+
  8b - padding
+
 
+
  
 
'''Заголовок 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.

Содержание

Основные данные

Скриншот программы J-Fox'a

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 и импортировать модели.

Список геометрии

Tri-Strips - серия связанных треугольников и вершин. Специально используется в играх данной серии для быстрого рендеринга.

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 - обычно встречается в моделях персонажей, развертка для текстур кровяных пятен на теле)


п · о · р
Lcs.png GTA Liberty City Stories Vcs.png GTA Vice City Stories
Форматы файлов.anim.at3.cam.chk/.xtx.col2.cut.dtz.ifp.img/.dir.irx.gxt.lvz.mdl.pss.raw/.sdt.scm.vb.wrld
ИнструментыApacheConsole Texture Explorer (PSP/PS2)GTA Stories IMG ToolGTA Stories Texture ViewerGTA Stories Texture Explorer
GTA Stories RAW EditorGXT EditorJPCSPMDL importerMF AudioPCSX2PPSSPPStories WRLD ToolGTA Stories Map Converter v1.0UMD GenYAIE
ТуториалыМоддинг VCS и LCS (PSP/PS2)Аудио на PSPАудио на PS2Спецификация версий PS2Конфигурирование PCSX2
ПК-версииVice City StoriesLiberty City Stories