summaryrefslogtreecommitdiff
path: root/src/map
diff options
context:
space:
mode:
Diffstat (limited to 'src/map')
-rw-r--r--src/map/map.cpp154
-rw-r--r--src/map/transform.cpp11
-rw-r--r--src/map/transform_state.cpp11
3 files changed, 19 insertions, 157 deletions
diff --git a/src/map/map.cpp b/src/map/map.cpp
index 82108d0006..fd5468d4e2 100644
--- a/src/map/map.cpp
+++ b/src/map/map.cpp
@@ -44,7 +44,7 @@ Map::Map(View& view_)
glyphAtlas(std::make_shared<GlyphAtlas>(1024, 1024)),
spriteAtlas(std::make_shared<SpriteAtlas>(512, 512)),
texturepool(std::make_shared<Texturepool>()),
- painter(*this) {
+ painter(*spriteAtlas, *glyphAtlas) {
view.initialize(this);
@@ -598,15 +598,6 @@ void Map::updateTiles() {
}
}
-void Map::updateRenderState() {
- // Update all clipping IDs.
- ClipIDGenerator generator;
- for (const util::ptr<StyleSource> &source : getActiveSources()) {
- generator.update(source->source->getLoadedTiles());
- source->source->updateMatrices(painter.projMatrix, state);
- }
-}
-
void Map::prepare() {
if (!fileSource) {
fileSource = std::make_shared<FileSource>(**loop, platform::defaultCacheDatabase());
@@ -654,152 +645,13 @@ void Map::prepare() {
void Map::render() {
view.make_active();
- painter.clear();
-
- painter.resize();
-
- painter.changeMatrix();
-
- updateRenderState();
-
- painter.drawClippingMasks(getActiveSources());
-
- painter.frameHistory.record(getAnimationTime(), getState().getNormalizedZoom());
-
- // Actually render the layers
- if (debug::renderTree) { std::cout << "{" << std::endl; indent++; }
- renderLayers(style->layers);
- if (debug::renderTree) { std::cout << "}" << std::endl; indent--; }
-
- // Finalize the rendering, e.g. by calling debug render calls per tile.
- // This guarantees that we have at least one function per tile called.
- // When only rendering layers via the stylesheet, it's possible that we don't
- // ever visit a tile during rendering.
- for (const util::ptr<StyleSource> &source : getActiveSources()) {
- source->source->finishRender(painter);
- }
+ painter.render(*style, getActiveSources(),
+ getState(), getAnimationTime());
// Schedule another rerender when we definitely need a next frame.
if (transform.needsTransition() || style->hasTransitions()) {
update();
}
- glFlush();
-
view.make_inactive();
}
-
-void Map::renderLayers(util::ptr<StyleLayerGroup> group) {
- if (!group) {
- // Make sure that we actually do have a layer group.
- return;
- }
-
- // TODO: Correctly compute the number of layers recursively beforehand.
- float strata_thickness = 1.0f / (group->layers.size() + 1);
-
- // - FIRST PASS ------------------------------------------------------------
- // Render everything top-to-bottom by using reverse iterators. Render opaque
- // objects first.
-
- if (debug::renderTree) {
- std::cout << std::string(indent++ * 4, ' ') << "OPAQUE {" << std::endl;
- }
- int i = 0;
- for (auto it = group->layers.rbegin(), end = group->layers.rend(); it != end; ++it, ++i) {
- painter.setOpaque();
- painter.setStrata(i * strata_thickness);
- renderLayer(*it, RenderPass::Opaque);
- }
- if (debug::renderTree) {
- std::cout << std::string(--indent * 4, ' ') << "}" << std::endl;
- }
-
- // - SECOND PASS -----------------------------------------------------------
- // Make a second pass, rendering translucent objects. This time, we render
- // bottom-to-top.
- if (debug::renderTree) {
- std::cout << std::string(indent++ * 4, ' ') << "TRANSLUCENT {" << std::endl;
- }
- --i;
- for (auto it = group->layers.begin(), end = group->layers.end(); it != end; ++it, --i) {
- painter.setTranslucent();
- painter.setStrata(i * strata_thickness);
- renderLayer(*it, RenderPass::Translucent);
- }
- if (debug::renderTree) {
- std::cout << std::string(--indent * 4, ' ') << "}" << std::endl;
- }
-}
-
-void Map::renderLayer(util::ptr<StyleLayer> layer_desc, RenderPass pass, const Tile::ID* id, const mat4* matrix) {
- if (layer_desc->type == StyleLayerType::Background) {
- // This layer defines a background color/image.
-
- if (debug::renderTree) {
- std::cout << std::string(indent * 4, ' ') << "- " << layer_desc->id << " ("
- << layer_desc->type << ")" << std::endl;
- }
-
- painter.renderBackground(layer_desc);
- } else {
- // This is a singular layer.
- if (!layer_desc->bucket) {
- fprintf(stderr, "[WARNING] layer '%s' is missing bucket\n", layer_desc->id.c_str());
- return;
- }
-
- if (!layer_desc->bucket->style_source) {
- fprintf(stderr, "[WARNING] can't find source for layer '%s'\n", layer_desc->id.c_str());
- return;
- }
-
- StyleSource &style_source = *layer_desc->bucket->style_source;
-
- // Skip this layer if there is no data.
- if (!style_source.source) {
- return;
- }
-
- // Skip this layer if it's outside the range of min/maxzoom.
- // This may occur when there /is/ a bucket created for this layer, but the min/max-zoom
- // is set to a fractional value, or value that is larger than the source maxzoom.
- const double zoom = state.getZoom();
- if (layer_desc->bucket->min_zoom > zoom ||
- layer_desc->bucket->max_zoom <= zoom) {
- return;
- }
-
- // Abort early if we can already deduce from the bucket type that
- // we're not going to render anything anyway during this pass.
- switch (layer_desc->type) {
- case StyleLayerType::Fill:
- if (!layer_desc->getProperties<FillProperties>().isVisible()) return;
- break;
- case StyleLayerType::Line:
- if (pass == RenderPass::Opaque) return;
- if (!layer_desc->getProperties<LineProperties>().isVisible()) return;
- break;
- case StyleLayerType::Symbol:
- if (pass == RenderPass::Opaque) return;
- if (!layer_desc->getProperties<SymbolProperties>().isVisible()) return;
- break;
- case StyleLayerType::Raster:
- if (pass == RenderPass::Opaque) return;
- if (!layer_desc->getProperties<RasterProperties>().isVisible()) return;
- break;
- default:
- break;
- }
-
- if (debug::renderTree) {
- std::cout << std::string(indent * 4, ' ') << "- " << layer_desc->id << " ("
- << layer_desc->type << ")" << std::endl;
- }
- if (!id) {
- style_source.source->render(painter, layer_desc);
- } else {
- style_source.source->render(painter, layer_desc, *id, *matrix);
- }
- }
-}
diff --git a/src/map/transform.cpp b/src/map/transform.cpp
index b42f24a83d..9619305dd8 100644
--- a/src/map/transform.cpp
+++ b/src/map/transform.cpp
@@ -13,13 +13,13 @@
using namespace mbgl;
const double D2R = M_PI / 180.0;
-const double R2D = 180.0 / M_PI;
const double M2PI = 2 * M_PI;
const double MIN_ROTATE_SCALE = 8;
-Transform::Transform(View &view_) : view(view_), mtx(std::make_unique<uv::rwlock>()) {
- setScale(current.scale);
- setAngle(current.angle);
+Transform::Transform(View &view_)
+ : view(view_)
+ , mtx(std::make_unique<uv::rwlock>())
+{
}
#pragma mark - Map View
@@ -123,8 +123,7 @@ void Transform::setLonLatZoom(const double lon, const double lat, const double z
void Transform::getLonLat(double &lon, double &lat) const {
uv::readlock lock(mtx);
- lon = -final.x / Bc;
- lat = R2D * (2 * std::atan(std::exp(final.y / Cc)) - 0.5 * M_PI);
+ final.getLonLat(lon, lat);
}
void Transform::getLonLatZoom(double &lon, double &lat, double &zoom) const {
diff --git a/src/map/transform_state.cpp b/src/map/transform_state.cpp
index 0a858bce6a..afc5b59ef1 100644
--- a/src/map/transform_state.cpp
+++ b/src/map/transform_state.cpp
@@ -3,6 +3,8 @@
using namespace mbgl;
+const double R2D = 180.0 / M_PI;
+
#pragma mark - Matrix
void TransformState::matrixFor(mat4& matrix, const Tile::ID& id) const {
@@ -108,6 +110,15 @@ std::array<float, 2> TransformState::locationCoordinate(float lon, float lat) co
}};
}
+void TransformState::getLonLat(double &lon, double &lat) const {
+ const double s = scale * util::tileSize;
+ const double Bc = s / 360;
+ const double Cc = s / (2 * M_PI);
+
+ lon = -x / Bc;
+ lat = R2D * (2 * std::atan(std::exp(y / Cc)) - 0.5 * M_PI);
+}
+
#pragma mark - Zoom