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