summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mbgl/geometry/dem_data.cpp76
-rw-r--r--src/mbgl/geometry/dem_data.hpp45
-rw-r--r--src/mbgl/renderer/buckets/hillshade_bucket.cpp4
-rw-r--r--src/mbgl/renderer/layers/render_hillshade_layer.cpp2
-rw-r--r--src/mbgl/tile/raster_dem_tile.cpp15
5 files changed, 62 insertions, 80 deletions
diff --git a/src/mbgl/geometry/dem_data.cpp b/src/mbgl/geometry/dem_data.cpp
index 627f140cf7..78134dadc1 100644
--- a/src/mbgl/geometry/dem_data.cpp
+++ b/src/mbgl/geometry/dem_data.cpp
@@ -3,17 +3,23 @@
namespace mbgl {
-DEMData::DEMData(const PremultipliedImage& image):
- level(image.size.height, std::max<int32_t>(std::ceil(image.size.height / 2), 1)){
- if (image.size.height != image.size.width){
+DEMData::DEMData(const PremultipliedImage& _image):
+ dim(_image.size.height),
+ border(std::max<int32_t>(std::ceil(_image.size.height / 2), 1)),
+ stride(dim + 2 * border),
+ image({ static_cast<uint32_t>(stride), static_cast<uint32_t>(stride) }) {
+
+ if (_image.size.height != _image.size.width){
throw std::runtime_error("raster-dem tiles must be square.");
}
- for (int32_t y = 0; y < level.dim; y++) {
- for (int32_t x = 0; x < level.dim; x++) {
- const int32_t i = y * level.dim + x;
+ std::memset(image.data.get(), 0, image.bytes());
+
+ for (int32_t y = 0; y < dim; y++) {
+ for (int32_t x = 0; x < dim; x++) {
+ const int32_t i = y * dim + x;
const int32_t j = i * 4;
- level.set(x, y, (image.data[j] * 256 * 256 + image.data[j+1] * 256 + image.data[j+2])/10 - 10000);
+ set(x, y, (_image.data[j] * 256 * 256 + _image.data[j+1] * 256 + _image.data[j+2])/10 - 10000);
}
}
@@ -22,26 +28,25 @@ DEMData::DEMData(const PremultipliedImage& image):
// replaced when the tile's neighboring tiles are loaded and the accurate data can be backfilled using
// DEMData#backfillBorder
- for (int32_t x = 0; x < level.dim; x++) {
+ for (int32_t x = 0; x < dim; x++) {
// left vertical border
- level.set(-1, x, level.get(0, x));
+ set(-1, x, get(0, x));
// right vertical border
- level.set(level.dim, x, level.get(level.dim - 1, x));
+ set(dim, x, get(dim - 1, x));
//left horizontal border
- level.set(x, -1, level.get(x, 0));
+ set(x, -1, get(x, 0));
// right horizontal border
- level.set(x, level.dim, level.get(x, level.dim - 1));
+ set(x, dim, get(x, dim - 1));
}
// corners
- level.set(-1, -1, level.get(0, 0));
- level.set(level.dim, -1, level.get(level.dim - 1, 0));
- level.set( -1, level.dim, level.get(0, level.dim - 1));
- level.set(level.dim, level.dim, level.get(level.dim - 1, level.dim - 1));
- loaded = true;
+ set(-1, -1, get(0, 0));
+ set(dim, -1, get(dim - 1, 0));
+ set( -1, dim, get(0, dim - 1));
+ set(dim, dim, get(dim - 1, dim - 1));
}
// This function takes the DEMData from a neighboring tile and backfills the edge/corner
@@ -50,20 +55,19 @@ DEMData::DEMData(const PremultipliedImage& image):
// pixel of the tile by querying the 8 surrounding pixels, and if we don't have the pixel
// buffer we get seams at tile boundaries.
void DEMData::backfillBorder(const DEMData& borderTileData, int8_t dx, int8_t dy) {
- auto& t = level;
- auto& o = borderTileData.level;
+ auto& o = borderTileData;
// Tiles from the same source should always be of the same dimensions.
- assert(t.dim == o.dim);
+ assert(dim == o.dim);
// We determine the pixel range to backfill based which corner/edge `borderTileData`
// represents. For example, dx = -1, dy = -1 represents the upper left corner of the
// base tile, so we only need to backfill one pixel at coordinates (-1, -1) of the tile
// image.
- int32_t _xMin = dx * t.dim;
- int32_t _xMax = dx * t.dim + t.dim;
- int32_t _yMin = dy * t.dim;
- int32_t _yMax = dy * t.dim + t.dim;
+ int32_t _xMin = dx * dim;
+ int32_t _xMax = dx * dim + dim;
+ int32_t _yMin = dy * dim;
+ int32_t _yMax = dy * dim + dim;
if (dx == -1) _xMin = _xMax - 1;
else if (dx == 1) _xMax = _xMin + 1;
@@ -71,30 +75,20 @@ void DEMData::backfillBorder(const DEMData& borderTileData, int8_t dx, int8_t dy
if (dy == -1) _yMin = _yMax - 1;
else if (dy == 1) _yMax = _yMin + 1;
- int32_t xMin = util::clamp(_xMin, -t.border, t.dim + t.border);
- int32_t xMax = util::clamp(_xMax, -t.border, t.dim + t.border);
+ int32_t xMin = util::clamp(_xMin, -border, dim + border);
+ int32_t xMax = util::clamp(_xMax, -border, dim + border);
- int32_t yMin = util::clamp(_yMin, -t.border, t.dim + t.border);
- int32_t yMax = util::clamp(_yMax, -t.border, t.dim + t.border);
+ int32_t yMin = util::clamp(_yMin, -border, dim + border);
+ int32_t yMax = util::clamp(_yMax, -border, dim + border);
- int32_t ox = -dx * t.dim;
- int32_t oy = -dy * t.dim;
+ int32_t ox = -dx * dim;
+ int32_t oy = -dy * dim;
for (int32_t y = yMin; y < yMax; y++) {
for (int32_t x = xMin; x < xMax; x++) {
- t.set(x, y, o.get(x + ox, y + oy));
+ set(x, y, o.get(x + ox, y + oy));
}
}
}
-DEMData::Level::Level(int32_t dim_, int32_t border_)
- : dim(dim_),
- border(border_),
- stride(dim + 2 * border),
- image({ static_cast<uint32_t>(stride),
- static_cast<uint32_t>(stride) }) {
- assert(dim > 0);
- std::memset(image.data.get(), 0, image.bytes());
-}
-
} // namespace mbgl
diff --git a/src/mbgl/geometry/dem_data.hpp b/src/mbgl/geometry/dem_data.hpp
index e59fbfedf2..507a51661d 100644
--- a/src/mbgl/geometry/dem_data.hpp
+++ b/src/mbgl/geometry/dem_data.hpp
@@ -12,24 +12,29 @@ namespace mbgl {
class DEMData {
public:
- class Level {
- public:
- Level(int32_t dim, int32_t border);
+ DEMData(const PremultipliedImage& image);
+ void backfillBorder(const DEMData& borderTileData, int8_t dx, int8_t dy);
- void set(const int32_t x, const int32_t y, const int32_t value) {
- reinterpret_cast<int32_t*>(image.data.get())[idx(x, y)] = value + 65536;
- }
+ void set(const int32_t x, const int32_t y, const int32_t value) {
+ reinterpret_cast<int32_t*>(image.data.get())[idx(x, y)] = value + 65536;
+ }
- int32_t get(const int32_t x, const int32_t y) const {
- return reinterpret_cast<const int32_t*>(image.data.get())[idx(x, y)] - 65536;
- }
+ int32_t get(const int32_t x, const int32_t y) const {
+ return reinterpret_cast<const int32_t*>(image.data.get())[idx(x, y)] - 65536;
+ }
- const PremultipliedImage* getImage() {
- return &image;
- }
+ const PremultipliedImage* getImage() const {
+ return &image;
+ }
+
+ const int32_t dim;
+ const int32_t border;
+ const int32_t stride;
private:
+ PremultipliedImage image;
+
size_t idx(const int32_t x, const int32_t y) const {
assert(x >= -border);
assert(x < dim + border);
@@ -38,22 +43,6 @@ public:
return (y + border) * stride + (x + border);
}
- public:
- const int32_t dim;
- const int32_t border;
- const int32_t stride;
- PremultipliedImage image;
- };
-
- DEMData(const PremultipliedImage& image);
- void backfillBorder(const DEMData& borderTileData, int8_t dx, int8_t dy);
- bool isLoaded() const {
- return loaded;
- }
- Level level;
- private:
- bool loaded = false;
-
};
} // namespace mbgl
diff --git a/src/mbgl/renderer/buckets/hillshade_bucket.cpp b/src/mbgl/renderer/buckets/hillshade_bucket.cpp
index 52186da908..8011681ee0 100644
--- a/src/mbgl/renderer/buckets/hillshade_bucket.cpp
+++ b/src/mbgl/renderer/buckets/hillshade_bucket.cpp
@@ -28,7 +28,7 @@ void HillshadeBucket::upload(gl::Context& context) {
}
- const PremultipliedImage* image = demdata.level.getImage();
+ const PremultipliedImage* image = demdata.getImage();
dem = context.createTexture(*image);
if (!segments.empty()) {
@@ -107,7 +107,7 @@ void HillshadeBucket::setMask(TileMask&& mask_) {
}
bool HillshadeBucket::hasData() const {
- return demdata.level.image.valid();
+ return demdata.getImage()->valid();
}
} // namespace mbgl
diff --git a/src/mbgl/renderer/layers/render_hillshade_layer.cpp b/src/mbgl/renderer/layers/render_hillshade_layer.cpp
index 29b48b8c4b..80e913c13e 100644
--- a/src/mbgl/renderer/layers/render_hillshade_layer.cpp
+++ b/src/mbgl/renderer/layers/render_hillshade_layer.cpp
@@ -102,7 +102,7 @@ void RenderHillshadeLayer::render(PaintParameters& parameters, RenderSource*) {
}
if (!bucket.isPrepared() && parameters.pass == RenderPass::Pass3D) {
- const uint16_t tilesize = bucket.getDEMData().level.dim;
+ const uint16_t tilesize = bucket.getDEMData().dim;
OffscreenTexture view(parameters.context, { tilesize, tilesize });
view.bind();
diff --git a/src/mbgl/tile/raster_dem_tile.cpp b/src/mbgl/tile/raster_dem_tile.cpp
index 5dd9af2632..f5b79c0ded 100644
--- a/src/mbgl/tile/raster_dem_tile.cpp
+++ b/src/mbgl/tile/raster_dem_tile.cpp
@@ -101,14 +101,13 @@ void RasterDEMTile::backfillBorder(const RasterDEMTile& borderTile, const DEMTil
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);
- }
+ 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) {