diff options
author | Molly Lloyd <molly@mapbox.com> | 2018-01-16 17:36:09 -0800 |
---|---|---|
committer | Molly Lloyd <molly@mapbox.com> | 2018-01-18 18:10:10 -0800 |
commit | a911efcdf1f5621dd332f1724ee225fa680ca790 (patch) | |
tree | 10c4fe3ca85bd6a9facbf13a91aa107000d9fc41 | |
parent | 899170706f31e3df94b642bed3e02e0c84f8e4f6 (diff) | |
download | qtlocation-mapboxgl-a911efcdf1f5621dd332f1724ee225fa680ca790.tar.gz |
refactor backfillBorder owner
-rw-r--r-- | src/mbgl/geometry/dem_data.cpp | 2 | ||||
-rw-r--r-- | src/mbgl/geometry/dem_data.hpp | 2 | ||||
-rw-r--r-- | src/mbgl/renderer/buckets/hillshade_bucket.cpp | 4 | ||||
-rw-r--r-- | src/mbgl/renderer/buckets/hillshade_bucket.hpp | 12 | ||||
-rw-r--r-- | src/mbgl/renderer/layers/render_hillshade_layer.cpp | 4 | ||||
-rw-r--r-- | src/mbgl/renderer/sources/render_raster_dem_source.cpp | 33 | ||||
-rw-r--r-- | src/mbgl/tile/raster_dem_tile.cpp | 27 | ||||
-rw-r--r-- | src/mbgl/tile/raster_dem_tile.hpp | 2 |
8 files changed, 50 insertions, 36 deletions
diff --git a/src/mbgl/geometry/dem_data.cpp b/src/mbgl/geometry/dem_data.cpp index 4ab72fcf80..d0629cacdb 100644 --- a/src/mbgl/geometry/dem_data.cpp +++ b/src/mbgl/geometry/dem_data.cpp @@ -42,7 +42,7 @@ DEMData::DEMData(PremultipliedImage& image): loaded = true; } -void DEMData::backfillBorder(DEMData& borderTileData, int8_t dx, int8_t dy) { +void DEMData::backfillBorder(const DEMData& borderTileData, int8_t dx, int8_t dy) { auto& t = level; auto& o = borderTileData.level; assert(t.dim == o.dim); diff --git a/src/mbgl/geometry/dem_data.hpp b/src/mbgl/geometry/dem_data.hpp index ddb8939bb2..33781a2f21 100644 --- a/src/mbgl/geometry/dem_data.hpp +++ b/src/mbgl/geometry/dem_data.hpp @@ -46,7 +46,7 @@ public: }; DEMData(PremultipliedImage& image); - void backfillBorder(DEMData& borderTileData, int8_t dx, int8_t dy); + void backfillBorder(const DEMData& borderTileData, int8_t dx, int8_t dy); bool isLoaded() const { return loaded; }; diff --git a/src/mbgl/renderer/buckets/hillshade_bucket.cpp b/src/mbgl/renderer/buckets/hillshade_bucket.cpp index b883a4fecf..52186da908 100644 --- a/src/mbgl/renderer/buckets/hillshade_bucket.cpp +++ b/src/mbgl/renderer/buckets/hillshade_bucket.cpp @@ -14,6 +14,10 @@ HillshadeBucket::HillshadeBucket(PremultipliedImage&& image_): demdata(image_) { HillshadeBucket::HillshadeBucket(DEMData&& demdata_) : demdata(std::move(demdata_)) { } +const DEMData& HillshadeBucket::getDEMData() const { + return demdata; +} + DEMData& HillshadeBucket::getDEMData() { return demdata; } diff --git a/src/mbgl/renderer/buckets/hillshade_bucket.hpp b/src/mbgl/renderer/buckets/hillshade_bucket.hpp index 09f1bcb375..3d9f6c61af 100644 --- a/src/mbgl/renderer/buckets/hillshade_bucket.hpp +++ b/src/mbgl/renderer/buckets/hillshade_bucket.hpp @@ -31,9 +31,18 @@ public: optional<gl::Texture> texture; TileMask mask{ { 0, 0, 0 } }; - bool prepared = false; + + const DEMData& getDEMData() const; DEMData& getDEMData(); + bool isPrepared() const { + return prepared; + } + + void setPrepared (bool preparedState) { + prepared = preparedState; + } + // Raster-DEM Tile Sources use the default buffers from Painter gl::VertexVector<HillshadeLayoutVertex> vertices; gl::IndexVector<gl::Triangles> indices; @@ -43,6 +52,7 @@ public: optional<gl::IndexBuffer<gl::Triangles>> indexBuffer; private: DEMData demdata; + bool prepared = false; }; } // namespace mbgl diff --git a/src/mbgl/renderer/layers/render_hillshade_layer.cpp b/src/mbgl/renderer/layers/render_hillshade_layer.cpp index 77c352a3a2..94f780594e 100644 --- a/src/mbgl/renderer/layers/render_hillshade_layer.cpp +++ b/src/mbgl/renderer/layers/render_hillshade_layer.cpp @@ -96,7 +96,7 @@ void RenderHillshadeLayer::render(PaintParameters& parameters, RenderSource*) { if (!bucket.hasData()) continue; - if (!bucket.prepared && parameters.pass == RenderPass::Pass3D) { + if (!bucket.isPrepared() && parameters.pass == RenderPass::Pass3D) { OffscreenTexture view(parameters.context, { 256, 256 }); view.bind(); @@ -128,7 +128,7 @@ void RenderHillshadeLayer::render(PaintParameters& parameters, RenderSource*) { getID() ); bucket.texture = std::move(view.getTexture()); - bucket.prepared = true; + bucket.setPrepared(true); } else if (parameters.pass == RenderPass::Translucent) { assert(bucket.texture); parameters.context.bindTexture(*bucket.texture, 0, gl::TextureFilter::Linear); diff --git a/src/mbgl/renderer/sources/render_raster_dem_source.cpp b/src/mbgl/renderer/sources/render_raster_dem_source.cpp index 563e2aee60..3a004ec595 100644 --- a/src/mbgl/renderer/sources/render_raster_dem_source.cpp +++ b/src/mbgl/renderer/sources/render_raster_dem_source.cpp @@ -61,35 +61,6 @@ void RenderRasterDEMSource::update(Immutable<style::Source::Impl> baseImpl_, }); } -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); - 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(); - DEMData& tileDEM = tileBucket->getDEMData(); - DEMData& borderDEM = borderBucket->getDEMData(); - - 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; - // mark HillshadeBucket.prepared as false so it runs through the prepare render pass - // with the new texture data we just backfilled - tileBucket->prepared = false; - } -} - void RenderRasterDEMSource::onTileChanged(Tile& tile){ RasterDEMTile& demtile = static_cast<RasterDEMTile&>(tile); @@ -142,8 +113,8 @@ void RenderRasterDEMSource::onTileChanged(Tile& tile){ Tile* renderableNeighbor = tilePyramid.getTile(neighborid); if (renderableNeighbor != nullptr && renderableNeighbor->isRenderable()) { RasterDEMTile& borderTile = static_cast<RasterDEMTile&>(*renderableNeighbor); - fillBorder(demtile, borderTile, mask); - fillBorder(borderTile, demtile, opposites[mask]); + demtile.backfillBorder(borderTile, mask); + borderTile.backfillBorder(demtile, opposites[mask]); } } } diff --git a/src/mbgl/tile/raster_dem_tile.cpp b/src/mbgl/tile/raster_dem_tile.cpp index a05f2a758c..5dd9af2632 100644 --- a/src/mbgl/tile/raster_dem_tile.cpp +++ b/src/mbgl/tile/raster_dem_tile.cpp @@ -83,6 +83,33 @@ HillshadeBucket* RasterDEMTile::getBucket() const { return bucket.get(); } +void RasterDEMTile::backfillBorder(const RasterDEMTile& borderTile, const DEMTileNeighbors mask) { + int32_t dx = borderTile.id.canonical.x - id.canonical.x; + const int8_t dy = borderTile.id.canonical.y - id.canonical.y; + const uint32_t dim = pow(2, 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; + } + } + const HillshadeBucket* borderBucket = borderTile.getBucket(); + const DEMData& borderDEM = borderBucket->getDEMData(); + DEMData& tileDEM = bucket->getDEMData(); + + 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 + this->neighboringTiles = this->neighboringTiles | mask; + // mark HillshadeBucket.prepared as false so it runs through the prepare render pass + // with the new texture data we just backfilled + bucket->setPrepared(false); + } +} void RasterDEMTile::setMask(TileMask&& mask) { if (bucket) { diff --git a/src/mbgl/tile/raster_dem_tile.hpp b/src/mbgl/tile/raster_dem_tile.hpp index f208d3e40c..ec256b0a17 100644 --- a/src/mbgl/tile/raster_dem_tile.hpp +++ b/src/mbgl/tile/raster_dem_tile.hpp @@ -74,7 +74,9 @@ public: void upload(gl::Context&) override; Bucket* getBucket(const style::Layer::Impl&) const override; + HillshadeBucket* getBucket() const; + void backfillBorder(const RasterDEMTile& borderTile, const DEMTileNeighbors mask); // neighboringTiles is a bitmask for which neighboring tiles have been backfilled // there are max 8 possible neighboring tiles, so each bit represents one neighbor |