Описание файла "level.geom"

Файл состоит из таких блоков:

Код блока
Версия компилятора карты
1
Описание вершин
9
Описание индексов
10
Описание синхронизации
11

 

 

Версия компилятора карты (блок для всех карт одинаковый):

Значение
Размер
Код блока
1
Word(2)
Сжатие данных (0 - нет, 32768 - да)
0
Word(2)
Размер блока (в байтах)
4
DWord(4)
Номер версии (для всех одинаковый)
13
DWord(4)

 

 

Описание вершин:

Значение
Размер
Код блока
1
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)
Вершины
-
-

Несколько слов о формате вершин. Как уже известно, в файле несколько блоков описания вершин. В игре не все объекты одинаковы: для брашей нужно указывать координаты лайтмапов, а координаты текстур для деревьев можно упростить. Поэтому, вершины, заданные в разных блоках, могу отличаться. Формат вершины задаётся при помощи нескольких структурок:

Значение
Размер
???(всегда ноль)
0
Word(2)
Смещение
-
Word(2)
Тип переменных
-
Word(2)
Что описывают переменные
-
Word(2)

В самом начале любой вершины находятся координаты её размещения, поэтому, в формате вершин описание координат не указывается. В картах версии 2215 встречаются только три формата вершин:

Растительность
Значение
Размер
Ноль
0
Word(2)
Смещение
12
Word(2)
Тип переменных
4
Word(2)
Нормали
3
Word(2)
Ноль
0
Word(2)
Смещение
16
Word(2)
Тип переменных
4
Word(2)
Би-нормали
6
Word(2)
Ноль
0
Word(2)
Смещение
20
Word(2)
Тип переменных
4
Word(2)
Тангент-нормали
7
Word(2)
Ноль
0
Word(2)
Смещение
24
Word(2)
Тип переменных
7
Word(2)
Координаты текстуры
5
Word(2)

Таким образом, суммарная длина одной вершины растительности равна 32 байтам.

 

Браш
Значение
Размер
Ноль
0
Word(2)
Смещение
12
Word(2)
Тип переменных
4
Word(2)
Нормали
3
Word(2)
Ноль
0
Word(2)
Смещение
16
Word(2)
Тип переменных
4
Word(2)
Би-нормали
6
Word(2)
Ноль
0
Word(2)
Смещение
20
Word(2)
Тип переменных
4
Word(2)
Тангент-нормали
7
Word(2)
Ноль
0
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)
Ноль
0
Word(2)
Смещение
16
Word(2)
Тип переменных
4
Word(2)
Би-нормали
6
Word(2)
Ноль
0
Word(2)
Смещение
20
Word(2)
Тип переменных
4
Word(2)
Тангент-нормали
7
Word(2)
Ноль
0
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)
???
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)

 

Hosted by uCoz