[core] Calculate hasPendingTransitions functionally rather than statefully
This commit is contained in:
@@ -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<style::BackgroundOpacity>() > 0 ? RenderPass::Translucent
|
||||
: RenderPass::None;
|
||||
}
|
||||
|
||||
bool RenderBackgroundLayer::hasTransition() const {
|
||||
return unevaluated.hasTransition();
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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&,
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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&,
|
||||
|
||||
@@ -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,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,
|
||||
|
||||
@@ -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&,
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 {};
|
||||
|
||||
|
||||
@@ -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&,
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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,10 +49,11 @@ 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;
|
||||
|
||||
return unevaluated.hasTransition();
|
||||
}
|
||||
|
||||
bool RenderSymbolLayer::hasTransition() const {
|
||||
return unevaluated.hasTransition();
|
||||
}
|
||||
|
||||
style::IconPaintProperties::Evaluated RenderSymbolLayer::iconPaintProperties() const {
|
||||
return style::IconPaintProperties::Evaluated {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -180,9 +180,9 @@ private:
|
||||
|
||||
UpdateBatch updateBatch;
|
||||
ZoomHistory zoomHistory;
|
||||
bool hasPendingTransitions = false;
|
||||
|
||||
void removeRenderLayer(const std::string& layerID);
|
||||
|
||||
public:
|
||||
bool loaded = false;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user