[core] Calculate hasPendingTransitions functionally rather than statefully

This commit is contained in:
John Firebaugh
2017-05-03 09:50:06 -07:00
parent d5f4d0f05f
commit 88093bd708
19 changed files with 60 additions and 25 deletions

View File

@@ -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();
}

View File

@@ -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;

View File

@@ -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();
}

View File

@@ -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&,

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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();
}

View File

@@ -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&,

View File

@@ -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,

View File

@@ -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&,

View File

@@ -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>

View File

@@ -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 {};

View File

@@ -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&,

View File

@@ -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();
}

View File

@@ -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;

View File

@@ -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 {

View File

@@ -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;

View File

@@ -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 {

View File

@@ -180,9 +180,9 @@ private:
UpdateBatch updateBatch;
ZoomHistory zoomHistory;
bool hasPendingTransitions = false;
void removeRenderLayer(const std::string& layerID);
public:
bool loaded = false;
};