Статьи

Документация

Дополнительно

2D-тесселятор

Модуль тесселятора stappler_tess отвечает за две задачи:

  • Разбитие аналитических кривых на прямые отрезки
  • Преобразование форм, заданных прямыми отрезками, в треугольники, заполняющие эту форму без пересечений

Работа с кривыми

За интерфейс работы с путями отвечает заголовок SPTessLine.h.

Вспомогательная структура LineDrawer (SPTessLine.h:54) используется для преобразования команд векторного пути в последовательность точек, соединённых отрезками с немедленной записью в тесселятор (в качестве тела заливки пути, либо тела обводки, либо и того, и другого)

Для рисования обводки используется вычисление нормали к кривой, после чего рисуются два отрезка, по положительному и отрицательному направлению нормали, эти отрезки соединяются с предыдущим вычисленным отрезком, формируя сегмент обводки. В случае, если угол в измеряемом сегменте слишком мал, формируется замещающая структура из дополнительных точек.

Тесселятор

API тесселятора определён в SPTess.h. Основу публичного API составляют функции для добавления вершин к обработке, настройки параметров и запуск процесса. Для добавления вершин используется структура Tesselator::Cursor, содержащая информацию о текущем контуре. Возможно добавление вершин сразу несколькими курсорами (в одном потоке).

Основные параметры тесселятора:

  • Поворотное правило (WindingRule) — управляет тем, какую область считать внутренней для фигуры
  • Правило смещения точек — управляет смещением точек при рисовании в режиме антиалиасинга
  • Значение смещения при режиме антиалиасинга (ширина субпиксельной границы фигуры)

Запуск тесселятора двухэтапный:

  • Сперва вызывается функция prepare, приводящая тесселятор в конечное состояние и возвращающая в целевой объект необходимое количество вершин и треугольников для размещения их в буфере
  • Затем вызывается функция write, записывающая результат через вызов функции в передаваемой структуре

Такой подход позволяет использовать несколько экземпляров тесселятора для наполнения одного набора буферов, и, тем самым, более эффективно управлять памятью графических устройств.

Пример реализации

Самостоятельная реализация интерфейса к тесселятору достаточна сложна. В качестве примера стоит обратить внимание на реализацию xenolith::basic2d::VectorCanvas (XL2dVectorCanvas.h). Этот интерфейс трансформирует данные векторного изображения в набор индексов и координат треугольников для отрисовки, и данные для перекраски изображения без повторного запуска тесселятора.