diff options
author | Ivo van Dongen <info@ivovandongen.nl> | 2017-04-21 09:19:47 -0700 |
---|---|---|
committer | Ivo van Dongen <ivovandongen@users.noreply.github.com> | 2017-04-25 17:23:54 -0700 |
commit | 3c175adf30546fe58713b8fed29ac35a85e150be (patch) | |
tree | 5666e9bcf311ed1b86a13444e50dc7a030c10da9 /src/mbgl/tile | |
parent | ea8ec38df156c6683c886253dbb1f6bc828686ff (diff) | |
download | qtlocation-mapboxgl-3c175adf30546fe58713b8fed29ac35a85e150be.tar.gz |
[core] split off render layers
Diffstat (limited to 'src/mbgl/tile')
-rw-r--r-- | src/mbgl/tile/geometry_tile.cpp | 10 | ||||
-rw-r--r-- | src/mbgl/tile/geometry_tile.hpp | 4 | ||||
-rw-r--r-- | src/mbgl/tile/geometry_tile_worker.cpp | 47 | ||||
-rw-r--r-- | src/mbgl/tile/geometry_tile_worker.hpp | 1 | ||||
-rw-r--r-- | src/mbgl/tile/raster_tile.cpp | 2 | ||||
-rw-r--r-- | src/mbgl/tile/raster_tile.hpp | 2 | ||||
-rw-r--r-- | src/mbgl/tile/tile.hpp | 4 |
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() {} |