Перейти к содержанию

Структуры построения уровня: вершины, стороны, линии, секторы

В этом разделе представлены лишь главные и самые используемые составляющие структур постороения уровней — в случае нужды все остальные есть и в u-/g-/q-/lzdoom.pk3.

Теория

Сектор (Sector) — единица разметки пространства уровня, реализует понятие "высоты". Имеет такие основные характеристики, как высота пола, высота потолка, их текстуры, уровень освещённости, эффект (например, кислотный урон или мигание). Со всех сторон сектор ограничен линиями (linedef, см. ниже) — в простейшем случае тремя, получится форма треугольника.

Вся область внутри уровня делится на секторы, вне секторов есть только пустота, отсутствие уровня. В одной комнате может быть несколько секторов (например, ступени или полутень не могут состоять из одного сектора). Несколько комнат могут иметь в себе один и тот же сектор.

Обычно граница секторов является замкнутой, то есть, двигаясь по её линиям в одну сторону, в результате окажешься в точке, откуда начал движение. Такие секторы называются "замкнутыми". При нарушении этого правила (при незамкнутом секторе) зачастую возникают ошибки отображения; однако при аккуратном использовании также проявляются и недокументированные особенности движка — например, таким образом создаётся имитация глубокой воды в TNT: Evilution, или невидимый пол в The Plutonia Experiment.

Линия (Linedef) — единица отсечения секторов друг от друга и от пустоты вне уровня, реализует геометрию пространства и стены в частности. Обычно говорят о длине линии, её направлении, её свойстве/действии, её сторонах (Sidedef) и о секторах, которым она принадлежит. Когда линия отделяет сектор от пустоты (т. н. "односторонняя линия"), она является границей только одного сектора, и принадлежит только ему. Когда линия разделяет разные секторы ("двусторонняя линия"), то говорят о принадлежности к переднему и заднему сектору.

Любая линия является отрезком, то есть имеет ровно два конца и не может продолжаться до бесконечности в любую сторону. Точки, в которых начинается и заканчивается отрезок, называются вершинами (Vertex). Одна вершина может являться концом неограниченного числа линий.

Сторона линии (Sidedef) всегда связана с линией (Linedef), реализует визуальную отрисовку — текстуру с этой стороны, смещение текстуры, её растяжение и так далее. Как говорилось ранее, у линии может быть или одна, или две независимые стороны.

Пол сектора, также как и его потолок, на самом деле является плоскостью (Plane). Это плоскость в математическом понимании — она имеет только вектор нормали (т. е. наклон плоскости) и расстояние от базовой точки мира.

Все изменяющиеся объекты на уровне, такие как двери, лифты, мерцание света, создаются через разновидности класса Thinker.

Содержимое составляющих уровня

Вершина ("Vertex") хранит только неизменяемую позицию:

native readonly Vector2 p;

Сторона линии ("Side") уже гораздо более интересна.

native readonly Sector sector;  // Сектор, на который выходит эта сторона.
native readonly Line linedef;   // Линия, которой принадлежит эта сторона.
native int16    Light;          // Уровень освещённости стороны.
native uint8    Flags;          // Флаги стороны.

native TextureID GetTexture(int which);  // Функция, позволяющая получить id текстуры на этой стороне.
native clearscope Vertex V1();  // Функция, возвращающая указатель на первую вершину для стороны.
native clearscope Vertex V2();  // Функция, возвращающая указатель на вторую вершину для стороны.
native int Index();             // Функция, возвращающая индекс стороны.

Линия ("Line"):


Сектор ("Sector"):