summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMolly Lloyd <molly@mapbox.com>2018-01-11 17:47:56 -0800
committerMolly Lloyd <molly@mapbox.com>2018-01-18 18:10:09 -0800
commitaefb9755985d64981b295a0dba7442d9ce6a0911 (patch)
treeed6e197ffba710501546b05a1b02d0a033737bb3
parentbaa247e5e8907399586f298435573dcbfd376b6c (diff)
downloadqtlocation-mapboxgl-aefb9755985d64981b295a0dba7442d9ce6a0911.tar.gz
enforce+update DEMTileNeighbors type
-rw-r--r--src/mbgl/renderer/sources/render_raster_dem_source.cpp47
-rw-r--r--src/mbgl/renderer/sources/render_raster_dem_source.hpp32
-rw-r--r--src/mbgl/tile/raster_dem_tile.cpp4
-rw-r--r--src/mbgl/tile/raster_dem_tile.hpp49
4 files changed, 77 insertions, 55 deletions
diff --git a/src/mbgl/renderer/sources/render_raster_dem_source.cpp b/src/mbgl/renderer/sources/render_raster_dem_source.cpp
index 4672952f4e..2b9ae50924 100644
--- a/src/mbgl/renderer/sources/render_raster_dem_source.cpp
+++ b/src/mbgl/renderer/sources/render_raster_dem_source.cpp
@@ -84,8 +84,8 @@ static void fillBorder(RasterDEMTile& tile, const RasterDEMTile& borderTile, con
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";
+ // mark HillshadeBucket.prepared as false so it runs through the prepare render pass
+ // with the new texture data we just backfilled
tileBucket->prepared = false;
}
}
@@ -104,34 +104,41 @@ void RenderRasterDEMSource::onTileChanged(Tile& tile){
{ DEMTileNeighbors::BottomLeft, DEMTileNeighbors::TopRight }
};
- if (tile.isRenderable() && demtile.neighboringTiles != 0b11111111) {
+ if (tile.isRenderable() && demtile.neighboringTiles != DEMTileNeighbors::Complete) {
const CanonicalTileID canonical = tile.id.canonical;
const uint dim = std::pow(2, canonical.z);
const uint32_t px = (canonical.x - 1 + dim) % dim;
const int pxw = canonical.x == 0 ? tile.id.wrap - 1 : tile.id.wrap;
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),
- // 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)
+
+ auto getNeighbor = [&] (DEMTileNeighbors mask){
+ if (mask == DEMTileNeighbors::Left){
+ return OverscaledTileID(tile.id.overscaledZ, pxw, canonical.z, px, canonical.y);
+ } else if (mask == DEMTileNeighbors::Right){
+ return OverscaledTileID(tile.id.overscaledZ, nxw, canonical.z, nx, canonical.y);
+ } else if (mask == DEMTileNeighbors::TopLeft){
+ return OverscaledTileID(tile.id.overscaledZ, pxw, canonical.z, px, canonical.y - 1);
+ } else if (mask == DEMTileNeighbors::TopCenter){
+ return OverscaledTileID(tile.id.overscaledZ, tile.id.wrap, canonical.z, canonical.x, canonical.y - 1);
+ } else if (mask == DEMTileNeighbors::TopRight){
+ return OverscaledTileID(tile.id.overscaledZ, nxw, canonical.z, nx, canonical.y - 1);
+ } else if (mask == DEMTileNeighbors::BottomLeft){
+ return OverscaledTileID(tile.id.overscaledZ, pxw, canonical.z, px, canonical.y + 1);
+ } else if (mask == DEMTileNeighbors::BottomCenter){
+ return OverscaledTileID(tile.id.overscaledZ, tile.id.wrap, canonical.z, canonical.x, canonical.y + 1);
+ } else if (mask == DEMTileNeighbors::BottomRight){
+ return OverscaledTileID(tile.id.overscaledZ, nxw, canonical.z, nx, canonical.y + 1);
+ } else{
+ throw std::runtime_error("mask is not a valid tile neighbor");
+ }
};
- for (uint8_t i = 0; i < neighbors.size(); i++) {
+ for (uint8_t i = 0; i < 8; i++) {
DEMTileNeighbors mask = DEMTileNeighbors(std::pow(2,i));
+ // only backfill if this neighbor has not been previously backfilled
if ((demtile.neighboringTiles & mask) != mask) {
- OverscaledTileID neighborid = neighbors[i];
+ OverscaledTileID neighborid = getNeighbor(mask);
Tile* renderableNeighbor = tilePyramid.getTile(neighborid);
if (renderableNeighbor != nullptr && renderableNeighbor->isRenderable()) {
RasterDEMTile& borderTile = static_cast<RasterDEMTile&>(*renderableNeighbor);
diff --git a/src/mbgl/renderer/sources/render_raster_dem_source.hpp b/src/mbgl/renderer/sources/render_raster_dem_source.hpp
index b524a83359..b32d3705cb 100644
--- a/src/mbgl/renderer/sources/render_raster_dem_source.hpp
+++ b/src/mbgl/renderer/sources/render_raster_dem_source.hpp
@@ -6,38 +6,6 @@
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 e435589941..a05f2a758c 100644
--- a/src/mbgl/tile/raster_dem_tile.cpp
+++ b/src/mbgl/tile/raster_dem_tile.cpp
@@ -23,12 +23,12 @@ RasterDEMTile::RasterDEMTile(const OverscaledTileID& id_,
if ( id.canonical.y == 0 ){
// this tile doesn't have upper neighboring tiles so marked those as backfilled
- neighboringTiles = neighboringTiles | 0b00011100;
+ neighboringTiles = neighboringTiles | DEMTileNeighbors::NoUpper;
}
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;
+ neighboringTiles = neighboringTiles | DEMTileNeighbors::NoLower;
}
}
diff --git a/src/mbgl/tile/raster_dem_tile.hpp b/src/mbgl/tile/raster_dem_tile.hpp
index 50dbcbac27..571c1ca7e9 100644
--- a/src/mbgl/tile/raster_dem_tile.hpp
+++ b/src/mbgl/tile/raster_dem_tile.hpp
@@ -11,6 +11,53 @@ class Tileset;
class TileParameters;
class HillshadeBucket;
+enum class DEMTileNeighbors : unsigned char {
+ // 0b00000000
+ Empty = 0 << 1,
+
+ // the order of the neighbors in this enum (or rather the order of their flipped bits
+ // must stay the same as
+
+ // 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,
+
+ // helper enums for tiles with no upper/lower neighbors
+ // and completely backfilled tiles
+
+ // 0b00011100
+ NoUpper = 0b00011100,
+ // 0b11100000
+ NoLower = 0b11100000,
+ // 0b11111111
+ Complete = 0b11111111
+};
+
+inline DEMTileNeighbors operator|(DEMTileNeighbors a, DEMTileNeighbors b) {
+ return static_cast<DEMTileNeighbors>(int(a) | int(b));
+};
+
+inline DEMTileNeighbors operator&(DEMTileNeighbors a, DEMTileNeighbors b) {
+ return static_cast<DEMTileNeighbors>(int(a) & int(b));
+}
+
+inline bool operator!=(DEMTileNeighbors a, DEMTileNeighbors b) {
+ return static_cast<unsigned char>(a) != static_cast<unsigned char>(b);
+}
+
namespace style {
class Layer;
} // namespace style
@@ -34,7 +81,7 @@ public:
// neighboringTiles is a bitmask for which neighboring tiles have been backfilled
// there are max 8 possible neighboring tiles, so each bit represents one neighbor
- unsigned char neighboringTiles = 0b00000000;
+ DEMTileNeighbors neighboringTiles = DEMTileNeighbors::Empty;
void setMask(TileMask&&) override;