summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMolly Lloyd <molly@mapbox.com>2018-01-05 16:15:18 -0800
committerMolly Lloyd <molly@mapbox.com>2018-01-17 09:49:32 -0800
commita0ebf72e148e8f9d4cf27c8a64accc00ffd64cd9 (patch)
treee8de76da69b31fb6dae989abbb3f529504cd5738
parent2e62dfc4d5cac1c0b16a12956352d53bb17e2684 (diff)
downloadqtlocation-mapboxgl-a0ebf72e148e8f9d4cf27c8a64accc00ffd64cd9.tar.gz
implement backfill border
-rw-r--r--src/mbgl/renderer/render_source.hpp2
-rw-r--r--src/mbgl/renderer/sources/render_raster_dem_source.cpp85
-rw-r--r--src/mbgl/renderer/sources/render_raster_dem_source.hpp3
-rw-r--r--src/mbgl/tile/raster_dem_tile.cpp8
-rw-r--r--src/mbgl/tile/raster_dem_tile.hpp1
5 files changed, 57 insertions, 42 deletions
diff --git a/src/mbgl/renderer/render_source.hpp b/src/mbgl/renderer/render_source.hpp
index 8c84af4f1e..9f9742b5a7 100644
--- a/src/mbgl/renderer/render_source.hpp
+++ b/src/mbgl/renderer/render_source.hpp
@@ -84,7 +84,7 @@ protected:
bool enabled = false;
- void onTileChanged(Tile&) final;
+ virtual void onTileChanged(Tile&);
void onTileError(Tile&, std::exception_ptr) final;
};
diff --git a/src/mbgl/renderer/sources/render_raster_dem_source.cpp b/src/mbgl/renderer/sources/render_raster_dem_source.cpp
index 5679aa23df..2678e112ba 100644
--- a/src/mbgl/renderer/sources/render_raster_dem_source.cpp
+++ b/src/mbgl/renderer/sources/render_raster_dem_source.cpp
@@ -2,6 +2,8 @@
#include <mbgl/renderer/render_tile.hpp>
#include <mbgl/tile/raster_dem_tile.hpp>
#include <mbgl/algorithm/update_tile_masks.hpp>
+#include <mbgl/geometry/dem_pyramid.hpp>
+#include <mbgl/renderer/buckets/hillshade_bucket.hpp>
namespace mbgl {
@@ -55,51 +57,54 @@ void RenderRasterDEMSource::update(Immutable<style::Source::Impl> baseImpl_,
[&] (const OverscaledTileID& tileID) {
return std::make_unique<RasterDEMTile>(tileID, parameters, *tileset);
});
+}
+
+static void fillBorder(const RasterDEMTile& tile, const RasterDEMTile& borderTile){
+ int dx = borderTile.id.canonical.x - tile.id.canonical.x;
+ const int8_t dy = borderTile.id.canonical.y - tile.id.canonical.y;
+ const uint32_t dim = pow(2, tile.id.canonical.z);
+ if (dx == 0 && dy == 0) return;
+ if (std::abs(dy) > 1) return;
+ // neighbor is in another world wrap
+ if (std::abs(dx) > 1) {
+ if (std::abs(int(dx + dim)) == 1) {
+ dx += dim;
+ } else if (std::abs(int(dx - dim)) == 1) {
+ dx -= dim;
+ }
+ }
+ HillshadeBucket* borderBucket = borderTile.getBucket();
+ HillshadeBucket* tileBucket = tile.getBucket();
+ DEMPyramid* tileDEM = tileBucket->getDEMPyramid();
+ DEMPyramid* borderDEM = borderBucket->getDEMPyramid();
+
+ if (tileDEM->isLoaded() && borderDEM->isLoaded()){
+ tileDEM->backfillBorder(*borderDEM, dx, dy);
+ }
+ tileBucket->prepared = false;
+ borderBucket->prepared = false;
+}
+
+void RenderRasterDEMSource::onTileChanged(Tile& tile){
+ const RasterDEMTile& demtile = static_cast<RasterDEMTile&>(tile);
auto rendertiles = getRenderTiles();
- std::sort(rendertiles.begin(), rendertiles.end(),
- [](const RenderTile& a, const RenderTile& b) { return a.id < b.id; });
-
- for (auto& rt : rendertiles) {
- RasterDEMTile& demtile = static_cast<RasterDEMTile&>(rt.get().tile);
- if (!demtile.isBackfilled()) {
- bool lastBackfill = true;
- for (auto& pair : demtile.neighboringTiles) {
- // the current neighboring tile has not been backfilled yet
- if (!pair.second) {
- const auto renderableNeighbor = std::find_if(rendertiles.begin(), rendertiles.end(), [&pair] (const RenderTile& rt){
- return rt.id.canonical == pair.first.canonical;
- });
-
- if (renderableNeighbor != rendertiles.end()) {
- const RasterDEMTile& borderTile = static_cast<RasterDEMTile&>(renderableNeighbor->get().tile);
- int dx = borderTile.id.canonical.x - demtile.id.canonical.x;
- const int8_t dy = borderTile.id.canonical.y - demtile.id.canonical.y;
- const uint32_t dim = pow(2, demtile.id.canonical.z);
- if (dx == 0 && dy == 0) continue;
- if (std::abs(dy) > 1) continue;
- // neighbor is in another world wrap
- if (std::abs(dx) > 1) {
- if (std::abs(int(dx + dim)) == 1) {
- dx += dim;
- } else if (std::abs(int(dx - dim)) == 1) {
- dx -= dim;
- }
- }
-
-// HillshadeBucket* borderBucket = borderTile.getBucket(hillshadeLayer->baseImpl)
-// if (!borderTile.dem || !tile.dem) return;
-// tile.dem.backfillBorder(borderTile.dem, dx, dy);
-// if (tile.neighboringTiles && tile.neighboringTiles[borderId])
-// tile.neighboringTiles[borderId].backfilled = true;
-
- pair.second = true;
- } else {
- lastBackfill = false;
- }
+
+ if (tile.isLoaded() && demtile.isBackfilled()) {
+ for (auto& pair: demtile.neighboringTiles) {
+ if (!pair.second) {
+ const auto renderableNeighbor = std::find_if(rendertiles.begin(), rendertiles.end(), [&pair] (const RenderTile& rt){
+ return rt.id.canonical == pair.first.canonical;
+ });
+
+ if (renderableNeighbor != rendertiles.end()) {
+ const RasterDEMTile& borderTile = static_cast<RasterDEMTile&>(renderableNeighbor->get().tile);
+ fillBorder(demtile, borderTile);
+ fillBorder(borderTile, demtile);
}
}
}
}
+ RenderSource::onTileChanged(tile);
}
void RenderRasterDEMSource::startRender(PaintParameters& parameters) {
diff --git a/src/mbgl/renderer/sources/render_raster_dem_source.hpp b/src/mbgl/renderer/sources/render_raster_dem_source.hpp
index ef2348fdd9..8d90e081a3 100644
--- a/src/mbgl/renderer/sources/render_raster_dem_source.hpp
+++ b/src/mbgl/renderer/sources/render_raster_dem_source.hpp
@@ -41,6 +41,9 @@ private:
TilePyramid tilePyramid;
optional<std::vector<std::string>> tileURLTemplates;
+
+protected:
+ void onTileChanged(Tile&);
};
template <>
diff --git a/src/mbgl/tile/raster_dem_tile.cpp b/src/mbgl/tile/raster_dem_tile.cpp
index f8335bef3d..6e6b77aaff 100644
--- a/src/mbgl/tile/raster_dem_tile.cpp
+++ b/src/mbgl/tile/raster_dem_tile.cpp
@@ -20,7 +20,7 @@ RasterDEMTile::RasterDEMTile(const OverscaledTileID& id_,
mailbox(std::make_shared<Mailbox>(*Scheduler::GetCurrent())),
worker(parameters.workerScheduler,
ActorRef<RasterDEMTile>(*this, mailbox)) {
-
+
const CanonicalTileID canonical = id_.canonical;
const u_int32_t dim = pow(2, canonical.z);
const u_int32_t px = (canonical.x - 1 + dim) % dim;
@@ -92,10 +92,16 @@ void RasterDEMTile::upload(gl::Context& context) {
}
}
+
Bucket* RasterDEMTile::getBucket(const style::Layer::Impl&) const {
return bucket.get();
}
+HillshadeBucket* RasterDEMTile::getBucket() const {
+ return bucket.get();
+}
+
+
void RasterDEMTile::setMask(TileMask&& mask) {
if (bucket) {
bucket->setMask(std::move(mask));
diff --git a/src/mbgl/tile/raster_dem_tile.hpp b/src/mbgl/tile/raster_dem_tile.hpp
index e8ac7ce893..178f0da596 100644
--- a/src/mbgl/tile/raster_dem_tile.hpp
+++ b/src/mbgl/tile/raster_dem_tile.hpp
@@ -32,6 +32,7 @@ public:
void upload(gl::Context&) override;
Bucket* getBucket(const style::Layer::Impl&) const override;
+ HillshadeBucket* getBucket() const;
std::unordered_map<OverscaledTileID, bool> neighboringTiles;