Система событий в Deck.gl построена вокруг абстракции взаимодействия между низкоуровневым WebGL-контекстом и высокоуровневыми декларативными слоями. В основе лежит механизм picking, диспетчеризация pointer-событий и единая модель обработки пользовательского ввода, интегрированная с рендер-циклом.
Событийная модель не существует отдельно от графа слоёв. Каждый кадр рендеринга сопровождается возможностью вычисления интерактивного состояния сцены. Это означает, что события формируются не браузером напрямую, а через промежуточный слой анализа пиксельных данных и сопоставления их с объектами сцены.
Ключевые компоненты:
props
слоёв.В рамках Deck.gl события формируются как результат синхронизации этих компонентов.
В отличие от DOM-модели, события не «всплывают» по дереву элементов. Вместо этого используется техника color picking: каждый объект сцены рендерится в скрытый буфер с уникальным идентификатором цвета.
Алгоритм включает этапы:
objectIndex и layerId в
цветовые каналы.Результат операции — объект события, содержащий ссылки на слой, индекс экземпляра и геометрию.
Событие в системе Deck.gl представляет собой расширенный объект, включающий как данные DOM-события, так и метаданные сцены.
Типичная структура:
type — тип взаимодействия (click,
hover, dragstart и др.);coordinate — координаты в мировом пространстве;pixel — экранные координаты;object — объект данных слоя;layer — ссылка на слой-источник;index — индекс экземпляра;lngLat — географические координаты (если используется
геопространственный контекст);picked — флаг успешного picking.Дополнительно могут присутствовать вычисленные поля камеры и матрицы преобразования.
Событийная модель включает несколько категорий взаимодействий.
Pointer-события являются базовым уровнем:
pointermove — движение курсора;pointerdown — нажатие;pointerup — отпускание кнопки;pointerleave — выход за пределы canvas.Они формируются из DOM-событий, но проходят через нормализацию координат и проверку picking.
На основе pointer-событий формируются более высокоуровневые:
click — комбинация pointerdown +
pointerup на одном объекте;hover — активное наведение на объект;dragstart, drag, dragend —
последовательность перемещения объекта.Эти события зависят от состояния слоя и конфигурации контроллера.
Каждый слой в Deck.gl может объявлять обработчики событий в
props. При этом события не закреплены за DOM-узлами, а
маршрутизируются через систему диспетчеризации.
Пример логики:
Важно, что один пиксель может соответствовать множеству логических сущностей (например, при instanced rendering), поэтому система учитывает индекс инстанса.
Контроллеры (controller API) перехватывают часть событий до их попадания в слои. Их задача — преобразование ввода в изменения состояния камеры:
Контроллер может «поглощать» событие, предотвращая его передачу в слои. Это создаёт двухуровневую модель:
Такое разделение критично для сцен с картографической или 3D-навигацией.
Система использует порядок обработки:
При наличии нескольких слоёв под курсором применяется правило глубины и порядка рендеринга (z-index в логике WebGL).
Drag-события реализуются через внутреннее состояние:
object;Система учитывает, что объект может исчезнуть из-под курсора во время
drag (например, при фильтрации данных), поэтому используется сохранённый
reference на object index.
Основная нагрузка связана с picking-pass. Оптимизации включают:
hover через throttle;В сложных сценах стоимость чтения пикселя и пересборки буфера становится критическим фактором, поэтому события не вычисляются непрерывно без необходимости.
Каждое событие сопровождается трансформацией координат:
x, y);Deck.gl выполняет преобразование через матрицы view/projection, синхронизированные с состоянием камеры.
Событийная модель допускает расширение через кастомные слои. Такие слои могут:
В этом случае слой становится самостоятельной единицей логики взаимодействия, сохраняя совместимость с глобальной системой picking.
События тесно связаны с кадрами рендеринга. Это означает:
Каждое событие привязано к моменту времени внутри render loop, что позволяет воспроизводить взаимодействия детерминированно при повторном рендере сцены.