summaryrefslogtreecommitdiff
path: root/src/mbgl/renderer/tile_pyramid.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/renderer/tile_pyramid.cpp')
-rw-r--r--src/mbgl/renderer/tile_pyramid.cpp99
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();
}