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

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

В этом разделе представлены лишь главные и самые используемые составляющие структур постороения уровней — в случае нужды все остальные есть и в 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"):