diff options
author | Molly Lloyd <molly@mapbox.com> | 2018-01-05 16:15:18 -0800 |
---|---|---|
committer | Molly Lloyd <molly@mapbox.com> | 2018-01-17 09:49:32 -0800 |
commit | a0ebf72e148e8f9d4cf27c8a64accc00ffd64cd9 (patch) | |
tree | e8de76da69b31fb6dae989abbb3f529504cd5738 | |
parent | 2e62dfc4d5cac1c0b16a12956352d53bb17e2684 (diff) | |
download | qtlocation-mapboxgl-a0ebf72e148e8f9d4cf27c8a64accc00ffd64cd9.tar.gz |
implement backfill border
-rw-r--r-- | src/mbgl/renderer/render_source.hpp | 2 | ||||
-rw-r--r-- | src/mbgl/renderer/sources/render_raster_dem_source.cpp | 85 | ||||
-rw-r--r-- | src/mbgl/renderer/sources/render_raster_dem_source.hpp | 3 | ||||
-rw-r--r-- | src/mbgl/tile/raster_dem_tile.cpp | 8 | ||||
-rw-r--r-- | src/mbgl/tile/raster_dem_tile.hpp | 1 |
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; |