summaryrefslogtreecommitdiff
path: root/src/mbgl/tile
diff options
context:
space:
mode:
authorIvo van Dongen <info@ivovandongen.nl>2017-04-21 09:19:47 -0700
committerIvo van Dongen <ivovandongen@users.noreply.github.com>2017-04-25 17:23:54 -0700
commit3c175adf30546fe58713b8fed29ac35a85e150be (patch)
tree5666e9bcf311ed1b86a13444e50dc7a030c10da9 /src/mbgl/tile
parentea8ec38df156c6683c886253dbb1f6bc828686ff (diff)
downloadqtlocation-mapboxgl-3c175adf30546fe58713b8fed29ac35a85e150be.tar.gz
[core] split off render layers
Diffstat (limited to 'src/mbgl/tile')
-rw-r--r--src/mbgl/tile/geometry_tile.cpp10
-rw-r--r--src/mbgl/tile/geometry_tile.hpp4
-rw-r--r--src/mbgl/tile/geometry_tile_worker.cpp47
-rw-r--r--src/mbgl/tile/geometry_tile_worker.hpp1
-rw-r--r--src/mbgl/tile/raster_tile.cpp2
-rw-r--r--src/mbgl/tile/raster_tile.hpp2
-rw-r--r--src/mbgl/tile/tile.hpp4
7 files changed, 49 insertions, 21 deletions
diff --git a/src/mbgl/tile/geometry_tile.cpp b/src/mbgl/tile/geometry_tile.cpp
index d3406e1a59..b47519d95c 100644
--- a/src/mbgl/tile/geometry_tile.cpp
+++ b/src/mbgl/tile/geometry_tile.cpp
@@ -6,7 +6,9 @@
#include <mbgl/style/layer_impl.hpp>
#include <mbgl/style/layers/background_layer.hpp>
#include <mbgl/style/layers/custom_layer.hpp>
-#include <mbgl/style/layers/symbol_layer.hpp>
+#include <mbgl/renderer/render_background_layer.hpp>
+#include <mbgl/renderer/render_custom_layer.hpp>
+#include <mbgl/renderer/render_symbol_layer.hpp>
#include <mbgl/style/style.hpp>
#include <mbgl/storage/file_source.hpp>
#include <mbgl/geometry/feature_index.hpp>
@@ -159,9 +161,9 @@ void GeometryTile::getIcons(IconDependencyMap iconDependencyMap) {
}
}
-Bucket* GeometryTile::getBucket(const Layer& layer) const {
- const auto& buckets = layer.is<SymbolLayer>() ? symbolBuckets : nonSymbolBuckets;
- const auto it = buckets.find(layer.baseImpl->id);
+Bucket* GeometryTile::getBucket(const RenderLayer& layer) const {
+ const auto& buckets = layer.is<RenderSymbolLayer>() ? symbolBuckets : nonSymbolBuckets;
+ const auto it = buckets.find(layer.baseImpl.id);
if (it == buckets.end()) {
return nullptr;
}
diff --git a/src/mbgl/tile/geometry_tile.hpp b/src/mbgl/tile/geometry_tile.hpp
index bfd036f3d5..3913fca812 100644
--- a/src/mbgl/tile/geometry_tile.hpp
+++ b/src/mbgl/tile/geometry_tile.hpp
@@ -18,10 +18,10 @@ namespace mbgl {
class GeometryTileData;
class FeatureIndex;
class CollisionTile;
+class RenderLayer;
namespace style {
class Style;
-class Layer;
class UpdateParameters;
class SourceQueryOptions;
} // namespace style
@@ -46,7 +46,7 @@ public:
void getGlyphs(GlyphDependencies);
void getIcons(IconDependencyMap);
- Bucket* getBucket(const style::Layer&) const override;
+ Bucket* getBucket(const RenderLayer&) const override;
void queryRenderedFeatures(
std::unordered_map<std::string, std::vector<Feature>>& result,
diff --git a/src/mbgl/tile/geometry_tile_worker.cpp b/src/mbgl/tile/geometry_tile_worker.cpp
index d9b720d226..b745cccc89 100644
--- a/src/mbgl/tile/geometry_tile_worker.cpp
+++ b/src/mbgl/tile/geometry_tile_worker.cpp
@@ -4,12 +4,12 @@
#include <mbgl/text/collision_tile.hpp>
#include <mbgl/layout/symbol_layout.hpp>
#include <mbgl/sprite/sprite_atlas.hpp>
-#include <mbgl/style/bucket_parameters.hpp>
-#include <mbgl/style/group_by_layout.hpp>
+#include <mbgl/renderer/bucket_parameters.hpp>
+#include <mbgl/renderer/group_by_layout.hpp>
#include <mbgl/style/filter.hpp>
#include <mbgl/style/filter_evaluator.hpp>
-#include <mbgl/style/layers/symbol_layer.hpp>
#include <mbgl/style/layers/symbol_layer_impl.hpp>
+#include <mbgl/renderer/render_symbol_layer.hpp>
#include <mbgl/renderer/symbol_bucket.hpp>
#include <mbgl/util/logging.hpp>
#include <mbgl/util/constants.hpp>
@@ -252,6 +252,28 @@ void GeometryTileWorker::requestNewIcons(const IconDependencyMap &iconDependenci
}
}
+static std::vector<std::unique_ptr<RenderLayer>> toRenderLayers(const std::vector<std::unique_ptr<style::Layer>>& layers, float zoom) {
+ std::vector<std::unique_ptr<RenderLayer>> renderLayers;
+ renderLayers.reserve(layers.size());
+ for (auto& layer : layers) {
+ renderLayers.push_back(layer->baseImpl->createRenderLayer());
+
+ renderLayers.back()->cascade(style::CascadeParameters {
+ { ClassID::Default },
+ Clock::time_point::max(),
+ TransitionOptions()
+ });
+
+ renderLayers.back()->evaluate(style::PropertyEvaluationParameters {
+ zoom,
+ Clock::time_point::max(),
+ ZoomHistory(),
+ Duration(0)
+ });
+ }
+ return renderLayers;
+}
+
void GeometryTileWorker::redoLayout() {
if (!data || !layers) {
return;
@@ -272,7 +294,10 @@ void GeometryTileWorker::redoLayout() {
GlyphDependencies glyphDependencies;
IconDependencyMap iconDependencyMap;
- std::vector<std::vector<const Layer*>> groups = groupByLayout(*layers);
+ // Create render layers and group by layout
+ std::vector<std::unique_ptr<RenderLayer>> renderLayers = toRenderLayers(*layers, id.overscaledZ);
+ std::vector<std::vector<const RenderLayer*>> groups = groupByLayout(renderLayers);
+
for (auto& group : groups) {
if (obsolete) {
return;
@@ -282,9 +307,9 @@ void GeometryTileWorker::redoLayout() {
continue; // Tile has no data.
}
- const Layer& leader = *group.at(0);
+ const RenderLayer& leader = *group.at(0);
- auto geometryLayer = (*data)->getLayer(leader.baseImpl->sourceLayer);
+ auto geometryLayer = (*data)->getLayer(leader.baseImpl.sourceLayer);
if (!geometryLayer) {
continue;
}
@@ -296,13 +321,13 @@ void GeometryTileWorker::redoLayout() {
featureIndex->setBucketLayerIDs(leader.getID(), layerIDs);
- if (leader.is<SymbolLayer>()) {
+ if (leader.is<RenderSymbolLayer>()) {
symbolLayoutMap.emplace(leader.getID(),
- leader.as<SymbolLayer>()->impl->createLayout(parameters, group, *geometryLayer, glyphDependencies, iconDependencyMap));
+ leader.as<RenderSymbolLayer>()->createLayout(parameters, group, *geometryLayer, glyphDependencies, iconDependencyMap));
} else {
- const Filter& filter = leader.baseImpl->filter;
- const std::string& sourceLayerID = leader.baseImpl->sourceLayer;
- std::shared_ptr<Bucket> bucket = leader.baseImpl->createBucket(parameters, group);
+ const Filter& filter = leader.baseImpl.filter;
+ const std::string& sourceLayerID = leader.baseImpl.sourceLayer;
+ std::shared_ptr<Bucket> bucket = leader.createBucket(parameters, group);
for (std::size_t i = 0; !obsolete && i < geometryLayer->featureCount(); i++) {
std::unique_ptr<GeometryTileFeature> feature = geometryLayer->getFeature(i);
diff --git a/src/mbgl/tile/geometry_tile_worker.hpp b/src/mbgl/tile/geometry_tile_worker.hpp
index 5ce4260fdf..ab3b9d7403 100644
--- a/src/mbgl/tile/geometry_tile_worker.hpp
+++ b/src/mbgl/tile/geometry_tile_worker.hpp
@@ -17,6 +17,7 @@ class GeometryTile;
class GeometryTileData;
class GlyphAtlas;
class SymbolLayout;
+class RenderLayer;
namespace style {
class Layer;
diff --git a/src/mbgl/tile/raster_tile.cpp b/src/mbgl/tile/raster_tile.cpp
index 1e3c772200..65907eb92a 100644
--- a/src/mbgl/tile/raster_tile.cpp
+++ b/src/mbgl/tile/raster_tile.cpp
@@ -55,7 +55,7 @@ void RasterTile::onError(std::exception_ptr err) {
observer->onTileError(*this, err);
}
-Bucket* RasterTile::getBucket(const style::Layer&) const {
+Bucket* RasterTile::getBucket(const RenderLayer&) const {
return bucket.get();
}
diff --git a/src/mbgl/tile/raster_tile.hpp b/src/mbgl/tile/raster_tile.hpp
index cc0dbe71de..47f67a0842 100644
--- a/src/mbgl/tile/raster_tile.hpp
+++ b/src/mbgl/tile/raster_tile.hpp
@@ -29,7 +29,7 @@ public:
optional<Timestamp> expires_);
void cancel() override;
- Bucket* getBucket(const style::Layer&) const override;
+ Bucket* getBucket(const RenderLayer&) const override;
void onParsed(std::unique_ptr<Bucket> result);
void onError(std::exception_ptr);
diff --git a/src/mbgl/tile/tile.hpp b/src/mbgl/tile/tile.hpp
index b3085071c2..6c2c78967f 100644
--- a/src/mbgl/tile/tile.hpp
+++ b/src/mbgl/tile/tile.hpp
@@ -22,9 +22,9 @@ class TransformState;
class TileObserver;
class PlacementConfig;
class RenderedQueryOptions;
+class RenderLayer;
namespace style {
-class Layer;
class SourceQueryOptions;
} // namespace style
@@ -47,7 +47,7 @@ public:
// Mark this tile as no longer needed and cancel any pending work.
virtual void cancel() = 0;
- virtual Bucket* getBucket(const style::Layer&) const = 0;
+ virtual Bucket* getBucket(const RenderLayer&) const = 0;
virtual void setPlacementConfig(const PlacementConfig&) {}
virtual void redoLayout() {}