summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Firebaugh <john.firebaugh@gmail.com>2017-05-03 09:50:06 -0700
committerJohn Firebaugh <john.firebaugh@gmail.com>2017-05-03 10:41:04 -0700
commit88093bd708dccb1082bb624a6c27e5aa7688b77a (patch)
treea013645bb176d9f7d9008aa219c7e2b950af2836
parentd5f4d0f05fcb8490984649d78d6c026f87a77f4e (diff)
downloadqtlocation-mapboxgl-88093bd708dccb1082bb624a6c27e5aa7688b77a.tar.gz
[core] Calculate hasPendingTransitions functionally rather than statefully
-rw-r--r--src/mbgl/renderer/render_background_layer.cpp4
-rw-r--r--src/mbgl/renderer/render_background_layer.hpp3
-rw-r--r--src/mbgl/renderer/render_circle_layer.cpp4
-rw-r--r--src/mbgl/renderer/render_circle_layer.hpp3
-rw-r--r--src/mbgl/renderer/render_custom_layer.cpp5
-rw-r--r--src/mbgl/renderer/render_custom_layer.hpp3
-rw-r--r--src/mbgl/renderer/render_fill_extrusion_layer.cpp4
-rw-r--r--src/mbgl/renderer/render_fill_extrusion_layer.hpp3
-rw-r--r--src/mbgl/renderer/render_fill_layer.cpp5
-rw-r--r--src/mbgl/renderer/render_fill_layer.hpp3
-rw-r--r--src/mbgl/renderer/render_layer.hpp4
-rw-r--r--src/mbgl/renderer/render_line_layer.cpp5
-rw-r--r--src/mbgl/renderer/render_line_layer.hpp3
-rw-r--r--src/mbgl/renderer/render_raster_layer.cpp4
-rw-r--r--src/mbgl/renderer/render_raster_layer.hpp3
-rw-r--r--src/mbgl/renderer/render_symbol_layer.cpp5
-rw-r--r--src/mbgl/renderer/render_symbol_layer.hpp3
-rw-r--r--src/mbgl/style/style.cpp15
-rw-r--r--src/mbgl/style/style.hpp2
19 files changed, 58 insertions, 23 deletions
diff --git a/src/mbgl/renderer/render_background_layer.cpp b/src/mbgl/renderer/render_background_layer.cpp
index a6b4a5e36e..485d4b16c6 100644
--- a/src/mbgl/renderer/render_background_layer.cpp
+++ b/src/mbgl/renderer/render_background_layer.cpp
@@ -23,12 +23,14 @@ void RenderBackgroundLayer::cascade(const CascadeParameters &parameters) {
unevaluated = impl->cascading.cascade(parameters, std::move(unevaluated));
}
-bool RenderBackgroundLayer::evaluate(const PropertyEvaluationParameters &parameters) {
+void RenderBackgroundLayer::evaluate(const PropertyEvaluationParameters &parameters) {
evaluated = unevaluated.evaluate(parameters);
passes = evaluated.get<style::BackgroundOpacity>() > 0 ? RenderPass::Translucent
: RenderPass::None;
+}
+bool RenderBackgroundLayer::hasTransition() const {
return unevaluated.hasTransition();
}
diff --git a/src/mbgl/renderer/render_background_layer.hpp b/src/mbgl/renderer/render_background_layer.hpp
index 137980389c..b1f709953f 100644
--- a/src/mbgl/renderer/render_background_layer.hpp
+++ b/src/mbgl/renderer/render_background_layer.hpp
@@ -15,7 +15,8 @@ public:
std::unique_ptr<RenderLayer> clone() const override;
void cascade(const CascadeParameters&) override;
- bool evaluate(const PropertyEvaluationParameters&) override;
+ void evaluate(const PropertyEvaluationParameters&) override;
+ bool hasTransition() const override;
std::unique_ptr<Bucket> createBucket(const BucketParameters&, const std::vector<const RenderLayer*>&) const override;
diff --git a/src/mbgl/renderer/render_circle_layer.cpp b/src/mbgl/renderer/render_circle_layer.cpp
index 56832d53cb..f59c174dd3 100644
--- a/src/mbgl/renderer/render_circle_layer.cpp
+++ b/src/mbgl/renderer/render_circle_layer.cpp
@@ -24,7 +24,7 @@ void RenderCircleLayer::cascade(const CascadeParameters& parameters) {
unevaluated = impl->cascading.cascade(parameters, std::move(unevaluated));
}
-bool RenderCircleLayer::evaluate(const PropertyEvaluationParameters& parameters) {
+void RenderCircleLayer::evaluate(const PropertyEvaluationParameters& parameters) {
evaluated = unevaluated.evaluate(parameters);
passes = ((evaluated.get<style::CircleRadius>().constantOr(1) > 0 ||
@@ -34,7 +34,9 @@ bool RenderCircleLayer::evaluate(const PropertyEvaluationParameters& parameters)
&& (evaluated.get<style::CircleOpacity>().constantOr(1) > 0 ||
evaluated.get<style::CircleStrokeOpacity>().constantOr(1) > 0))
? RenderPass::Translucent : RenderPass::None;
+}
+bool RenderCircleLayer::hasTransition() const {
return unevaluated.hasTransition();
}
diff --git a/src/mbgl/renderer/render_circle_layer.hpp b/src/mbgl/renderer/render_circle_layer.hpp
index 8a2f73ec83..3b82b5c988 100644
--- a/src/mbgl/renderer/render_circle_layer.hpp
+++ b/src/mbgl/renderer/render_circle_layer.hpp
@@ -15,7 +15,8 @@ public:
std::unique_ptr<RenderLayer> clone() const override;
void cascade(const CascadeParameters&) override;
- bool evaluate(const PropertyEvaluationParameters&) override;
+ void evaluate(const PropertyEvaluationParameters&) override;
+ bool hasTransition() const override;
bool queryIntersectsFeature(
const GeometryCoordinates&,
diff --git a/src/mbgl/renderer/render_custom_layer.cpp b/src/mbgl/renderer/render_custom_layer.cpp
index d500d11f4a..66dd57b3d3 100644
--- a/src/mbgl/renderer/render_custom_layer.cpp
+++ b/src/mbgl/renderer/render_custom_layer.cpp
@@ -13,8 +13,11 @@ std::unique_ptr<RenderLayer> RenderCustomLayer::clone() const {
return std::make_unique<RenderCustomLayer>(*this);
}
-bool RenderCustomLayer::evaluate(const PropertyEvaluationParameters&) {
+void RenderCustomLayer::evaluate(const PropertyEvaluationParameters&) {
passes = RenderPass::Translucent;
+}
+
+bool RenderCustomLayer::hasTransition() const {
return false;
}
diff --git a/src/mbgl/renderer/render_custom_layer.hpp b/src/mbgl/renderer/render_custom_layer.hpp
index cb728fecb3..c3af6c77b2 100644
--- a/src/mbgl/renderer/render_custom_layer.hpp
+++ b/src/mbgl/renderer/render_custom_layer.hpp
@@ -14,7 +14,8 @@ public:
std::unique_ptr<RenderLayer> clone() const override;
void cascade(const CascadeParameters&) final {}
- bool evaluate(const PropertyEvaluationParameters&) final;
+ void evaluate(const PropertyEvaluationParameters&) override;
+ bool hasTransition() const override;
std::unique_ptr<Bucket> createBucket(const BucketParameters&, const std::vector<const RenderLayer*>&) const final;
diff --git a/src/mbgl/renderer/render_fill_extrusion_layer.cpp b/src/mbgl/renderer/render_fill_extrusion_layer.cpp
index 70ee74b56e..f6ba164d8c 100644
--- a/src/mbgl/renderer/render_fill_extrusion_layer.cpp
+++ b/src/mbgl/renderer/render_fill_extrusion_layer.cpp
@@ -24,12 +24,14 @@ void RenderFillExtrusionLayer::cascade(const CascadeParameters& parameters) {
unevaluated = impl->cascading.cascade(parameters, std::move(unevaluated));
}
-bool RenderFillExtrusionLayer::evaluate(const PropertyEvaluationParameters& parameters) {
+void RenderFillExtrusionLayer::evaluate(const PropertyEvaluationParameters& parameters) {
evaluated = unevaluated.evaluate(parameters);
passes = (evaluated.get<style::FillExtrusionOpacity>() > 0) ? RenderPass::Translucent
: RenderPass::None;
+}
+bool RenderFillExtrusionLayer::hasTransition() const {
return unevaluated.hasTransition();
}
diff --git a/src/mbgl/renderer/render_fill_extrusion_layer.hpp b/src/mbgl/renderer/render_fill_extrusion_layer.hpp
index b4fd1411f5..bd66d8e3b1 100644
--- a/src/mbgl/renderer/render_fill_extrusion_layer.hpp
+++ b/src/mbgl/renderer/render_fill_extrusion_layer.hpp
@@ -15,7 +15,8 @@ public:
std::unique_ptr<RenderLayer> clone() const override;
void cascade(const CascadeParameters&) override;
- bool evaluate(const PropertyEvaluationParameters&) override;
+ void evaluate(const PropertyEvaluationParameters&) override;
+ bool hasTransition() const override;
bool queryIntersectsFeature(
const GeometryCoordinates&,
diff --git a/src/mbgl/renderer/render_fill_layer.cpp b/src/mbgl/renderer/render_fill_layer.cpp
index 53c1ff3032..1af139cded 100644
--- a/src/mbgl/renderer/render_fill_layer.cpp
+++ b/src/mbgl/renderer/render_fill_layer.cpp
@@ -24,7 +24,7 @@ void RenderFillLayer::cascade(const CascadeParameters& parameters) {
unevaluated = impl->cascading.cascade(parameters, std::move(unevaluated));
}
-bool RenderFillLayer::evaluate(const PropertyEvaluationParameters& parameters) {
+void RenderFillLayer::evaluate(const PropertyEvaluationParameters& parameters) {
evaluated = unevaluated.evaluate(parameters);
if (unevaluated.get<style::FillOutlineColor>().isUndefined()) {
@@ -44,11 +44,12 @@ bool RenderFillLayer::evaluate(const PropertyEvaluationParameters& parameters) {
} else {
passes |= RenderPass::Opaque;
}
+}
+bool RenderFillLayer::hasTransition() const {
return unevaluated.hasTransition();
}
-
bool RenderFillLayer::queryIntersectsFeature(
const GeometryCoordinates& queryGeometry,
const GeometryTileFeature& feature,
diff --git a/src/mbgl/renderer/render_fill_layer.hpp b/src/mbgl/renderer/render_fill_layer.hpp
index 3a8de3622a..8080cf289b 100644
--- a/src/mbgl/renderer/render_fill_layer.hpp
+++ b/src/mbgl/renderer/render_fill_layer.hpp
@@ -15,7 +15,8 @@ public:
std::unique_ptr<RenderLayer> clone() const override;
void cascade(const CascadeParameters&) override;
- bool evaluate(const PropertyEvaluationParameters&) override;
+ void evaluate(const PropertyEvaluationParameters&) override;
+ bool hasTransition() const override;
bool queryIntersectsFeature(
const GeometryCoordinates&,
diff --git a/src/mbgl/renderer/render_layer.hpp b/src/mbgl/renderer/render_layer.hpp
index 003059005e..eea2ec1f61 100644
--- a/src/mbgl/renderer/render_layer.hpp
+++ b/src/mbgl/renderer/render_layer.hpp
@@ -33,8 +33,10 @@ public:
virtual void cascade(const CascadeParameters&) = 0;
// Fully evaluate cascaded paint properties based on a zoom level.
+ virtual void evaluate(const PropertyEvaluationParameters&) = 0;
+
// Returns true if any paint properties have active transitions.
- virtual bool evaluate(const PropertyEvaluationParameters&) = 0;
+ virtual bool hasTransition() const = 0;
// Check whether this layer is of the given subtype.
template <class T>
diff --git a/src/mbgl/renderer/render_line_layer.cpp b/src/mbgl/renderer/render_line_layer.cpp
index e5060af79e..06c2564516 100644
--- a/src/mbgl/renderer/render_line_layer.cpp
+++ b/src/mbgl/renderer/render_line_layer.cpp
@@ -24,7 +24,7 @@ void RenderLineLayer::cascade(const CascadeParameters& parameters) {
unevaluated = impl->cascading.cascade(parameters, std::move(unevaluated));
}
-bool RenderLineLayer::evaluate(const PropertyEvaluationParameters& parameters) {
+void RenderLineLayer::evaluate(const PropertyEvaluationParameters& parameters) {
// for scaling dasharrays
auto dashArrayParams = parameters;
dashArrayParams.z = std::floor(dashArrayParams.z);
@@ -36,9 +36,12 @@ bool RenderLineLayer::evaluate(const PropertyEvaluationParameters& parameters) {
&& evaluated.get<style::LineColor>().constantOr(Color::black()).a > 0
&& evaluated.get<style::LineWidth>() > 0)
? RenderPass::Translucent : RenderPass::None;
+}
+bool RenderLineLayer::hasTransition() const {
return unevaluated.hasTransition();
}
+
optional<GeometryCollection> offsetLine(const GeometryCollection& rings, const double offset) {
if (offset == 0) return {};
diff --git a/src/mbgl/renderer/render_line_layer.hpp b/src/mbgl/renderer/render_line_layer.hpp
index 15052deb38..6d6fecc227 100644
--- a/src/mbgl/renderer/render_line_layer.hpp
+++ b/src/mbgl/renderer/render_line_layer.hpp
@@ -15,7 +15,8 @@ public:
std::unique_ptr<RenderLayer> clone() const override;
void cascade(const CascadeParameters&) override;
- bool evaluate(const PropertyEvaluationParameters&) override;
+ void evaluate(const PropertyEvaluationParameters&) override;
+ bool hasTransition() const override;
bool queryIntersectsFeature(
const GeometryCoordinates&,
diff --git a/src/mbgl/renderer/render_raster_layer.cpp b/src/mbgl/renderer/render_raster_layer.cpp
index 0cfccc81b3..5e664e6f58 100644
--- a/src/mbgl/renderer/render_raster_layer.cpp
+++ b/src/mbgl/renderer/render_raster_layer.cpp
@@ -22,11 +22,13 @@ void RenderRasterLayer::cascade(const CascadeParameters& parameters) {
unevaluated = impl->cascading.cascade(parameters, std::move(unevaluated));
}
-bool RenderRasterLayer::evaluate(const PropertyEvaluationParameters& parameters) {
+void RenderRasterLayer::evaluate(const PropertyEvaluationParameters& parameters) {
evaluated = unevaluated.evaluate(parameters);
passes = evaluated.get<style::RasterOpacity>() > 0 ? RenderPass::Translucent : RenderPass::None;
+}
+bool RenderRasterLayer::hasTransition() const {
return unevaluated.hasTransition();
}
diff --git a/src/mbgl/renderer/render_raster_layer.hpp b/src/mbgl/renderer/render_raster_layer.hpp
index c6e38fa147..3ffeb8febf 100644
--- a/src/mbgl/renderer/render_raster_layer.hpp
+++ b/src/mbgl/renderer/render_raster_layer.hpp
@@ -15,7 +15,8 @@ public:
std::unique_ptr<RenderLayer> clone() const override;
void cascade(const CascadeParameters&) override;
- bool evaluate(const PropertyEvaluationParameters&) override;
+ void evaluate(const PropertyEvaluationParameters&) override;
+ bool hasTransition() const override;
std::unique_ptr<Bucket> createBucket(const BucketParameters&, const std::vector<const RenderLayer*>&) const override;
diff --git a/src/mbgl/renderer/render_symbol_layer.cpp b/src/mbgl/renderer/render_symbol_layer.cpp
index 0c3601aedf..30d769e032 100644
--- a/src/mbgl/renderer/render_symbol_layer.cpp
+++ b/src/mbgl/renderer/render_symbol_layer.cpp
@@ -38,7 +38,7 @@ void RenderSymbolLayer::cascade(const CascadeParameters& parameters) {
unevaluated = impl->cascading.cascade(parameters, std::move(unevaluated));
}
-bool RenderSymbolLayer::evaluate(const PropertyEvaluationParameters& parameters) {
+void RenderSymbolLayer::evaluate(const PropertyEvaluationParameters& parameters) {
evaluated = unevaluated.evaluate(parameters);
auto hasIconOpacity = evaluated.get<style::IconColor>().constantOr(Color::black()).a > 0 ||
@@ -49,11 +49,12 @@ bool RenderSymbolLayer::evaluate(const PropertyEvaluationParameters& parameters)
passes = ((evaluated.get<style::IconOpacity>().constantOr(1) > 0 && hasIconOpacity && iconSize > 0)
|| (evaluated.get<style::TextOpacity>().constantOr(1) > 0 && hasTextOpacity && textSize > 0))
? RenderPass::Translucent : RenderPass::None;
+}
+bool RenderSymbolLayer::hasTransition() const {
return unevaluated.hasTransition();
}
-
style::IconPaintProperties::Evaluated RenderSymbolLayer::iconPaintProperties() const {
return style::IconPaintProperties::Evaluated {
evaluated.get<style::IconOpacity>(),
diff --git a/src/mbgl/renderer/render_symbol_layer.hpp b/src/mbgl/renderer/render_symbol_layer.hpp
index b9c2cc3247..80ffd95a06 100644
--- a/src/mbgl/renderer/render_symbol_layer.hpp
+++ b/src/mbgl/renderer/render_symbol_layer.hpp
@@ -67,7 +67,8 @@ public:
std::unique_ptr<RenderLayer> clone() const override;
void cascade(const CascadeParameters&) override;
- bool evaluate(const PropertyEvaluationParameters&) override;
+ void evaluate(const PropertyEvaluationParameters&) override;
+ bool hasTransition() const override;
style::IconPaintProperties::Evaluated iconPaintProperties() const;
style::TextPaintProperties::Evaluated textPaintProperties() const;
diff --git a/src/mbgl/style/style.cpp b/src/mbgl/style/style.cpp
index 23536e0e3e..a3c7ce1ad1 100644
--- a/src/mbgl/style/style.cpp
+++ b/src/mbgl/style/style.cpp
@@ -387,9 +387,8 @@ void Style::recalculate(float z, const TimePoint& timePoint, MapMode mode) {
mode == MapMode::Continuous ? util::DEFAULT_FADE_DURATION : Duration::zero()
};
- hasPendingTransitions = transitioningLight.hasTransition();
for (const auto& layer : renderLayers) {
- hasPendingTransitions |= layer->evaluate(parameters);
+ layer->evaluate(parameters);
if (layer->needsRendering(zoomHistory.lastZoom)) {
if (RenderSource* renderSource = getRenderSource(layer->baseImpl.source)) {
@@ -443,7 +442,17 @@ RenderSource* Style::getRenderSource(const std::string& id) const {
}
bool Style::hasTransitions() const {
- return hasPendingTransitions;
+ if (transitioningLight.hasTransition()) {
+ return true;
+ }
+
+ for (const auto& layer : renderLayers) {
+ if (layer->hasTransition()) {
+ return true;
+ }
+ }
+
+ return false;
}
bool Style::isLoaded() const {
diff --git a/src/mbgl/style/style.hpp b/src/mbgl/style/style.hpp
index fe588c3ce5..c7528483e9 100644
--- a/src/mbgl/style/style.hpp
+++ b/src/mbgl/style/style.hpp
@@ -180,9 +180,9 @@ private:
UpdateBatch updateBatch;
ZoomHistory zoomHistory;
- bool hasPendingTransitions = false;
void removeRenderLayer(const std::string& layerID);
+
public:
bool loaded = false;
};