summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMolly Lloyd <molly@mapbox.com>2018-10-09 09:43:21 -0700
committerMolly Lloyd <molly@mapbox.com>2018-10-10 17:08:54 -0700
commitbfb099d32a38492364ff97cdcef6e190419c55b5 (patch)
treeeeef4ee2a09729875af3d9fb6a80364191adaa3c
parentbd3683d32f816a5bb2cf442f2d9d5b5057f62e39 (diff)
downloadqtlocation-mapboxgl-upstream/line-crash-fix.tar.gz
[core] fix zoom function evaluation for CrossFadedDDPupstream/line-crash-fix
-rw-r--r--src/mbgl/layout/pattern_layout.hpp30
-rw-r--r--src/mbgl/renderer/data_driven_property_evaluator.hpp6
-rw-r--r--src/mbgl/renderer/layers/render_line_layer.cpp3
-rw-r--r--src/mbgl/renderer/paint_property_binder.hpp2
4 files changed, 33 insertions, 8 deletions
diff --git a/src/mbgl/layout/pattern_layout.hpp b/src/mbgl/layout/pattern_layout.hpp
index 0ffac36b75..86d34d3074 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 d65ac36713..6e2cfbbd07 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 e499de8c4e..9ecac3fcc8 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 3f801d09ff..31abec68a9 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() };