From 88093bd708dccb1082bb624a6c27e5aa7688b77a Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Wed, 3 May 2017 09:50:06 -0700 Subject: [PATCH] [core] Calculate hasPendingTransitions functionally rather than statefully --- src/mbgl/renderer/render_background_layer.cpp | 4 +++- src/mbgl/renderer/render_background_layer.hpp | 3 ++- src/mbgl/renderer/render_circle_layer.cpp | 4 +++- src/mbgl/renderer/render_circle_layer.hpp | 3 ++- src/mbgl/renderer/render_custom_layer.cpp | 5 ++++- src/mbgl/renderer/render_custom_layer.hpp | 3 ++- src/mbgl/renderer/render_fill_extrusion_layer.cpp | 4 +++- src/mbgl/renderer/render_fill_extrusion_layer.hpp | 3 ++- src/mbgl/renderer/render_fill_layer.cpp | 7 ++++--- src/mbgl/renderer/render_fill_layer.hpp | 3 ++- src/mbgl/renderer/render_layer.hpp | 4 +++- src/mbgl/renderer/render_line_layer.cpp | 5 ++++- src/mbgl/renderer/render_line_layer.hpp | 3 ++- src/mbgl/renderer/render_raster_layer.cpp | 4 +++- src/mbgl/renderer/render_raster_layer.hpp | 3 ++- src/mbgl/renderer/render_symbol_layer.cpp | 7 ++++--- src/mbgl/renderer/render_symbol_layer.hpp | 3 ++- src/mbgl/style/style.cpp | 15 ++++++++++++--- src/mbgl/style/style.hpp | 2 +- 19 files changed, 60 insertions(+), 25 deletions(-) diff --git a/src/mbgl/renderer/render_background_layer.cpp b/src/mbgl/renderer/render_background_layer.cpp index a6b4a5e36..485d4b16c 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 ¶meters) { unevaluated = impl->cascading.cascade(parameters, std::move(unevaluated)); } -bool RenderBackgroundLayer::evaluate(const PropertyEvaluationParameters ¶meters) { +void RenderBackgroundLayer::evaluate(const PropertyEvaluationParameters ¶meters) { evaluated = unevaluated.evaluate(parameters); passes = evaluated.get() > 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 137980389..b1f709953 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 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 createBucket(const BucketParameters&, const std::vector&) const override; diff --git a/src/mbgl/renderer/render_circle_layer.cpp b/src/mbgl/renderer/render_circle_layer.cpp index 56832d53c..f59c174dd 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().constantOr(1) > 0 || @@ -34,7 +34,9 @@ bool RenderCircleLayer::evaluate(const PropertyEvaluationParameters& parameters) && (evaluated.get().constantOr(1) > 0 || evaluated.get().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 8a2f73ec8..3b82b5c98 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 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 d500d11f4..66dd57b3d 100644 --- a/src/mbgl/renderer/render_custom_layer.cpp +++ b/src/mbgl/renderer/render_custom_layer.cpp @@ -13,8 +13,11 @@ std::unique_ptr RenderCustomLayer::clone() const { return std::make_unique(*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 cb728fecb..c3af6c77b 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 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 createBucket(const BucketParameters&, const std::vector&) const final; diff --git a/src/mbgl/renderer/render_fill_extrusion_layer.cpp b/src/mbgl/renderer/render_fill_extrusion_layer.cpp index 70ee74b56..f6ba164d8 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() > 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 b4fd1411f..bd66d8e3b 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 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 53c1ff303..1af139cde 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().isUndefined()) { @@ -44,10 +44,11 @@ bool RenderFillLayer::evaluate(const PropertyEvaluationParameters& parameters) { } else { passes |= RenderPass::Opaque; } - - return unevaluated.hasTransition(); } +bool RenderFillLayer::hasTransition() const { + return unevaluated.hasTransition(); +} bool RenderFillLayer::queryIntersectsFeature( const GeometryCoordinates& queryGeometry, diff --git a/src/mbgl/renderer/render_fill_layer.hpp b/src/mbgl/renderer/render_fill_layer.hpp index 3a8de3622..8080cf289 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 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 003059005..eea2ec1f6 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 diff --git a/src/mbgl/renderer/render_line_layer.cpp b/src/mbgl/renderer/render_line_layer.cpp index e5060af79..06c256451 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().constantOr(Color::black()).a > 0 && evaluated.get() > 0) ? RenderPass::Translucent : RenderPass::None; +} +bool RenderLineLayer::hasTransition() const { return unevaluated.hasTransition(); } + optional 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 15052deb3..6d6fecc22 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 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 0cfccc81b..5e664e6f5 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() > 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 c6e38fa14..3ffeb8feb 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 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 createBucket(const BucketParameters&, const std::vector&) const override; diff --git a/src/mbgl/renderer/render_symbol_layer.cpp b/src/mbgl/renderer/render_symbol_layer.cpp index 0c3601aed..30d769e03 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().constantOr(Color::black()).a > 0 || @@ -49,10 +49,11 @@ bool RenderSymbolLayer::evaluate(const PropertyEvaluationParameters& parameters) passes = ((evaluated.get().constantOr(1) > 0 && hasIconOpacity && iconSize > 0) || (evaluated.get().constantOr(1) > 0 && hasTextOpacity && textSize > 0)) ? RenderPass::Translucent : RenderPass::None; - - return unevaluated.hasTransition(); } +bool RenderSymbolLayer::hasTransition() const { + return unevaluated.hasTransition(); +} style::IconPaintProperties::Evaluated RenderSymbolLayer::iconPaintProperties() const { return style::IconPaintProperties::Evaluated { diff --git a/src/mbgl/renderer/render_symbol_layer.hpp b/src/mbgl/renderer/render_symbol_layer.hpp index b9c2cc324..80ffd95a0 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 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 23536e0e3..a3c7ce1ad 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 fe588c3ce..c7528483e 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; };