diff options
Diffstat (limited to 'src/mbgl/renderer/tile_pyramid.cpp')
-rw-r--r-- | src/mbgl/renderer/tile_pyramid.cpp | 99 |
1 files changed, 39 insertions, 60 deletions
diff --git a/src/mbgl/renderer/tile_pyramid.cpp b/src/mbgl/renderer/tile_pyramid.cpp index 4f095ed97d..81da42b526 100644 --- a/src/mbgl/renderer/tile_pyramid.cpp +++ b/src/mbgl/renderer/tile_pyramid.cpp @@ -1,5 +1,4 @@ #include <mbgl/renderer/tile_pyramid.hpp> -#include <mbgl/renderer/render_tile.hpp> #include <mbgl/renderer/paint_parameters.hpp> #include <mbgl/renderer/render_source.hpp> #include <mbgl/renderer/tile_parameters.hpp> @@ -40,31 +39,9 @@ bool TilePyramid::isLoaded() const { return true; } -void TilePyramid::upload(gfx::UploadPass& parameters) { - for (auto& tile : renderTiles) { - tile.upload(parameters); - } -} - -void TilePyramid::prepare(const SourcePrepareParameters& parameters) { - for (auto& tile : renderTiles) { - tile.prepare(parameters); - } -} - -void TilePyramid::finishRender(PaintParameters& parameters) { - for (auto& tile : renderTiles) { - tile.finishRender(parameters); - } -} - -std::vector<std::reference_wrapper<RenderTile>> TilePyramid::getRenderTiles() { - return { renderTiles.begin(), renderTiles.end() }; -} - Tile* TilePyramid::getTile(const OverscaledTileID& tileID){ - auto it = tiles.find(tileID); - return it == tiles.end() ? cache.get(tileID) : it->second.get(); + auto it = tiles.find(tileID); + return it == tiles.end() ? cache.get(tileID) : it->second.get(); } void TilePyramid::update(const std::vector<Immutable<style::LayerProperties>>& layers, @@ -176,10 +153,7 @@ void TilePyramid::update(const std::vector<Immutable<style::LayerProperties>>& l return tiles.emplace(tileID, std::move(tile)).first->second.get(); }; - std::map<UnwrappedTileID, Tile*> previouslyRenderedTiles; - for (auto& renderTile : renderTiles) { - previouslyRenderedTiles[renderTile.id] = &renderTile.tile; - } + auto previouslyRenderedTiles = std::move(renderTiles); auto renderTileFn = [&](const UnwrappedTileID& tileID, Tile& tile) { addRenderTile(tileID, tile); @@ -198,7 +172,7 @@ void TilePyramid::update(const std::vector<Immutable<style::LayerProperties>>& l idealTiles, zoomRange, tileZoom); for (auto previouslyRenderedTile : previouslyRenderedTiles) { - Tile& tile = *previouslyRenderedTile.second; + Tile& tile = previouslyRenderedTile.second; tile.markRenderedPreviously(); if (tile.holdForFade()) { // Since it was rendered in the last frame, we know we have it @@ -244,10 +218,11 @@ void TilePyramid::update(const std::vector<Immutable<style::LayerProperties>>& l fadingTiles = false; - // Initialize render tiles fields and update the tile contained layer render data. - for (RenderTile& renderTile : renderTiles) { - Tile& tile = renderTile.tile; + // Initialize renderable tiles and update the contained layer render data. + for (auto& entry : renderTiles) { + Tile& tile = entry.second; assert(tile.isRenderable()); + tile.usedByRenderedLayers = false; const bool holdForFade = tile.holdForFade(); fadingTiles = (fadingTiles || holdForFade); @@ -260,7 +235,7 @@ void TilePyramid::update(const std::vector<Immutable<style::LayerProperties>>& l bool layerRenderableInTile = tile.isComplete() ? tile.updateLayerProperties(layerProperties) : static_cast<bool>(tile.getBucket(*layerProperties->baseImpl)); if (layerRenderableInTile) { - renderTile.used = true; + tile.usedByRenderedLayers = true; } } } @@ -290,6 +265,7 @@ void TilePyramid::handleWrapJump(float lng) { if (wrapDelta) { std::map<OverscaledTileID, std::unique_ptr<Tile>> newTiles; + std::map<UnwrappedTileID, std::reference_wrapper<Tile>> newRenderTiles; for (auto& tile : tiles) { auto newID = tile.second->id.unwrapTo(tile.second->id.wrap + wrapDelta); tile.second->id = newID; @@ -297,9 +273,11 @@ void TilePyramid::handleWrapJump(float lng) { } tiles = std::move(newTiles); - for (auto& renderTile : renderTiles) { - renderTile.id = renderTile.id.unwrapTo(renderTile.id.wrap + wrapDelta); + for (auto& tile : renderTiles) { + UnwrappedTileID newID = tile.first.unwrapTo(tile.first.wrap + wrapDelta); + newRenderTiles.emplace(newID, tile.second); } + renderTiles = std::move(newRenderTiles); } } @@ -322,26 +300,29 @@ std::unordered_map<std::string, std::vector<Feature>> TilePyramid::queryRendered } mapbox::geometry::box<double> box = mapbox::geometry::envelope(queryGeometry); - // TODO: Find out why we need a special sorting algorithm here. - std::vector<std::reference_wrapper<const RenderTile>> sortedTiles{ renderTiles.begin(), - renderTiles.end() }; - std::sort(sortedTiles.begin(), sortedTiles.end(), [](const RenderTile& a, const RenderTile& b) { - return std::tie(a.id.canonical.z, a.id.canonical.y, a.id.wrap, a.id.canonical.x) < - std::tie(b.id.canonical.z, b.id.canonical.y, b.id.wrap, b.id.canonical.x); - }); + + auto cmp = [](const UnwrappedTileID& a, const UnwrappedTileID& b) { + return std::tie(a.canonical.z, a.canonical.y, a.wrap, a.canonical.x) < + std::tie(b.canonical.z, b.canonical.y, b.wrap, b.canonical.x); + }; + + std::map<UnwrappedTileID, std::reference_wrapper<Tile>, decltype(cmp)> sortedTiles{renderTiles.begin(), renderTiles.end(), cmp}; auto maxPitchScaleFactor = transformState.maxPitchScaleFactor(); - for (const RenderTile& renderTile : sortedTiles) { - const float scale = std::pow(2, transformState.getZoom() - renderTile.id.canonical.z); - auto queryPadding = maxPitchScaleFactor * renderTile.tile.getQueryPadding(layers) * util::EXTENT / util::tileSize / scale; + for (const auto& entry : sortedTiles) { + const UnwrappedTileID& id = entry.first; + Tile& tile = entry.second; + + const float scale = std::pow(2, transformState.getZoom() - id.canonical.z); + auto queryPadding = maxPitchScaleFactor * tile.getQueryPadding(layers) * util::EXTENT / util::tileSize / scale; - GeometryCoordinate tileSpaceBoundsMin = TileCoordinate::toGeometryCoordinate(renderTile.id, box.min); + GeometryCoordinate tileSpaceBoundsMin = TileCoordinate::toGeometryCoordinate(id, box.min); if (tileSpaceBoundsMin.x - queryPadding >= util::EXTENT || tileSpaceBoundsMin.y - queryPadding >= util::EXTENT) { continue; } - GeometryCoordinate tileSpaceBoundsMax = TileCoordinate::toGeometryCoordinate(renderTile.id, box.max); + GeometryCoordinate tileSpaceBoundsMax = TileCoordinate::toGeometryCoordinate(id, box.max); if (tileSpaceBoundsMax.x + queryPadding < 0 || tileSpaceBoundsMax.y + queryPadding < 0) { continue; } @@ -349,15 +330,15 @@ std::unordered_map<std::string, std::vector<Feature>> TilePyramid::queryRendered GeometryCoordinates tileSpaceQueryGeometry; tileSpaceQueryGeometry.reserve(queryGeometry.size()); for (const auto& c : queryGeometry) { - tileSpaceQueryGeometry.push_back(TileCoordinate::toGeometryCoordinate(renderTile.id, c)); + tileSpaceQueryGeometry.push_back(TileCoordinate::toGeometryCoordinate(id, c)); } - renderTile.tile.queryRenderedFeatures(result, - tileSpaceQueryGeometry, - transformState, - layers, - options, - projMatrix); + tile.queryRenderedFeatures(result, + tileSpaceQueryGeometry, + transformState, + layers, + options, + projMatrix); } return result; @@ -399,14 +380,12 @@ void TilePyramid::clearAll() { void TilePyramid::addRenderTile(const UnwrappedTileID& tileID, Tile& tile) { assert(tile.isRenderable()); - auto it = std::lower_bound(renderTiles.begin(), renderTiles.end(), tileID, - [](const RenderTile& a, const UnwrappedTileID& id) { return a.id < id; }); - renderTiles.emplace(it, tileID, tile); + renderTiles.emplace(tileID, tile); } void TilePyramid::updateFadingTiles() { - for (auto& renderTile : renderTiles) { - Tile& tile = renderTile.tile; + for (auto& entry : renderTiles) { + Tile& tile = entry.second; if (tile.holdForFade()) { tile.performedFadePlacement(); } |