-
Notifications
You must be signed in to change notification settings - Fork 2
sec_ru
Сектор карты (участок)
Файл начинается с заголовка:
struct header
{
uint magic; // 74 F7 4B CF
byte liquids;
};
После него располагаются данные:
struct vertex
{
signed byte x_offset;
signed byte y_offset;
ushort altitude; // высота по z
uint packed_normal;
};
struct vertex land_vertex_array[33][33];
Если liquids != 0
, то есть дополнительный набор вершин:
struct vertex liquids_vertex_array[33][33];
Далее расположена текстурная информация:
ushort land_textures[16][16];
Если liquids != 0
, то есть дополнительный набор текстур:
ushort liquids_textures[16][16];
И в конце файла, если liquids != 0
:
ushort liquids_tile_material_index[16][16];
Материалы задаются в MP файле.
Если индекс материала = 65535, то тайл не текстурируется.
10 бит на ось z, по 11 на x и y
uint packed_normal;
float x = ((float)((packed_normal >> 11) & 0x7FF) - 1000.0f) / 1000.0f;
float y = ((float)(packed_normal & 0x7FF) - 1000.0f) / 1000.0f;
float z = (float)(packed_normal >> 22) / 1000.0f;
6 бит на индекс в атласе, 8 на номер текстуры, 2 на вращение
ushort texture;
byte tile_index = f & 63;
byte texture_index = (f >> 6) & 255;
byte rotation = (f >> 14) & 3;
Вершины идут по 33 элемента в 33 строки, то есть, образуя 32х32 клетки. Длина клетки по стороне - 1 условная единица.
Позиция вершины:
x = индекс по x + x_offset / 254
y = индекс по y + y_offset / 254
z = altitude / 65535 * max_altitude (из .mp файла)
Вершины объединяются в полигоны "гребёнкой", при этом четыре вершины образуют два полигона:
0 1 2
*-*-*
|\|\| ~
33 *-*-*
|\|\| ~
66 *-*-*
~ ~ ~
Текстура накладывается на сразу четыре таких клетки, то есть, 16х16 тайлов. Длина тайла - 2 условные единицы. Тайл может быть повёрнут на угол, кратный 90 градусам.