diff options
author | Molly Lloyd <molly@mapbox.com> | 2018-01-11 10:49:52 -0800 |
---|---|---|
committer | Molly Lloyd <molly@mapbox.com> | 2018-01-18 18:10:09 -0800 |
commit | baa247e5e8907399586f298435573dcbfd376b6c (patch) | |
tree | 8153353202924b42115229ccc685e3b293abff29 | |
parent | 051665f6cd91cd1cce44bb74336df8147f6ca851 (diff) | |
download | qtlocation-mapboxgl-baa247e5e8907399586f298435573dcbfd376b6c.tar.gz |
use enum for neighboring tiles
-rw-r--r-- | src/mbgl/geometry/dem_pyramid.cpp | 38 | ||||
-rw-r--r-- | src/mbgl/renderer/sources/render_raster_dem_source.cpp | 60 | ||||
-rw-r--r-- | src/mbgl/renderer/sources/render_raster_dem_source.hpp | 32 | ||||
-rw-r--r-- | src/mbgl/tile/raster_dem_tile.cpp | 10 |
4 files changed, 96 insertions, 44 deletions
diff --git a/src/mbgl/geometry/dem_pyramid.cpp b/src/mbgl/geometry/dem_pyramid.cpp index 7d20fcb587..2674d7a9d8 100644 --- a/src/mbgl/geometry/dem_pyramid.cpp +++ b/src/mbgl/geometry/dem_pyramid.cpp @@ -23,25 +23,25 @@ void DEMPyramid::loadFromImage(PremultipliedImage& image){ // replaced when the tile's neighboring tiles are loaded and the accurate data can be backfilled using // DEMPyramid#backfillBorder - for (int32_t x = 0; x < first.dim; x++) { - // left vertical border - first.set(-1, x, first.get(0, x)); - - // right vertical border - first.set(first.dim, x, first.get(first.dim - 1, x)); - - //left horizontal border - first.set(x, -1, first.get(x, 0)); - - // right horizontal border - first.set(x, first.dim, first.get(x, first.dim - 1)); - } - - // corners - first.set(-1, -1, first.get(0, 0)); - first.set(first.dim, -1, first.get(first.dim - 1, 0)); - first.set( -1, first.dim, first.get(0, first.dim - 1)); - first.set(first.dim, first.dim, first.get(first.dim - 1, first.dim - 1)); +// for (int32_t x = 0; x < first.dim; x++) { +// // left vertical border +// first.set(-1, x, first.get(0, x)); +// +// // right vertical border +// first.set(first.dim, x, first.get(first.dim - 1, x)); +// +// //left horizontal border +// first.set(x, -1, first.get(x, 0)); +// +// // right horizontal border +// first.set(x, first.dim, first.get(x, first.dim - 1)); +// } +// +// // corners +// first.set(-1, -1, first.get(0, 0)); +// first.set(first.dim, -1, first.get(first.dim - 1, 0)); +// first.set( -1, first.dim, first.get(0, first.dim - 1)); +// first.set(first.dim, first.dim, first.get(first.dim - 1, first.dim - 1)); levels.emplace_back(std::move(first)); loaded = true; diff --git a/src/mbgl/renderer/sources/render_raster_dem_source.cpp b/src/mbgl/renderer/sources/render_raster_dem_source.cpp index bd9c5a33de..4672952f4e 100644 --- a/src/mbgl/renderer/sources/render_raster_dem_source.cpp +++ b/src/mbgl/renderer/sources/render_raster_dem_source.cpp @@ -61,7 +61,7 @@ void RenderRasterDEMSource::update(Immutable<style::Source::Impl> baseImpl_, }); } -static void fillBorder(const RasterDEMTile& tile, const RasterDEMTile& borderTile){ +static void fillBorder(RasterDEMTile& tile, const RasterDEMTile& borderTile, const DEMTileNeighbors mask ){ 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); @@ -82,51 +82,61 @@ static void fillBorder(const RasterDEMTile& tile, const RasterDEMTile& borderTil if (tileDEM->isLoaded() && borderDEM->isLoaded()){ tileDEM->backfillBorder(*borderDEM, dx, dy); + // update the bitmask to indicate that this tiles have been backfilled by flipping the relevant bit + tile.neighboringTiles = tile.neighboringTiles | mask; + std::cout << "backfilled: " << int(tile.id.canonical.z)<< "/" << tile.id.canonical.x << "/" << tile.id.canonical.y << "\n"; + std::cout << "with neighbor " << int(mask) << " : " << int(borderTile.id.canonical.z)<< "/" << borderTile.id.canonical.x << "/" << borderTile.id.canonical.y << "\n"; + tileBucket->prepared = false; } - tileBucket->prepared = false; - borderBucket->prepared = false; } void RenderRasterDEMSource::onTileChanged(Tile& tile){ RasterDEMTile& demtile = static_cast<RasterDEMTile&>(tile); + std::map<DEMTileNeighbors, DEMTileNeighbors> opposites = { + { DEMTileNeighbors::Left, DEMTileNeighbors::Right }, + { DEMTileNeighbors::Right, DEMTileNeighbors::Left }, + { DEMTileNeighbors::TopLeft, DEMTileNeighbors::BottomRight }, + { DEMTileNeighbors::TopCenter, DEMTileNeighbors::BottomCenter }, + { DEMTileNeighbors::TopRight, DEMTileNeighbors::BottomLeft }, + { DEMTileNeighbors::BottomRight, DEMTileNeighbors::TopLeft }, + { DEMTileNeighbors::BottomCenter, DEMTileNeighbors:: TopCenter }, + { DEMTileNeighbors::BottomLeft, DEMTileNeighbors::TopRight } + }; + if (tile.isRenderable() && demtile.neighboringTiles != 0b11111111) { const CanonicalTileID canonical = tile.id.canonical; const uint dim = std::pow(2, canonical.z); - const int px = (canonical.x - 1 + dim) % dim; + const uint32_t px = (canonical.x - 1 + dim) % dim; const int pxw = canonical.x == 0 ? tile.id.wrap - 1 : tile.id.wrap; - const int nx = (canonical.x + 1 + dim) % dim; + const uint32_t nx = (canonical.x + 1 + dim) % dim; const int nxw = (canonical.x + 1 == dim) ? tile.id.wrap + 1 : tile.id.wrap; + const int lowerY = (canonical.y + 1) == dim ? canonical.y : canonical.y + 1; + const int upperY = canonical.y == 0 ? canonical.y : canonical.y - 1; std::vector<OverscaledTileID> neighbors = { + // left and right neighbor OverscaledTileID(tile.id.overscaledZ, pxw, canonical.z, px, canonical.y), - OverscaledTileID(tile.id.overscaledZ, nxw, canonical.z, nx, canonical.y) + OverscaledTileID(tile.id.overscaledZ, nxw, canonical.z, nx, canonical.y), + // upper neighboring tiles, if they exist + OverscaledTileID(tile.id.overscaledZ, pxw, canonical.z, px, upperY), + OverscaledTileID(tile.id.overscaledZ, tile.id.wrap, canonical.z, canonical.x, upperY), + OverscaledTileID(tile.id.overscaledZ, nxw, canonical.z, nx, upperY), + // lower neighboring tiles, if they exist + OverscaledTileID(tile.id.overscaledZ, pxw, canonical.z, px, lowerY), + OverscaledTileID(tile.id.overscaledZ, tile.id.wrap, canonical.z, canonical.x, lowerY), + OverscaledTileID(tile.id.overscaledZ, nxw, canonical.z, nx, lowerY) }; - // upper neighboring tiles, if they exist - if (canonical.y > 0) { - neighbors.push_back(OverscaledTileID(tile.id.overscaledZ, pxw, canonical.z, px, canonical.y - 1)); - neighbors.push_back(OverscaledTileID(tile.id.overscaledZ, tile.id.wrap, canonical.z, canonical.x, canonical.y - 1)); - neighbors.push_back(OverscaledTileID(tile.id.overscaledZ, nxw, canonical.z, nx, canonical.y - 1)); - } - // lower neighboring tiles, if they exist - if (canonical.y + 1 < dim){ - neighbors.push_back(OverscaledTileID(tile.id.overscaledZ, pxw, canonical.z, px, canonical.y + 1)); - neighbors.push_back(OverscaledTileID(tile.id.overscaledZ, tile.id.wrap, canonical.z, canonical.x, canonical.y + 1)); - neighbors.push_back(OverscaledTileID(tile.id.overscaledZ, nxw, canonical.z, nx, canonical.y + 1)); - } + for (uint8_t i = 0; i < neighbors.size(); i++) { - unsigned char mask = std::pow(2, i); + DEMTileNeighbors mask = DEMTileNeighbors(std::pow(2,i)); if ((demtile.neighboringTiles & mask) != mask) { OverscaledTileID neighborid = neighbors[i]; Tile* renderableNeighbor = tilePyramid.getTile(neighborid); if (renderableNeighbor != nullptr && renderableNeighbor->isRenderable()) { RasterDEMTile& borderTile = static_cast<RasterDEMTile&>(*renderableNeighbor); - fillBorder(demtile, borderTile); - fillBorder(borderTile, demtile); - - // update the bitmasks to indicate that these tiles have been backfilled by flipping the relevant bit - demtile.neighboringTiles = demtile.neighboringTiles | mask; - borderTile.neighboringTiles = borderTile.neighboringTiles | mask; + fillBorder(demtile, borderTile, mask); + fillBorder(borderTile, demtile, opposites[mask]); } } } diff --git a/src/mbgl/renderer/sources/render_raster_dem_source.hpp b/src/mbgl/renderer/sources/render_raster_dem_source.hpp index b32d3705cb..b524a83359 100644 --- a/src/mbgl/renderer/sources/render_raster_dem_source.hpp +++ b/src/mbgl/renderer/sources/render_raster_dem_source.hpp @@ -6,6 +6,38 @@ namespace mbgl { +enum class DEMTileNeighbors { + // 0b00000001 + Left = 1 << 0, + // 0b00000010 + Right = 1 << 1, + // 0b00000100 + TopLeft = 1 << 2, + // 0b00001000 + TopCenter = 1 << 3, + // 0b00010000 + TopRight = 1 << 4, + // 0b00100000 + BottomLeft = 1 << 5, + // 0b01000000 + BottomCenter = 1 << 6, + // 0b10000000 + BottomRight = 1 << 7 +}; + +inline unsigned char operator|(unsigned char a, DEMTileNeighbors b) { + return static_cast<unsigned char>(a | int(b)); +}; + +inline unsigned char operator&(unsigned char a, DEMTileNeighbors b) { + return static_cast<unsigned char>(a & int(b)); +} + +inline bool operator!=(unsigned char a, DEMTileNeighbors b) { + return a != static_cast<unsigned char>(b); +} + + class RenderRasterDEMSource : public RenderSource { public: RenderRasterDEMSource(Immutable<style::RasterDEMSource::Impl>); diff --git a/src/mbgl/tile/raster_dem_tile.cpp b/src/mbgl/tile/raster_dem_tile.cpp index 929768787e..e435589941 100644 --- a/src/mbgl/tile/raster_dem_tile.cpp +++ b/src/mbgl/tile/raster_dem_tile.cpp @@ -20,6 +20,16 @@ RasterDEMTile::RasterDEMTile(const OverscaledTileID& id_, mailbox(std::make_shared<Mailbox>(*Scheduler::GetCurrent())), worker(parameters.workerScheduler, ActorRef<RasterDEMTile>(*this, mailbox)) { + + if ( id.canonical.y == 0 ){ + // this tile doesn't have upper neighboring tiles so marked those as backfilled + neighboringTiles = neighboringTiles | 0b00011100; + } + + if (id.canonical.y + 1 == std::pow(2, id.canonical.z)){ + // this tile doesn't have lower neighboring tiles so marked those as backfilled + neighboringTiles = neighboringTiles | 0b11100000; + } } RasterDEMTile::~RasterDEMTile() = default; |