summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMolly Lloyd <molly@mapbox.com>2018-01-16 17:36:09 -0800
committerMolly Lloyd <molly@mapbox.com>2018-01-18 18:10:10 -0800
commita911efcdf1f5621dd332f1724ee225fa680ca790 (patch)
tree10c4fe3ca85bd6a9facbf13a91aa107000d9fc41
parent899170706f31e3df94b642bed3e02e0c84f8e4f6 (diff)
downloadqtlocation-mapboxgl-a911efcdf1f5621dd332f1724ee225fa680ca790.tar.gz
refactor backfillBorder owner
-rw-r--r--src/mbgl/geometry/dem_data.cpp2
-rw-r--r--src/mbgl/geometry/dem_data.hpp2
-rw-r--r--src/mbgl/renderer/buckets/hillshade_bucket.cpp4
-rw-r--r--src/mbgl/renderer/buckets/hillshade_bucket.hpp12
-rw-r--r--src/mbgl/renderer/layers/render_hillshade_layer.cpp4
-rw-r--r--src/mbgl/renderer/sources/render_raster_dem_source.cpp33
-rw-r--r--src/mbgl/tile/raster_dem_tile.cpp27
-rw-r--r--src/mbgl/tile/raster_dem_tile.hpp2
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