diff options
author | Mikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com> | 2019-04-07 23:24:17 +0300 |
---|---|---|
committer | Mikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com> | 2019-04-17 17:21:41 +0300 |
commit | 7a7192516ffa9b4ed5b94b60961a4dc74fcf6e64 (patch) | |
tree | 432a69b7a31b833304ccafcffe83b0cfe00d3c1f /src/mbgl/tile/geometry_tile.cpp | |
parent | 4b21560cf59877125ea0bdae1a2546ab06f1efb2 (diff) | |
download | qtlocation-mapboxgl-7a7192516ffa9b4ed5b94b60961a4dc74fcf6e64.tar.gz |
[core] Introduce `LayerRenderData`. Source::update() accepts layer properties.
Diffstat (limited to 'src/mbgl/tile/geometry_tile.cpp')
-rw-r--r-- | src/mbgl/tile/geometry_tile.cpp | 40 |
1 files changed, 24 insertions, 16 deletions
diff --git a/src/mbgl/tile/geometry_tile.cpp b/src/mbgl/tile/geometry_tile.cpp index 3a50d957f6..109b6377e1 100644 --- a/src/mbgl/tile/geometry_tile.cpp +++ b/src/mbgl/tile/geometry_tile.cpp @@ -87,21 +87,22 @@ void GeometryTile::setData(std::unique_ptr<const GeometryTileData> data_) { } -void GeometryTile::setLayers(const std::vector<Immutable<Layer::Impl>>& layers) { +void GeometryTile::setLayers(const std::vector<Immutable<LayerProperties>>& layers) { // Mark the tile as pending again if it was complete before to prevent signaling a complete // state despite pending parse operations. pending = true; - std::vector<Immutable<Layer::Impl>> impls; + std::vector<Immutable<LayerProperties>> impls; impls.reserve(layers.size()); for (const auto& layer : layers) { // Skip irrelevant layers. - assert(layer->getTypeInfo()->source != LayerTypeInfo::Source::NotRequired); - assert(layer->source == sourceID); - assert(layer->visibility != VisibilityType::None); - if (id.overscaledZ < std::floor(layer->minZoom) || - id.overscaledZ >= std::ceil(layer->maxZoom)) { + const auto& layerImpl = *layer->baseImpl; + assert(layerImpl.getTypeInfo()->source != LayerTypeInfo::Source::NotRequired); + assert(layerImpl.source == sourceID); + assert(layerImpl.visibility != VisibilityType::None); + if (id.overscaledZ < std::floor(layerImpl.minZoom) || + id.overscaledZ >= std::ceil(layerImpl.maxZoom)) { continue; } @@ -127,7 +128,7 @@ void GeometryTile::onLayout(LayoutResult result, const uint64_t resultCorrelatio pending = false; } - buckets = std::move(result.buckets); + layerIdToLayerRenderData = std::move(result.renderData); latestFeatureIndex = std::move(result.featureIndex); @@ -180,8 +181,8 @@ void GeometryTile::upload(gfx::Context& context) { } }; - for (auto& entry : buckets) { - uploadFn(*entry.second); + for (auto& entry : layerIdToLayerRenderData) { + uploadFn(*entry.second.bucket); } if (glyphAtlasImage) { @@ -200,14 +201,21 @@ void GeometryTile::upload(gfx::Context& context) { } Bucket* GeometryTile::getBucket(const Layer::Impl& layer) const { - const auto it = buckets.find(layer.id); - if (it == buckets.end()) { + const LayerRenderData* data = getLayerRenderData(layer); + return data ? data->bucket.get() : nullptr; +} + +const LayerRenderData* GeometryTile::getLayerRenderData(const style::Layer::Impl& layerImpl) const { + const auto it = layerIdToLayerRenderData.find(layerImpl.id); + if (it == layerIdToLayerRenderData.end()) { + return nullptr; + } + const LayerRenderData& result = it->second; + if (result.layerProperties->baseImpl->getTypeInfo() != layerImpl.getTypeInfo()) { + // Layer data might be outdated, see issue #12432. return nullptr; } - Bucket* result = it->second.get(); - assert(result); - // Bucket might be outdated, see issue #12432. - return result->supportsLayer(layer) ? result : nullptr; + return &result; } float GeometryTile::getQueryPadding(const std::vector<const RenderLayer*>& layers) { |