Опис файлу
Містить всю видиму геометрію карти. Тут вказані всі вершини з нормалями та координатами для текстур та індекси для побудови геометрії, а також синхронізація.
Файл складається з таких блоків:
|
Код блоку
|
Версія компілятора картки |
1
|
Опис вершин |
9
|
Опис індексів |
10
|
Опис синхронізації |
11
|
Версія компілятора картки (блок для всіх карток однаковий)
|
Значення
|
Розмір
|
Код блоку |
1
|
Word(2)
|
Стиснення даних (0 - ні, 32768 - так) |
0
|
Word(2)
|
Розмір блоку (у байтах) |
4
|
DWord(4)
|
Номер версії (для всіх однаковий) |
13
|
DWord(4)
|
Опис вершин
|
Значення
|
Розмір
|
Код блоку |
9
|
Word(2)
|
Стиснення даних (0 - ні, 32768 - так) |
0
|
Word(2)
|
Розмір блоку (у байтах) |
4
|
DWord(4)
|
Кількість блоків опису вершин |
-
|
DWord(4)
|
Блок опису вершин |
-
|
-
|
Блок опису вершин
|
Значення
|
Розмір
|
Початок нового блоку |
0
|
DWord(4)
|
Початок опису формату вершини |
2
|
DWord(4)
|
Формат вершини |
-
|
-
|
Кінець опису формату вершини |
255
|
DWord(4)
|
Початок опису вершин |
17
|
DWord(4)
|
Кількість вершин |
-
|
DWord(4)
|
Вершини |
-
|
-
|
Формат вершин
Декілька слів про формат вершин. Як відомо, у файлі кілька блоків опису вершин. У грі не всі об'єкти однакові: для брашів потрібно вказувати координати лайтмапів, а координати текстур для дерев можна спростити. Тому вершини, задані в різних блоках, можу відрізнятися. Формат вершини задається за допомогою кількох структур – це стандартний формат вертекс-буфера D3D. Тобто. у файлі зберігаються готові скомпоновані вертекс-буфери для D3D:
|
Значення
|
Розмір
|
??? (Завжди нуль) |
0
|
Word(2)
|
Зміщення |
-
|
Word(2)
|
Тип змінних |
-
|
Word(2)
|
Що описують змінні |
-
|
Word(2)
|
На початку будь-якої вершини знаходяться координати її розміщення, тому, у форматі вершин опис координат не вказується. У картах версії 2215 зустрічаються лише три формати вершин:
Рослинність
|
||
|
Значення
|
Розмір
|
Нуль |
0
|
Word(2)
|
Зміщення |
12
|
Word(2)
|
Тип змінних |
4
|
Word(2)
|
Нормалі |
3
|
Word(2)
|
Чинник освітленості(?) |
?
|
Word(2)
|
Зміщення |
16
|
Word(2)
|
Тип змінних |
4
|
Word(2)
|
Тангенти |
6
|
Word(2)
|
Коректор текс.коорд.Х |
0/1
|
Word(2)
|
Зміщення |
20
|
Word(2)
|
Тип змінних |
4
|
Word(2)
|
Бі-тангенти |
7
|
Word(2)
|
Коректор текс.коорд.Y |
0/1
|
Word(2)
|
Зміщення |
24
|
Word(2)
|
Тип змінних |
7
|
Word(2)
|
Координати текстури |
5
|
Word(2)
|
Таким чином, сумарна довжина однієї вершини рослинності дорівнює 32 байтам.
Браш
|
||
|
Значення
|
Розмір
|
Нуль |
0
|
Word(2)
|
Зміщення |
12
|
Word(2)
|
Тип змінних |
4
|
Word(2)
|
Нормалі |
3
|
Word(2)
|
Чинник освітленості(?) |
?
|
Word(2)
|
Зміщення |
16
|
Word(2)
|
Тип змінних |
4
|
Word(2)
|
Тангенти |
6
|
Word(2)
|
Коректор текс.коорд.X |
0/1
|
Word(2)
|
Зміщення |
20
|
Word(2)
|
Тип змінних |
4
|
Word(2)
|
Бі-тангенти |
7
|
Word(2)
|
Коректор текс.коорд.Y |
0/1
|
Word(2)
|
Зміщення |
24
|
Word(2)
|
Тип змінних |
1
|
Word(2)
|
Координати текстури |
5
|
Word(2)
|
Нуль |
0
|
Word(2)
|
Зміщення |
32
|
Word(2)
|
Тип змінних |
6
|
Word(2)
|
Координати лайтмапу |
261
|
Word(2)
|
Сумарна довжина однієї вершини браша становить 36 байт.
Ентітя
|
||
|
Значення
|
Розмір
|
Нуль |
0
|
Word(2)
|
Зміщення |
12
|
Word(2)
|
Тип змінних |
4
|
Word(2)
|
Нормалі |
3
|
Word(2)
|
Чинник освітленості(?) |
?
|
Word(2)
|
Зміщення |
16
|
Word(2)
|
Тип змінних |
4
|
Word(2)
|
Тангенти |
6
|
Word(2)
|
Коректор текс.коорд.X |
0/1
|
Word(2)
|
Зміщення |
20
|
Word(2)
|
Тип змінних |
4
|
Word(2)
|
Бі-тангенти |
7
|
Word(2)
|
Коректор текс.коорд.Y |
0/1
|
Word(2)
|
Зміщення |
24
|
Word(2)
|
Тип змінних |
4
|
Word(2)
|
??? |
10
|
Word(2)
|
Нуль |
0
|
Word(2)
|
Зміщення |
28
|
Word(2)
|
Тип змінних |
1
|
Word(2)
|
Координати текстури |
5
|
Word(2)
|
Сумарна довжина однієї вершини ентіті складає 36 байт.
Виходячи з цього, отримуємо, наприклад, такий вид вершини:
Браш
|
|||
|
Значення
|
Зміщення
|
Розмір
|
Координата X |
30.76
|
0
|
DWord(4)
|
Координата Z |
0.2
|
4
|
DWord(4)
|
Координата Y |
51.4
|
8
|
DWord(4)
|
Нормаль за X |
127
|
12
|
Byte(1)
|
Нормаль за Z |
255
|
13
|
Byte(1)
|
Нормаль по Y |
127
|
14
|
Byte(1)
|
Чинник освітленості(?) |
1
|
15
|
Byte(1)
|
Тангент з Х |
127
|
16
|
Byte(1)
|
Тангент з Z |
255
|
17
|
Byte(1)
|
Тангент з Y |
255
|
18
|
Byte(1)
|
Коректор текс.коорд.Х |
0
|
19
|
Byte(1)
|
Бі-тангент з X |
0
|
20
|
Byte(1)
|
Бі-тангент з Z |
127
|
21
|
Byte(1)
|
Бі-тангент з Y |
127
|
22
|
Byte(1)
|
Коректор текс.коорд.Y |
0
|
23
|
Byte(1)
|
Координата текстури X |
3.1802
|
24
|
Single(4)
|
Координата текстури Y |
2.2143
|
28
|
Single(4)
|
Координата лайтмапу X |
0.4023
|
32
|
ShortSingle(2)
|
Координата лайтмапу Y |
0.000097
|
34
|
ShortSingle(2)
|
Типи змінних
Код типу
|
Значення
|
1
|
DWord(4) + DWord(4)
|
4
|
Byte(1) + Byte(1) + Byte(1) + Byte(1)
|
6
|
Word(2)/32768 + Word(2)/32768
|
7
|
(Byte(1)-128)/128 + (Byte(1)-128)/128 + (Byte(1)-128)/128 + (Byte(1)-128)/128
|
З ходу, можливо, важко в'їхати в структуру даних, але коли почнете колупати файл, відразу все зрозумієте - нічого складного немає.
Опис індексів
|
Значення
|
Розмір
|
Код блоку |
10
|
Word(2)
|
Стиснення даних (0 - ні, 32768 - так) |
0
|
Word(2)
|
Розмір блоку (у байтах) |
-
|
DWord(4)
|
Кількість блоків опису індексів |
-
|
DWord(4)
|
Блок опису індексів |
-
|
-
|
Блок опису індексів
|
Значення
|
Розмір
|
Кількість індексів у блоці |
-
|
DWord(4)
|
Індекси |
-
|
DWord(4)
|
Індекс: Word (2).
Кількість індексів має бути завжди втричі, тому що за індексами будуються трикутники.
Опис синхронізації
(що вони синхронізують, для вчених досі залишається загадкою):
|
Значення
|
Розмір
|
Код блоку |
11
|
Word(2)
|
Стиснення даних (0 - ні, 32768 - так) |
0
|
Word(2)
|
Розмір блоку (у байтах) |
-
|
DWord(4)
|
Кількість блоків синхронізації |
-
|
DWord(4)
|
Блоки синхронізації |
-
|
-
|
Блок синхронізації
|
Значення
|
Розмір
|
??? |
0
|
DWord(4)
|
??? |
0
|
DWord(4)
|
??? |
0
|
DWord(4)
|
??? |
0
|
DWord(4)
|
Кількість одиниць синхронізації |
-
|
DWord(4)
|
Одиниці синхронізації |
-
|
-
|
Одиниця синхронізації
|
Значення
|
Розмір
|
??? |
-
|
DWord(4)
|
??? |
-
|
Word(2)
|
??? |
-
|
Word(2)
|