Skip to content
Asp Adm (Alexey Kirillov) edited this page Jan 6, 2019 · 7 revisions

English version

Формат: SEC

Описание

Сектор карты (участок)

Визуализация

структура sec, png изображение

Структура

Файл начинается с заголовка:

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 градусам.

Clone this wiki locally