summaryrefslogtreecommitdiff
path: root/src/mbgl/renderer/sources/render_tile_source.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/renderer/sources/render_tile_source.cpp')
-rw-r--r--src/mbgl/renderer/sources/render_tile_source.cpp41
1 files changed, 39 insertions, 2 deletions
diff --git a/src/mbgl/renderer/sources/render_tile_source.cpp b/src/mbgl/renderer/sources/render_tile_source.cpp
index 99bdfde485..cf6787b6e8 100644
--- a/src/mbgl/renderer/sources/render_tile_source.cpp
+++ b/src/mbgl/renderer/sources/render_tile_source.cpp
@@ -6,6 +6,7 @@
#include <mbgl/renderer/paint_parameters.hpp>
#include <mbgl/renderer/tile_render_data.hpp>
#include <mbgl/tile/vector_tile.hpp>
+#include <mbgl/util/math.hpp>
namespace mbgl {
@@ -56,6 +57,9 @@ std::unique_ptr<RenderItem> RenderTileSource::createRenderItem() {
}
void RenderTileSource::prepare(const SourcePrepareParameters& parameters) {
+ bearing = parameters.transform.state.getBearing();
+ filteredRenderTiles = nullptr;
+ renderTilesSortedByY = nullptr;
auto tiles = makeMutable<std::vector<RenderTile>>();
tiles->reserve(tilePyramid.getRenderedTiles().size());
for (auto& entry : tilePyramid.getRenderedTiles()) {
@@ -73,8 +77,41 @@ bool RenderTileSource::hasFadingTiles() const {
return tilePyramid.hasFadingTiles();
}
-RenderTiles RenderTileSource::getRenderTiles() {
- return { renderTiles->begin(), renderTiles->end() };
+RenderTiles RenderTileSource::getRenderTiles() const {
+ if (!filteredRenderTiles) {
+ auto result = std::make_shared<std::vector<std::reference_wrapper<const RenderTile>>>();
+ for (const auto& renderTile : *renderTiles) {
+ if (renderTile.holdForFade()) {
+ continue;
+ }
+ result->emplace_back(renderTile);
+ }
+ filteredRenderTiles = std::move(result);
+ }
+ return filteredRenderTiles;
+}
+
+RenderTiles RenderTileSource::getRenderTilesSortedByYPosition() const {
+ if (!renderTilesSortedByY) {
+ const auto comp = [bearing = this->bearing](const RenderTile& a, const RenderTile& b) {
+ Point<float> pa(a.id.canonical.x, a.id.canonical.y);
+ Point<float> pb(b.id.canonical.x, b.id.canonical.y);
+
+ auto par = util::rotate(pa, bearing);
+ auto pbr = util::rotate(pb, bearing);
+
+ return std::tie(b.id.canonical.z, par.y, par.x) < std::tie(a.id.canonical.z, pbr.y, pbr.x);
+ };
+
+ auto result = std::make_shared<std::vector<std::reference_wrapper<const RenderTile>>>();
+ result->reserve(renderTiles->size());
+ for (const auto& renderTile : *renderTiles) {
+ result->emplace_back(renderTile);
+ }
+ std::sort(result->begin(), result->end(), comp);
+ renderTilesSortedByY = std::move(result);
+ }
+ return renderTilesSortedByY;
}
const Tile* RenderTileSource::getRenderedTile(const UnwrappedTileID& tileID) const {