diff options
author | Mikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com> | 2019-04-01 11:29:28 +0300 |
---|---|---|
committer | Mikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com> | 2019-04-17 17:21:41 +0300 |
commit | 4b21560cf59877125ea0bdae1a2546ab06f1efb2 (patch) | |
tree | bd7f76fd51c29c63ef7b15964752f9c8c9e3bf38 /src/mbgl/layout | |
parent | 1a66a02097f0e3c95a4d06610fc0b7609f6d77b9 (diff) | |
download | qtlocation-mapboxgl-4b21560cf59877125ea0bdae1a2546ab06f1efb2.tar.gz |
[core] Use `style::LayerProperties` in render layers, buckets and layouts.
Diffstat (limited to 'src/mbgl/layout')
-rw-r--r-- | src/mbgl/layout/pattern_layout.hpp | 68 | ||||
-rw-r--r-- | src/mbgl/layout/symbol_layout.cpp | 18 | ||||
-rw-r--r-- | src/mbgl/layout/symbol_layout.hpp | 3 |
3 files changed, 46 insertions, 43 deletions
diff --git a/src/mbgl/layout/pattern_layout.hpp b/src/mbgl/layout/pattern_layout.hpp index 8dabfab919..fe2e9c5950 100644 --- a/src/mbgl/layout/pattern_layout.hpp +++ b/src/mbgl/layout/pattern_layout.hpp @@ -3,6 +3,7 @@ #include <mbgl/renderer/bucket_parameters.hpp> #include <mbgl/geometry/feature_index.hpp> #include <mbgl/renderer/render_layer.hpp> +#include <mbgl/style/layer_properties.hpp> namespace mbgl { @@ -22,31 +23,32 @@ public: PatternLayerMap patterns; }; -template <class B> +template <class BucketType, + class LayerPropertiesType, + class PatternPropertyType, + class PossiblyEvaluatedPaintPropertiesType, + class PossiblyEvaluatedLayoutPropertiesType = typename style::Properties<>::PossiblyEvaluated> class PatternLayout : public Layout { public: PatternLayout(const BucketParameters& parameters, - const std::vector<const RenderLayer*>& layers, + const std::vector<Immutable<style::LayerProperties>>& group, std::unique_ptr<GeometryTileLayer> sourceLayer_, ImageDependencies& patternDependencies) - : Layout(), - bucketLeaderID(layers.at(0)->getID()), - sourceLayer(std::move(sourceLayer_)), + : sourceLayer(std::move(sourceLayer_)), zoom(parameters.tileID.overscaledZ), overscaling(parameters.tileID.overscaleFactor()), hasPattern(false) { - - using PatternLayer = typename B::RenderLayerType; - const auto renderLayer = static_cast<const PatternLayer*>(layers.at(0)); - const typename PatternLayer::StyleLayerImpl& leader = renderLayer->impl(); - layout = leader.layout.evaluate(PropertyEvaluationParameters(zoom)); - sourceLayerID = leader.sourceLayer; - groupID = renderLayer->getID(); - - for (const auto& layer : layers) { - const typename B::PossiblyEvaluatedPaintProperties evaluatedProps = static_cast<const PatternLayer*>(layer)->evaluated; - const auto patternProperty = evaluatedProps.template get<typename PatternLayer::PatternProperty>(); - const auto constantPattern = patternProperty.constantOr({ "", "" }); + assert(!group.empty()); + auto leaderLayerProperties = staticImmutableCast<LayerPropertiesType>(group.front()); + layout = leaderLayerProperties->layerImpl().layout.evaluate(PropertyEvaluationParameters(zoom)); + sourceLayerID = leaderLayerProperties->layerImpl().sourceLayer; + bucketLeaderID = leaderLayerProperties->layerImpl().id; + + for (const auto& layerProperties : group) { + const std::string& layerId = layerProperties->baseImpl->id; + const auto evaluatedProps = static_cast<const LayerPropertiesType&>(*layerProperties).evaluated; + const auto patternProperty = evaluatedProps.template get<PatternPropertyType>(); + const auto constantPattern = patternProperty.constantOr(Faded<std::basic_string<char> >{ "", ""}); // determine if layer group has any layers that use *-pattern property and add // constant pattern dependencies. if (!patternProperty.isConstant()) { @@ -56,33 +58,34 @@ public: patternDependencies.emplace(constantPattern.to, ImageType::Pattern); patternDependencies.emplace(constantPattern.from, ImageType::Pattern); } - layerPaintProperties.emplace(layer->getID(), std::move(evaluatedProps)); + layerPaintProperties.emplace(layerId, std::move(evaluatedProps)); } const size_t featureCount = sourceLayer->featureCount(); for (size_t i = 0; i < featureCount; ++i) { auto feature = sourceLayer->getFeature(i); - if (!leader.filter(style::expression::EvaluationContext { this->zoom, feature.get() })) + if (!leaderLayerProperties->layerImpl().filter(style::expression::EvaluationContext { this->zoom, feature.get() })) continue; PatternLayerMap patternDependencyMap; if (hasPattern) { - for (const auto& layer : layers) { - const auto it = layerPaintProperties.find(layer->getID()); + for (const auto& layerProperties : group) { + const std::string& layerId = layerProperties->baseImpl->id; + const auto it = layerPaintProperties.find(layerId); if (it != layerPaintProperties.end()) { const auto paint = it->second; - const auto patternProperty = paint.template get<typename PatternLayer::PatternProperty>(); + const auto patternProperty = paint.template get<PatternPropertyType>(); if (!patternProperty.isConstant()) { // For layers with non-data-constant pattern properties, evaluate their expression and add // the patterns to the dependency vector - const auto min = patternProperty.evaluate(*feature, zoom - 1, PatternLayer::PatternProperty::defaultValue()); - const auto mid = patternProperty.evaluate(*feature, zoom, PatternLayer::PatternProperty::defaultValue()); - const auto max = patternProperty.evaluate(*feature, zoom + 1, PatternLayer::PatternProperty::defaultValue()); + const auto min = patternProperty.evaluate(*feature, zoom - 1, PatternPropertyType::defaultValue()); + const auto mid = patternProperty.evaluate(*feature, zoom, PatternPropertyType::defaultValue()); + const auto max = patternProperty.evaluate(*feature, zoom + 1, PatternPropertyType::defaultValue()); patternDependencies.emplace(min.to, ImageType::Pattern); patternDependencies.emplace(mid.to, ImageType::Pattern); patternDependencies.emplace(max.to, ImageType::Pattern); - patternDependencyMap.emplace(layer->getID(), PatternDependency {min.to, mid.to, max.to}); + patternDependencyMap.emplace(layerId, PatternDependency {min.to, mid.to, max.to}); } } @@ -99,15 +102,15 @@ public: } void createBucket(const ImagePositions& patternPositions, std::unique_ptr<FeatureIndex>& featureIndex, std::unordered_map<std::string, std::shared_ptr<Bucket>>& buckets, const bool, const bool) override { - auto bucket = std::make_shared<B>(layout, layerPaintProperties, zoom, overscaling); + auto bucket = std::make_shared<BucketType>(layout, layerPaintProperties, zoom, overscaling); for (auto & patternFeature : features) { const auto i = patternFeature.i; std::unique_ptr<GeometryTileFeature> feature = std::move(patternFeature.feature); - PatternLayerMap patterns = patternFeature.patterns; + const PatternLayerMap& patterns = patternFeature.patterns; GeometryCollection geometries = feature->getGeometries(); bucket->addFeature(*feature, geometries, patternPositions, patterns); - featureIndex->insert(geometries, i, sourceLayerID, groupID); + featureIndex->insert(geometries, i, sourceLayerID, bucketLeaderID); } if (bucket->hasData()) { for (const auto& pair : layerPaintProperties) { @@ -116,19 +119,18 @@ public: } }; - std::map<std::string, typename B::PossiblyEvaluatedPaintProperties> layerPaintProperties; - const std::string bucketLeaderID; + std::map<std::string, PossiblyEvaluatedPaintPropertiesType> layerPaintProperties; + std::string bucketLeaderID; private: const std::unique_ptr<GeometryTileLayer> sourceLayer; std::vector<PatternFeature> features; - typename B::PossiblyEvaluatedLayoutProperties layout; + PossiblyEvaluatedLayoutPropertiesType layout; const float zoom; const uint32_t overscaling; std::string sourceLayerID; - std::string groupID; bool hasPattern; }; diff --git a/src/mbgl/layout/symbol_layout.cpp b/src/mbgl/layout/symbol_layout.cpp index 03cfe506ec..0eb98f7569 100644 --- a/src/mbgl/layout/symbol_layout.cpp +++ b/src/mbgl/layout/symbol_layout.cpp @@ -40,16 +40,18 @@ expression::Value sectionOptionsToValue(const SectionOptions& options) { } return result; } -} // namespace +inline const SymbolLayerProperties& toSymbolLayerProperties(const Immutable<LayerProperties>& layer) { + return static_cast<const SymbolLayerProperties&>(*layer); +} +} // namespace SymbolLayout::SymbolLayout(const BucketParameters& parameters, - const std::vector<const RenderLayer*>& layers, + const std::vector<Immutable<style::LayerProperties>>& layers, std::unique_ptr<GeometryTileLayer> sourceLayer_, ImageDependencies& imageDependencies, GlyphDependencies& glyphDependencies) - : Layout(), - bucketLeaderID(layers.at(0)->getID()), + : bucketLeaderID(layers.front()->baseImpl->id), sourceLayer(std::move(sourceLayer_)), overscaling(parameters.tileID.overscaleFactor()), zoom(parameters.tileID.overscaledZ), @@ -57,11 +59,11 @@ SymbolLayout::SymbolLayout(const BucketParameters& parameters, pixelRatio(parameters.pixelRatio), tileSize(util::tileSize * overscaling), tilePixelRatio(float(util::EXTENT) / tileSize), - textSize(toRenderSymbolLayer(layers.at(0))->impl().layout.get<TextSize>()), - iconSize(toRenderSymbolLayer(layers.at(0))->impl().layout.get<IconSize>()) + textSize(toSymbolLayerProperties(layers.at(0)).layerImpl().layout.get<TextSize>()), + iconSize(toSymbolLayerProperties(layers.at(0)).layerImpl().layout.get<IconSize>()) { - const SymbolLayer::Impl& leader = toRenderSymbolLayer(layers.at(0))->impl(); + const SymbolLayer::Impl& leader = toSymbolLayerProperties(layers.at(0)).layerImpl(); layout = leader.layout.evaluate(PropertyEvaluationParameters(zoom)); @@ -104,7 +106,7 @@ SymbolLayout::SymbolLayout(const BucketParameters& parameters, layout.get<TextIgnorePlacement>() || layout.get<IconIgnorePlacement>()); for (const auto& layer : layers) { - layerPaintProperties.emplace(layer->getID(), toRenderSymbolLayer(layer)->evaluated); + layerPaintProperties.emplace(layer->baseImpl->id, toSymbolLayerProperties(layer).evaluated); } // Determine glyph dependencies diff --git a/src/mbgl/layout/symbol_layout.hpp b/src/mbgl/layout/symbol_layout.hpp index 9b8b0adfcc..9fc48d904c 100644 --- a/src/mbgl/layout/symbol_layout.hpp +++ b/src/mbgl/layout/symbol_layout.hpp @@ -16,7 +16,6 @@ namespace mbgl { class BucketParameters; class Anchor; -class RenderLayer; class PlacedSymbol; namespace style { @@ -26,7 +25,7 @@ class Filter; class SymbolLayout final : public Layout { public: SymbolLayout(const BucketParameters&, - const std::vector<const RenderLayer*>&, + const std::vector<Immutable<style::LayerProperties>>&, std::unique_ptr<GeometryTileLayer>, ImageDependencies&, GlyphDependencies&); |