summaryrefslogtreecommitdiff
path: root/src/mbgl/renderer/sources
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/renderer/sources')
-rw-r--r--src/mbgl/renderer/sources/render_image_source.hpp2
-rw-r--r--src/mbgl/renderer/sources/render_tile_source.cpp41
-rw-r--r--src/mbgl/renderer/sources/render_tile_source.hpp6
3 files changed, 44 insertions, 5 deletions
diff --git a/src/mbgl/renderer/sources/render_image_source.hpp b/src/mbgl/renderer/sources/render_image_source.hpp
index 4264f74564..da0d899624 100644
--- a/src/mbgl/renderer/sources/render_image_source.hpp
+++ b/src/mbgl/renderer/sources/render_image_source.hpp
@@ -48,8 +48,6 @@ public:
bool needsRelayout,
const TileParameters&) final;
- RenderTiles getRenderTiles() override { return {}; }
-
const ImageSourceRenderData* getImageRenderData() const override {
return renderData.get();
}
diff --git a/src/mbgl/renderer/sources/render_tile_source.cpp b/src/mbgl/renderer/sources/render_tile_source.cpp
index 93c41940b6..6ee2eca1b1 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 {
diff --git a/src/mbgl/renderer/sources/render_tile_source.hpp b/src/mbgl/renderer/sources/render_tile_source.hpp
index 8ec1439306..f961c20561 100644
--- a/src/mbgl/renderer/sources/render_tile_source.hpp
+++ b/src/mbgl/renderer/sources/render_tile_source.hpp
@@ -21,7 +21,8 @@ public:
void updateFadingTiles() override;
bool hasFadingTiles() const override;
- RenderTiles getRenderTiles() override;
+ RenderTiles getRenderTiles() const override;
+ RenderTiles getRenderTilesSortedByYPosition() const override;
const Tile* getRenderedTile(const UnwrappedTileID&) const override;
std::unordered_map<std::string, std::vector<Feature>>
@@ -40,6 +41,9 @@ public:
protected:
TilePyramid tilePyramid;
Immutable<std::vector<RenderTile>> renderTiles;
+ mutable RenderTiles filteredRenderTiles;
+ mutable RenderTiles renderTilesSortedByY;
+ float bearing = 0.0f;
};
} // namespace mbgl