diff options
Diffstat (limited to 'src/mbgl/layout/pattern_layout.hpp')
-rw-r--r-- | src/mbgl/layout/pattern_layout.hpp | 46 |
1 files changed, 27 insertions, 19 deletions
diff --git a/src/mbgl/layout/pattern_layout.hpp b/src/mbgl/layout/pattern_layout.hpp index d6d878955f..48531e836b 100644 --- a/src/mbgl/layout/pattern_layout.hpp +++ b/src/mbgl/layout/pattern_layout.hpp @@ -1,8 +1,9 @@ #pragma once +#include <mbgl/geometry/feature_index.hpp> #include <mbgl/layout/layout.hpp> #include <mbgl/renderer/bucket_parameters.hpp> -#include <mbgl/geometry/feature_index.hpp> #include <mbgl/renderer/render_layer.hpp> +#include <mbgl/style/expression/image.hpp> #include <mbgl/style/layer_properties.hpp> namespace mbgl { @@ -32,11 +33,11 @@ public: PatternLayout(const BucketParameters& parameters, const std::vector<Immutable<style::LayerProperties>>& group, std::unique_ptr<GeometryTileLayer> sourceLayer_, - ImageDependencies& patternDependencies) - : sourceLayer(std::move(sourceLayer_)), - zoom(parameters.tileID.overscaledZ), - overscaling(parameters.tileID.overscaleFactor()), - hasPattern(false) { + const LayoutParameters& layoutParameters) + : sourceLayer(std::move(sourceLayer_)), + zoom(parameters.tileID.overscaledZ), + overscaling(parameters.tileID.overscaleFactor()), + hasPattern(false) { assert(!group.empty()); auto leaderLayerProperties = staticImmutableCast<LayerPropertiesType>(group.front()); layout = leaderLayerProperties->layerImpl().layout.evaluate(PropertyEvaluationParameters(zoom)); @@ -47,15 +48,15 @@ public: const std::string& layerId = layerProperties->baseImpl->id; const auto& evaluated = style::getEvaluated<LayerPropertiesType>(layerProperties); const auto patternProperty = evaluated.template get<PatternPropertyType>(); - const auto constantPattern = patternProperty.constantOr(Faded<std::basic_string<char> >{ "", ""}); + const auto constantPattern = patternProperty.constantOr(Faded<style::expression::Image>{"", ""}); // determine if layer group has any layers that use *-pattern property and add // constant pattern dependencies. if (!patternProperty.isConstant()) { hasPattern = true; - } else if (!constantPattern.to.empty()){ + } else if (!constantPattern.to.id().empty()) { hasPattern = true; - patternDependencies.emplace(constantPattern.to, ImageType::Pattern); - patternDependencies.emplace(constantPattern.from, ImageType::Pattern); + layoutParameters.imageDependencies.emplace(constantPattern.to.id(), ImageType::Pattern); + layoutParameters.imageDependencies.emplace(constantPattern.from.id(), ImageType::Pattern); } layerPropertiesMap.emplace(layerId, layerProperties); } @@ -77,15 +78,22 @@ public: 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, 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(layerId, PatternDependency {min.to, mid.to, max.to}); - + const auto min = patternProperty.evaluate(*feature, + zoom - 1, + layoutParameters.availableImages, + PatternPropertyType::defaultValue()); + const auto mid = patternProperty.evaluate( + *feature, zoom, layoutParameters.availableImages, PatternPropertyType::defaultValue()); + const auto max = patternProperty.evaluate(*feature, + zoom + 1, + layoutParameters.availableImages, + PatternPropertyType::defaultValue()); + + layoutParameters.imageDependencies.emplace(min.to.id(), ImageType::Pattern); + layoutParameters.imageDependencies.emplace(mid.to.id(), ImageType::Pattern); + layoutParameters.imageDependencies.emplace(max.to.id(), ImageType::Pattern); + patternDependencyMap.emplace(layerId, + PatternDependency{min.to.id(), mid.to.id(), max.to.id()}); } } } |