2D-тесселятор
Модуль тесселятора stappler_tess
отвечает за две задачи:
- Разбитие аналитических кривых на прямые отрезки
- Преобразование форм, заданных прямыми отрезками, в треугольники, заполняющие эту форму без пересечений
Работа с кривыми
За интерфейс работы с путями отвечает заголовок SPTessLine.h
.
Вспомогательная структура LineDrawer
(SPTessLine.h:54
) используется для преобразования команд векторного пути в последовательность точек, соединённых отрезками с немедленной записью в тесселятор (в качестве тела заливки пути, либо тела обводки, либо и того, и другого)
Для рисования обводки используется вычисление нормали к кривой, после чего рисуются два отрезка, по положительному и отрицательному направлению нормали, эти отрезки соединяются с предыдущим вычисленным отрезком, формируя сегмент обводки. В случае, если угол в измеряемом сегменте слишком мал, формируется замещающая структура из дополнительных точек.
Тесселятор
API тесселятора определён в SPTess.h
. Основу публичного API составляют функции для добавления вершин к обработке, настройки параметров и запуск процесса. Для добавления вершин используется структура Tesselator::Cursor
, содержащая информацию о текущем контуре. Возможно добавление вершин сразу несколькими курсорами (в одном потоке).
Основные параметры тесселятора:
- Поворотное правило (
WindingRule
) — управляет тем, какую область считать внутренней для фигуры - Правило смещения точек — управляет смещением точек при рисовании в режиме антиалиасинга
- Значение смещения при режиме антиалиасинга (ширина субпиксельной границы фигуры)
Запуск тесселятора двухэтапный:
- Сперва вызывается функция
prepare
, приводящая тесселятор в конечное состояние и возвращающая в целевой объект необходимое количество вершин и треугольников для размещения их в буфере - Затем вызывается функция
write
, записывающая результат через вызов функции в передаваемой структуре
Такой подход позволяет использовать несколько экземпляров тесселятора для наполнения одного набора буферов, и, тем самым, более эффективно управлять памятью графических устройств.
Пример реализации
Самостоятельная реализация интерфейса к тесселятору достаточна сложна. В качестве примера стоит обратить внимание на реализацию xenolith::basic2d::VectorCanvas
(XL2dVectorCanvas.h
). Этот интерфейс трансформирует данные векторного изображения в набор индексов и координат треугольников для отрисовки, и данные для перекраски изображения без повторного запуска тесселятора.