diff options
author | Molly Lloyd <molly@mapbox.com> | 2018-01-11 17:47:56 -0800 |
---|---|---|
committer | Molly Lloyd <molly@mapbox.com> | 2018-01-18 18:10:09 -0800 |
commit | aefb9755985d64981b295a0dba7442d9ce6a0911 (patch) | |
tree | ed6e197ffba710501546b05a1b02d0a033737bb3 | |
parent | baa247e5e8907399586f298435573dcbfd376b6c (diff) | |
download | qtlocation-mapboxgl-aefb9755985d64981b295a0dba7442d9ce6a0911.tar.gz |
enforce+update DEMTileNeighbors type
-rw-r--r-- | src/mbgl/renderer/sources/render_raster_dem_source.cpp | 47 | ||||
-rw-r--r-- | src/mbgl/renderer/sources/render_raster_dem_source.hpp | 32 | ||||
-rw-r--r-- | src/mbgl/tile/raster_dem_tile.cpp | 4 | ||||
-rw-r--r-- | src/mbgl/tile/raster_dem_tile.hpp | 49 |
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; |