void Tile::build(StyleContext& _ctx, const Scene& _scene, const TileData& _data, const DataSource& _source) { const auto& layers = _scene.layers(); _ctx.setGlobal("$zoom", m_id.z); for (auto& style : _scene.styles()) { style->onBeginBuildTile(*this); } for (const auto& datalayer : layers) { if (datalayer.source() != _source.name()) { continue; } for (const auto& collection : _data.layers) { if (!collection.name.empty() && collection.name != datalayer.collection()) { continue; } for (const auto& feat : collection.features) { _ctx.setFeature(feat); std::vector<DrawRule> rules; datalayer.match(feat, _ctx, rules); for (auto& rule : rules) { auto* style = _scene.findStyle(rule.style); if (style) { rule.eval(_ctx); style->buildFeature(*this, feat, rule); } } } } } for (auto& style : _scene.styles()) { style->onEndBuildTile(*this); } for (auto& geometry : m_geometry) { geometry.second->compileVertexBuffer(); } }