diff options
-rw-r--r-- | src/mbgl/layout/pattern_layout.hpp | 30 | ||||
-rw-r--r-- | src/mbgl/renderer/data_driven_property_evaluator.hpp | 6 | ||||
-rw-r--r-- | src/mbgl/renderer/layers/render_line_layer.cpp | 3 | ||||
-rw-r--r-- | src/mbgl/renderer/paint_property_binder.hpp | 2 |
4 files changed, 33 insertions, 8 deletions
diff --git a/src/mbgl/layout/pattern_layout.hpp b/src/mbgl/layout/pattern_layout.hpp index 0ffac36b7..86d34d307 100644 --- a/src/mbgl/layout/pattern_layout.hpp +++ b/src/mbgl/layout/pattern_layout.hpp @@ -22,6 +22,27 @@ public: PatternLayerMap patterns; }; +class PatternUtil { +public: + static std::string getPatternForZoom(style::PropertyValue<std::string>& value, float z) { + return value.match( + [&] (const style::Undefined&) { + return std::string(""); + }, + [&] (const std::string& _value) { + return _value; + }, + [&] (const style::PropertyExpression<std::string>& expression) { + if (expression.isFeatureConstant() && !expression.isZoomConstant()) { + return expression.evaluate(z); + } else { + return std::string(""); + } + } + ); + } +}; + template <class B> class PatternLayout : public Layout { public: @@ -35,10 +56,10 @@ public: zoom(parameters.tileID.overscaledZ), overscaling(parameters.tileID.overscaleFactor()), hasPattern(false) { - using PatternLayer = typename B::RenderLayerType; const auto renderLayer = layers.at(0)->as<PatternLayer>(); const typename PatternLayer::StyleLayerImpl& leader = renderLayer->impl(); + layout = leader.layout.evaluate(PropertyEvaluationParameters(zoom)); sourceLayerID = leader.sourceLayer; groupID = renderLayer->getID(); @@ -54,8 +75,12 @@ public: hasPattern = true; } else if (!constantPattern.to.empty()){ hasPattern = true; + auto patternPropertyValue = layer->as<PatternLayer>()->unevaluated.template get<typename PatternLayer::PatternProperty>().getValue(); + std::string lowZoom = PatternUtil::getPatternForZoom(patternPropertyValue, zoom - 1); + std::string highZoom = PatternUtil::getPatternForZoom(patternPropertyValue, zoom + 1); + patternDependencies.emplace(highZoom, ImageType::Pattern); patternDependencies.emplace(constantPattern.to, ImageType::Pattern); - patternDependencies.emplace(constantPattern.from, ImageType::Pattern); + patternDependencies.emplace(lowZoom, ImageType::Pattern); } } @@ -119,7 +144,6 @@ public: std::map<std::string, typename B::PossiblyEvaluatedPaintProperties> layerPaintProperties; const std::string bucketLeaderID; - private: const std::unique_ptr<GeometryTileLayer> sourceLayer; std::vector<PatternFeature> features; diff --git a/src/mbgl/renderer/data_driven_property_evaluator.hpp b/src/mbgl/renderer/data_driven_property_evaluator.hpp index d65ac3671..6e2cfbbd0 100644 --- a/src/mbgl/renderer/data_driven_property_evaluator.hpp +++ b/src/mbgl/renderer/data_driven_property_evaluator.hpp @@ -62,8 +62,10 @@ public: if (!expression.isFeatureConstant()) { return ResultType(expression); } else { - const T evaluated = expression.evaluate(floor(parameters.z)); - return ResultType(calculate(evaluated, evaluated, evaluated)); + const T min = expression.evaluate(floor(parameters.z - 1)); + const T mid = expression.evaluate(floor(parameters.z)); + const T max = expression.evaluate(floor(parameters.z + 1)); + return ResultType(calculate(min, mid, max)); } } diff --git a/src/mbgl/renderer/layers/render_line_layer.cpp b/src/mbgl/renderer/layers/render_line_layer.cpp index e499de8c4..9ecac3fcc 100644 --- a/src/mbgl/renderer/layers/render_line_layer.cpp +++ b/src/mbgl/renderer/layers/render_line_layer.cpp @@ -54,7 +54,6 @@ void RenderLineLayer::evaluate(const PropertyEvaluationParameters& parameters) { unevaluated.evaluate(parameters).concat(extra.evaluate(dashArrayParams))); crossfade = parameters.getCrossfadeParameters(); - passes = (evaluated.get<style::LineOpacity>().constantOr(1.0) > 0 && evaluated.get<style::LineColor>().constantOr(Color::black()).a > 0 && evaluated.get<style::LineWidth>().constantOr(1.0) > 0) @@ -145,7 +144,7 @@ void RenderLineLayer::render(PaintParameters& parameters, RenderSource*) { optional<ImagePosition> posA = geometryTile.getPattern(linePatternValue.from); optional<ImagePosition> posB = geometryTile.getPattern(linePatternValue.to); // if pattern property is constant and patterns aren't available, don't draw - if (!linePatternValue.to.empty() && (!posA || !posB)) continue; + if (!linePatternValue.to.empty() && (!posA && !posB)) continue; const auto& binders = bucket.paintPropertyBinders.at(getID()); binders.setPatternParameters(posA, posB, crossfade); diff --git a/src/mbgl/renderer/paint_property_binder.hpp b/src/mbgl/renderer/paint_property_binder.hpp index 3f801d09f..31abec68a 100644 --- a/src/mbgl/renderer/paint_property_binder.hpp +++ b/src/mbgl/renderer/paint_property_binder.hpp @@ -134,7 +134,7 @@ public: void upload(gl::Context&) override {} void setPatternParameters(const optional<ImagePosition>& posA, const optional<ImagePosition>& posB, CrossfadeParameters&) override { - if (!posA || !posB) { + if (!posA && !posB) { return; } else { constantPatternPositions = std::tuple<std::array<uint16_t, 4>, std::array<uint16_t, 4>> { posB->tlbr(), posA->tlbr() }; |