#include #include #include #include #include #include #include namespace mbgl { using namespace style; CircleBucket::CircleBucket(const std::map>& layerPaintProperties, const MapMode mode_, const float zoom) : mode(mode_) { for (const auto& pair : layerPaintProperties) { paintPropertyBinders.emplace(std::piecewise_construct, std::forward_as_tuple(pair.first), std::forward_as_tuple(getEvaluated(pair.second), zoom)); } } CircleBucket::~CircleBucket() = default; void CircleBucket::upload(gfx::UploadPass& uploadPass) { if (!uploaded) { vertexBuffer = uploadPass.createVertexBuffer(std::move(vertices)); indexBuffer = uploadPass.createIndexBuffer(std::move(triangles)); } for (auto& pair : paintPropertyBinders) { pair.second.upload(uploadPass); } uploaded = true; } bool CircleBucket::hasData() const { return !segments.empty(); } template static float get(const CirclePaintProperties::PossiblyEvaluated& evaluated, const std::string& id, const std::map& paintPropertyBinders) { auto it = paintPropertyBinders.find(id); if (it == paintPropertyBinders.end() || !it->second.statistics().max()) { return evaluated.get().constantOr(Property::defaultValue()); } else { return *it->second.statistics().max(); } } float CircleBucket::getQueryRadius(const RenderLayer& layer) const { const auto& evaluated = getEvaluated(layer.evaluatedProperties); float radius = get(evaluated, layer.getID(), paintPropertyBinders); float stroke = get(evaluated, layer.getID(), paintPropertyBinders); auto translate = evaluated.get(); return radius + stroke + util::length(translate[0], translate[1]); } void CircleBucket::update(const FeatureStates& states, const GeometryTileLayer& layer, const std::string& layerID, const ImagePositions& imagePositions) { auto it = paintPropertyBinders.find(layerID); if (it != paintPropertyBinders.end()) { it->second.updateVertexVectors(states, layer, imagePositions); uploaded = false; } } } // namespace mbgl