summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMolly Lloyd <molly@mapbox.com>2018-01-11 10:49:52 -0800
committerMolly Lloyd <molly@mapbox.com>2018-01-18 18:10:09 -0800
commitbaa247e5e8907399586f298435573dcbfd376b6c (patch)
tree8153353202924b42115229ccc685e3b293abff29
parent051665f6cd91cd1cce44bb74336df8147f6ca851 (diff)
downloadqtlocation-mapboxgl-baa247e5e8907399586f298435573dcbfd376b6c.tar.gz
use enum for neighboring tiles
-rw-r--r--src/mbgl/geometry/dem_pyramid.cpp38
-rw-r--r--src/mbgl/renderer/sources/render_raster_dem_source.cpp60
-rw-r--r--src/mbgl/renderer/sources/render_raster_dem_source.hpp32
-rw-r--r--src/mbgl/tile/raster_dem_tile.cpp10
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;