From 0665b645909994cb4b6037f4d5e61d4d7ff9d9ea Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Thu, 22 Oct 2015 17:23:32 -0700 Subject: [PATCH] [core] Introduce StyleCalculationParameters This makes subsequent changes to the the parameter list less intrusive. --- src/mbgl/layer/background_layer.cpp | 8 ++--- src/mbgl/layer/background_layer.hpp | 2 +- src/mbgl/layer/circle_layer.cpp | 14 ++++---- src/mbgl/layer/circle_layer.hpp | 2 +- src/mbgl/layer/fill_layer.cpp | 16 ++++----- src/mbgl/layer/fill_layer.hpp | 2 +- src/mbgl/layer/line_layer.cpp | 24 +++++++------ src/mbgl/layer/line_layer.hpp | 2 +- src/mbgl/layer/raster_layer.cpp | 16 ++++----- src/mbgl/layer/raster_layer.hpp | 2 +- src/mbgl/layer/symbol_layer.cpp | 34 +++++++++---------- src/mbgl/layer/symbol_layer.hpp | 2 +- src/mbgl/map/tile_worker.cpp | 5 +-- src/mbgl/map/tile_worker.hpp | 2 ++ .../style/piecewisefunction_properties.cpp | 11 +++--- .../style/piecewisefunction_properties.hpp | 5 +-- src/mbgl/style/property_evaluator.hpp | 12 +++---- src/mbgl/style/style.cpp | 4 ++- .../style/style_calculation_parameters.hpp | 26 ++++++++++++++ src/mbgl/style/style_layer.cpp | 6 ++-- src/mbgl/style/style_layer.hpp | 21 ++++++------ 21 files changed, 126 insertions(+), 90 deletions(-) create mode 100644 src/mbgl/style/style_calculation_parameters.hpp diff --git a/src/mbgl/layer/background_layer.cpp b/src/mbgl/layer/background_layer.cpp index c97124feb..271c5479e 100644 --- a/src/mbgl/layer/background_layer.cpp +++ b/src/mbgl/layer/background_layer.cpp @@ -2,10 +2,10 @@ namespace mbgl { -RenderPass BackgroundLayer::applyStyleProperties(const float z, const TimePoint& now, const ZoomHistory& zoomHistory) { - applyTransitionedStyleProperty(PropertyKey::BackgroundOpacity, properties.opacity, z, now, zoomHistory); - applyTransitionedStyleProperty(PropertyKey::BackgroundColor, properties.color, z, now, zoomHistory); - applyStyleProperty(PropertyKey::BackgroundImage, properties.image, z, now, zoomHistory); +RenderPass BackgroundLayer::applyStyleProperties(const StyleCalculationParameters& parameters) { + applyTransitionedStyleProperty(PropertyKey::BackgroundOpacity, properties.opacity, parameters); + applyTransitionedStyleProperty(PropertyKey::BackgroundColor, properties.color, parameters); + applyStyleProperty(PropertyKey::BackgroundImage, properties.image, parameters); return properties.isVisible() ? RenderPass::Translucent : RenderPass::None; } diff --git a/src/mbgl/layer/background_layer.hpp b/src/mbgl/layer/background_layer.hpp index 817c23423..c5d211c9c 100644 --- a/src/mbgl/layer/background_layer.hpp +++ b/src/mbgl/layer/background_layer.hpp @@ -8,7 +8,7 @@ namespace mbgl { class BackgroundLayer : public StyleLayer { public: - RenderPass applyStyleProperties(float z, const TimePoint& now, const ZoomHistory&) override; + RenderPass applyStyleProperties(const StyleCalculationParameters&) override; BackgroundPaintProperties properties; }; diff --git a/src/mbgl/layer/circle_layer.cpp b/src/mbgl/layer/circle_layer.cpp index 384d56dfb..75044b6a4 100644 --- a/src/mbgl/layer/circle_layer.cpp +++ b/src/mbgl/layer/circle_layer.cpp @@ -2,13 +2,13 @@ namespace mbgl { -RenderPass CircleLayer::applyStyleProperties(const float z, const TimePoint& now, const ZoomHistory& zoomHistory) { - applyTransitionedStyleProperty(PropertyKey::CircleRadius, properties.radius, z, now, zoomHistory); - applyTransitionedStyleProperty(PropertyKey::CircleColor, properties.color, z, now, zoomHistory); - applyTransitionedStyleProperty(PropertyKey::CircleOpacity, properties.opacity, z, now, zoomHistory); - applyTransitionedStyleProperty(PropertyKey::CircleTranslate, properties.translate, z, now, zoomHistory); - applyStyleProperty(PropertyKey::CircleTranslateAnchor, properties.translateAnchor, z, now, zoomHistory); - applyTransitionedStyleProperty(PropertyKey::CircleBlur, properties.blur, z, now, zoomHistory); +RenderPass CircleLayer::applyStyleProperties(const StyleCalculationParameters& parameters) { + applyTransitionedStyleProperty(PropertyKey::CircleRadius, properties.radius, parameters); + applyTransitionedStyleProperty(PropertyKey::CircleColor, properties.color, parameters); + applyTransitionedStyleProperty(PropertyKey::CircleOpacity, properties.opacity, parameters); + applyTransitionedStyleProperty(PropertyKey::CircleTranslate, properties.translate, parameters); + applyStyleProperty(PropertyKey::CircleTranslateAnchor, properties.translateAnchor, parameters); + applyTransitionedStyleProperty(PropertyKey::CircleBlur, properties.blur, parameters); return properties.isVisible() ? RenderPass::Translucent : RenderPass::None; } diff --git a/src/mbgl/layer/circle_layer.hpp b/src/mbgl/layer/circle_layer.hpp index f3a1cf973..78a4ee7b7 100644 --- a/src/mbgl/layer/circle_layer.hpp +++ b/src/mbgl/layer/circle_layer.hpp @@ -8,7 +8,7 @@ namespace mbgl { class CircleLayer : public StyleLayer { public: - RenderPass applyStyleProperties(float z, const TimePoint& now, const ZoomHistory&) override; + RenderPass applyStyleProperties(const StyleCalculationParameters&) override; CirclePaintProperties properties; }; diff --git a/src/mbgl/layer/fill_layer.cpp b/src/mbgl/layer/fill_layer.cpp index 7a45774c2..792fd947b 100644 --- a/src/mbgl/layer/fill_layer.cpp +++ b/src/mbgl/layer/fill_layer.cpp @@ -2,14 +2,14 @@ namespace mbgl { -RenderPass FillLayer::applyStyleProperties(const float z, const TimePoint& now, const ZoomHistory& zoomHistory) { - applyStyleProperty(PropertyKey::FillAntialias, properties.antialias, z, now, zoomHistory); - applyTransitionedStyleProperty(PropertyKey::FillOpacity, properties.opacity, z, now, zoomHistory); - applyTransitionedStyleProperty(PropertyKey::FillColor, properties.fill_color, z, now, zoomHistory); - applyTransitionedStyleProperty(PropertyKey::FillOutlineColor, properties.stroke_color, z, now, zoomHistory); - applyTransitionedStyleProperty(PropertyKey::FillTranslate, properties.translate, z, now, zoomHistory); - applyStyleProperty(PropertyKey::FillTranslateAnchor, properties.translateAnchor, z, now, zoomHistory); - applyStyleProperty(PropertyKey::FillImage, properties.image, z, now, zoomHistory); +RenderPass FillLayer::applyStyleProperties(const StyleCalculationParameters& parameters) { + applyStyleProperty(PropertyKey::FillAntialias, properties.antialias, parameters); + applyTransitionedStyleProperty(PropertyKey::FillOpacity, properties.opacity, parameters); + applyTransitionedStyleProperty(PropertyKey::FillColor, properties.fill_color, parameters); + applyTransitionedStyleProperty(PropertyKey::FillOutlineColor, properties.stroke_color, parameters); + applyTransitionedStyleProperty(PropertyKey::FillTranslate, properties.translate, parameters); + applyStyleProperty(PropertyKey::FillTranslateAnchor, properties.translateAnchor, parameters); + applyStyleProperty(PropertyKey::FillImage, properties.image, parameters); RenderPass result = RenderPass::None; diff --git a/src/mbgl/layer/fill_layer.hpp b/src/mbgl/layer/fill_layer.hpp index d8e8e6d37..6538d369d 100644 --- a/src/mbgl/layer/fill_layer.hpp +++ b/src/mbgl/layer/fill_layer.hpp @@ -8,7 +8,7 @@ namespace mbgl { class FillLayer : public StyleLayer { public: - RenderPass applyStyleProperties(float z, const TimePoint& now, const ZoomHistory&) override; + RenderPass applyStyleProperties(const StyleCalculationParameters&) override; FillPaintProperties properties; }; diff --git a/src/mbgl/layer/line_layer.cpp b/src/mbgl/layer/line_layer.cpp index 340f8fe7f..9e520da6d 100644 --- a/src/mbgl/layer/line_layer.cpp +++ b/src/mbgl/layer/line_layer.cpp @@ -2,19 +2,21 @@ namespace mbgl { -RenderPass LineLayer::applyStyleProperties(const float z, const TimePoint& now, const ZoomHistory& zoomHistory) { - applyTransitionedStyleProperty(PropertyKey::LineOpacity, properties.opacity, z, now, zoomHistory); - applyTransitionedStyleProperty(PropertyKey::LineColor, properties.color, z, now, zoomHistory); - applyTransitionedStyleProperty(PropertyKey::LineTranslate, properties.translate, z, now, zoomHistory); - applyStyleProperty(PropertyKey::LineTranslateAnchor, properties.translateAnchor, z, now, zoomHistory); - applyTransitionedStyleProperty(PropertyKey::LineWidth, properties.width, z, now, zoomHistory); - applyTransitionedStyleProperty(PropertyKey::LineGapWidth, properties.gap_width, z, now, zoomHistory); - applyTransitionedStyleProperty(PropertyKey::LineBlur, properties.blur, z, now, zoomHistory); - applyStyleProperty(PropertyKey::LineDashArray, properties.dash_array, z, now, zoomHistory); - applyStyleProperty(PropertyKey::LineImage, properties.image, z, now, zoomHistory); +RenderPass LineLayer::applyStyleProperties(const StyleCalculationParameters& parameters) { + applyTransitionedStyleProperty(PropertyKey::LineOpacity, properties.opacity, parameters); + applyTransitionedStyleProperty(PropertyKey::LineColor, properties.color, parameters); + applyTransitionedStyleProperty(PropertyKey::LineTranslate, properties.translate, parameters); + applyStyleProperty(PropertyKey::LineTranslateAnchor, properties.translateAnchor, parameters); + applyTransitionedStyleProperty(PropertyKey::LineWidth, properties.width, parameters); + applyTransitionedStyleProperty(PropertyKey::LineGapWidth, properties.gap_width, parameters); + applyTransitionedStyleProperty(PropertyKey::LineBlur, properties.blur, parameters); + applyStyleProperty(PropertyKey::LineDashArray, properties.dash_array, parameters); + applyStyleProperty(PropertyKey::LineImage, properties.image, parameters); // for scaling dasharrays - applyStyleProperty(PropertyKey::LineWidth, properties.dash_line_width, std::floor(z), now, zoomHistory); + StyleCalculationParameters dashArrayParams = parameters; + dashArrayParams.z = std::floor(dashArrayParams.z); + applyStyleProperty(PropertyKey::LineWidth, properties.dash_line_width, dashArrayParams); return properties.isVisible() ? RenderPass::Translucent : RenderPass::None; } diff --git a/src/mbgl/layer/line_layer.hpp b/src/mbgl/layer/line_layer.hpp index 9f59768c1..f5125bcd8 100644 --- a/src/mbgl/layer/line_layer.hpp +++ b/src/mbgl/layer/line_layer.hpp @@ -8,7 +8,7 @@ namespace mbgl { class LineLayer : public StyleLayer { public: - RenderPass applyStyleProperties(float z, const TimePoint& now, const ZoomHistory&) override; + RenderPass applyStyleProperties(const StyleCalculationParameters&) override; LinePaintProperties properties; }; diff --git a/src/mbgl/layer/raster_layer.cpp b/src/mbgl/layer/raster_layer.cpp index 2831483b8..2087f4db7 100644 --- a/src/mbgl/layer/raster_layer.cpp +++ b/src/mbgl/layer/raster_layer.cpp @@ -2,14 +2,14 @@ namespace mbgl { -RenderPass RasterLayer::applyStyleProperties(const float z, const TimePoint& now, const ZoomHistory& zoomHistory) { - applyTransitionedStyleProperty(PropertyKey::RasterOpacity, properties.opacity, z, now, zoomHistory); - applyTransitionedStyleProperty(PropertyKey::RasterHueRotate, properties.hue_rotate, z, now, zoomHistory); - applyTransitionedStyleProperty(PropertyKey::RasterBrightnessLow, properties.brightness[0], z, now, zoomHistory); - applyTransitionedStyleProperty(PropertyKey::RasterBrightnessHigh, properties.brightness[1], z, now, zoomHistory); - applyTransitionedStyleProperty(PropertyKey::RasterSaturation, properties.saturation, z, now, zoomHistory); - applyTransitionedStyleProperty(PropertyKey::RasterContrast, properties.contrast, z, now, zoomHistory); - applyTransitionedStyleProperty(PropertyKey::RasterFade, properties.fade, z, now, zoomHistory); +RenderPass RasterLayer::applyStyleProperties(const StyleCalculationParameters& parameters) { + applyTransitionedStyleProperty(PropertyKey::RasterOpacity, properties.opacity, parameters); + applyTransitionedStyleProperty(PropertyKey::RasterHueRotate, properties.hue_rotate, parameters); + applyTransitionedStyleProperty(PropertyKey::RasterBrightnessLow, properties.brightness[0], parameters); + applyTransitionedStyleProperty(PropertyKey::RasterBrightnessHigh, properties.brightness[1], parameters); + applyTransitionedStyleProperty(PropertyKey::RasterSaturation, properties.saturation, parameters); + applyTransitionedStyleProperty(PropertyKey::RasterContrast, properties.contrast, parameters); + applyTransitionedStyleProperty(PropertyKey::RasterFade, properties.fade, parameters); return properties.isVisible() ? RenderPass::Translucent : RenderPass::None; } diff --git a/src/mbgl/layer/raster_layer.hpp b/src/mbgl/layer/raster_layer.hpp index fc57a9171..b11c82945 100644 --- a/src/mbgl/layer/raster_layer.hpp +++ b/src/mbgl/layer/raster_layer.hpp @@ -8,7 +8,7 @@ namespace mbgl { class RasterLayer : public StyleLayer { public: - RenderPass applyStyleProperties(float z, const TimePoint& now, const ZoomHistory&) override; + RenderPass applyStyleProperties(const StyleCalculationParameters&) override; RasterPaintProperties properties; }; diff --git a/src/mbgl/layer/symbol_layer.cpp b/src/mbgl/layer/symbol_layer.cpp index bdfa577ce..08a994d17 100644 --- a/src/mbgl/layer/symbol_layer.cpp +++ b/src/mbgl/layer/symbol_layer.cpp @@ -4,32 +4,32 @@ namespace mbgl { -RenderPass SymbolLayer::applyStyleProperties(const float z, const TimePoint& now, const ZoomHistory& zoomHistory) { - applyTransitionedStyleProperty(PropertyKey::IconOpacity, properties.icon.opacity, z, now, zoomHistory); - applyTransitionedStyleProperty(PropertyKey::IconColor, properties.icon.color, z, now, zoomHistory); - applyTransitionedStyleProperty(PropertyKey::IconHaloColor, properties.icon.halo_color, z, now, zoomHistory); - applyTransitionedStyleProperty(PropertyKey::IconHaloWidth, properties.icon.halo_width, z, now, zoomHistory); - applyTransitionedStyleProperty(PropertyKey::IconHaloBlur, properties.icon.halo_blur, z, now, zoomHistory); - applyTransitionedStyleProperty(PropertyKey::IconTranslate, properties.icon.translate, z, now, zoomHistory); - applyStyleProperty(PropertyKey::IconTranslateAnchor, properties.icon.translate_anchor, z, now, zoomHistory); +RenderPass SymbolLayer::applyStyleProperties(const StyleCalculationParameters& parameters) { + applyTransitionedStyleProperty(PropertyKey::IconOpacity, properties.icon.opacity, parameters); + applyTransitionedStyleProperty(PropertyKey::IconColor, properties.icon.color, parameters); + applyTransitionedStyleProperty(PropertyKey::IconHaloColor, properties.icon.halo_color, parameters); + applyTransitionedStyleProperty(PropertyKey::IconHaloWidth, properties.icon.halo_width, parameters); + applyTransitionedStyleProperty(PropertyKey::IconHaloBlur, properties.icon.halo_blur, parameters); + applyTransitionedStyleProperty(PropertyKey::IconTranslate, properties.icon.translate, parameters); + applyStyleProperty(PropertyKey::IconTranslateAnchor, properties.icon.translate_anchor, parameters); - applyTransitionedStyleProperty(PropertyKey::TextOpacity, properties.text.opacity, z, now, zoomHistory); - applyTransitionedStyleProperty(PropertyKey::TextColor, properties.text.color, z, now, zoomHistory); - applyTransitionedStyleProperty(PropertyKey::TextHaloColor, properties.text.halo_color, z, now, zoomHistory); - applyTransitionedStyleProperty(PropertyKey::TextHaloWidth, properties.text.halo_width, z, now, zoomHistory); - applyTransitionedStyleProperty(PropertyKey::TextHaloBlur, properties.text.halo_blur, z, now, zoomHistory); - applyTransitionedStyleProperty(PropertyKey::TextTranslate, properties.text.translate, z, now, zoomHistory); - applyStyleProperty(PropertyKey::TextTranslateAnchor, properties.text.translate_anchor, z, now, zoomHistory); + applyTransitionedStyleProperty(PropertyKey::TextOpacity, properties.text.opacity, parameters); + applyTransitionedStyleProperty(PropertyKey::TextColor, properties.text.color, parameters); + applyTransitionedStyleProperty(PropertyKey::TextHaloColor, properties.text.halo_color, parameters); + applyTransitionedStyleProperty(PropertyKey::TextHaloWidth, properties.text.halo_width, parameters); + applyTransitionedStyleProperty(PropertyKey::TextHaloBlur, properties.text.halo_blur, parameters); + applyTransitionedStyleProperty(PropertyKey::TextTranslate, properties.text.translate, parameters); + applyStyleProperty(PropertyKey::TextTranslateAnchor, properties.text.translate_anchor, parameters); // text-size and icon-size are layout properties but they also need to be evaluated as paint properties: auto it = bucket->layout.properties.find(PropertyKey::IconSize); if (it != bucket->layout.properties.end()) { - const PropertyEvaluator evaluator(z, zoomHistory); + const PropertyEvaluator evaluator(parameters); properties.icon.size = mapbox::util::apply_visitor(evaluator, it->second); } it = bucket->layout.properties.find(PropertyKey::TextSize); if (it != bucket->layout.properties.end()) { - const PropertyEvaluator evaluator(z, zoomHistory); + const PropertyEvaluator evaluator(parameters); properties.text.size = mapbox::util::apply_visitor(evaluator, it->second); } diff --git a/src/mbgl/layer/symbol_layer.hpp b/src/mbgl/layer/symbol_layer.hpp index ee25b00be..abc0f2109 100644 --- a/src/mbgl/layer/symbol_layer.hpp +++ b/src/mbgl/layer/symbol_layer.hpp @@ -8,7 +8,7 @@ namespace mbgl { class SymbolLayer : public StyleLayer { public: - RenderPass applyStyleProperties(float z, const TimePoint& now, const ZoomHistory&) override; + RenderPass applyStyleProperties(const StyleCalculationParameters&) override; SymbolPaintProperties properties; }; diff --git a/src/mbgl/map/tile_worker.cpp b/src/mbgl/map/tile_worker.cpp index e1f93dc03..45afaee49 100644 --- a/src/mbgl/map/tile_worker.cpp +++ b/src/mbgl/map/tile_worker.cpp @@ -22,6 +22,7 @@ TileWorker::TileWorker(TileID id_, : layers(std::move(layers_)), id(id_), sourceID(sourceID_), + parameters(id.z), style(style_), state(state_), collisionTile(std::move(collision_)) { @@ -65,10 +66,10 @@ void TileWorker::redoPlacement(float angle, float pitch, bool collisionDebug) { } template -void applyLayoutProperty(PropertyKey key, const ClassProperties &classProperties, T &target, const float z) { +void applyLayoutProperty(PropertyKey key, const ClassProperties &classProperties, T &target, const StyleCalculationParameters& parameters) { auto it = classProperties.properties.find(key); if (it != classProperties.properties.end()) { - const PropertyEvaluator evaluator(z); + const PropertyEvaluator evaluator(parameters); target = mapbox::util::apply_visitor(evaluator, it->second); } } diff --git a/src/mbgl/map/tile_worker.hpp b/src/mbgl/map/tile_worker.hpp index 53c5c9095..689367c05 100644 --- a/src/mbgl/map/tile_worker.hpp +++ b/src/mbgl/map/tile_worker.hpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -57,6 +58,7 @@ private: const TileID id; const std::string sourceID; + const StyleCalculationParameters parameters; Style& style; const std::atomic& state; diff --git a/src/mbgl/style/piecewisefunction_properties.cpp b/src/mbgl/style/piecewisefunction_properties.cpp index 492475e2b..4efcba663 100644 --- a/src/mbgl/style/piecewisefunction_properties.cpp +++ b/src/mbgl/style/piecewisefunction_properties.cpp @@ -16,16 +16,17 @@ size_t getBiggestStopLessThan(std::vector> stops, float z) { } template -T PiecewiseConstantFunction::evaluate(float z, const ZoomHistory &zh) const { +T PiecewiseConstantFunction::evaluate(const StyleCalculationParameters& parameters) const { T result; + float z = parameters.z; float fraction = std::fmod(z, 1.0f); - float t = std::min((Clock::now() - zh.lastIntegerZoomTime) / duration, 1.0f); + float t = std::min((Clock::now() - parameters.zoomHistory.lastIntegerZoomTime) / duration, 1.0f); float fromScale = 1.0f; float toScale = 1.0f; size_t from, to; - if (z > zh.lastIntegerZoom) { + if (z > parameters.zoomHistory.lastIntegerZoom) { result.t = fraction + (1.0f - fraction) * t; from = getBiggestStopLessThan(values, z - 1.0f); to = getBiggestStopLessThan(values, z); @@ -46,7 +47,7 @@ T PiecewiseConstantFunction::evaluate(float z, const ZoomHistory &zh) const { return result; } -template Faded PiecewiseConstantFunction>::evaluate(float z, const ZoomHistory &zoomHistory) const; -template Faded> PiecewiseConstantFunction>>::evaluate(float z, const ZoomHistory &zoomHistory) const; +template Faded PiecewiseConstantFunction>::evaluate(const StyleCalculationParameters&) const; +template Faded> PiecewiseConstantFunction>>::evaluate(const StyleCalculationParameters&) const; } diff --git a/src/mbgl/style/piecewisefunction_properties.hpp b/src/mbgl/style/piecewisefunction_properties.hpp index f05ee6864..8ea826fc1 100644 --- a/src/mbgl/style/piecewisefunction_properties.hpp +++ b/src/mbgl/style/piecewisefunction_properties.hpp @@ -1,7 +1,7 @@ #ifndef MBGL_STYLE_FADEDFUNCTION_PROPERTIES #define MBGL_STYLE_FADEDFUNCTION_PROPERTIES -#include +#include #include @@ -11,7 +11,8 @@ template struct PiecewiseConstantFunction { inline PiecewiseConstantFunction(const std::vector> &values_, std::chrono::duration duration_) : values(values_), duration(duration_) {} inline PiecewiseConstantFunction(T &value, std::chrono::duration duration_) : values({{ 0, value }}), duration(duration_) {} - T evaluate(float z, const ZoomHistory &zoomHistory) const; + + T evaluate(const StyleCalculationParameters&) const; private: const std::vector> values; diff --git a/src/mbgl/style/property_evaluator.hpp b/src/mbgl/style/property_evaluator.hpp index 7856c90f4..cd05484dd 100644 --- a/src/mbgl/style/property_evaluator.hpp +++ b/src/mbgl/style/property_evaluator.hpp @@ -4,6 +4,7 @@ #include #include #include +#include namespace mbgl { @@ -14,8 +15,8 @@ class PropertyEvaluator { public: typedef T result_type; - PropertyEvaluator(float z_) : z(z_), zoomHistory() {} - PropertyEvaluator(float z_, const ZoomHistory& zoomHistory_) : z(z_), zoomHistory(zoomHistory_) {} + PropertyEvaluator(const StyleCalculationParameters& parameters_) + : parameters(parameters_) {} template ::value, int>::type = 0> T operator()(const P &value) const { @@ -23,11 +24,11 @@ public: } T operator()(const Function& value) const { - return mapbox::util::apply_visitor(FunctionEvaluator(z), value); + return mapbox::util::apply_visitor(FunctionEvaluator(parameters.z), value); } T operator()(const PiecewiseConstantFunction& value) const { - return value.evaluate(z, zoomHistory); + return value.evaluate(parameters); } template ::value, int>::type = 0> @@ -36,8 +37,7 @@ public: } private: - const float z; - ZoomHistory zoomHistory; + StyleCalculationParameters parameters; }; } diff --git a/src/mbgl/style/style.cpp b/src/mbgl/style/style.cpp index 8859475e4..a1cd1bcbf 100644 --- a/src/mbgl/style/style.cpp +++ b/src/mbgl/style/style.cpp @@ -136,8 +136,10 @@ void Style::recalculate(float z) { zoomHistory.update(z, data.getAnimationTime()); + StyleCalculationParameters parameters(z, data.getAnimationTime(), zoomHistory); + for (const auto& layer : layers) { - layer->updateProperties(z, data.getAnimationTime(), zoomHistory); + layer->updateProperties(parameters); if (!layer->bucket) { continue; } diff --git a/src/mbgl/style/style_calculation_parameters.hpp b/src/mbgl/style/style_calculation_parameters.hpp new file mode 100644 index 000000000..e25a5c590 --- /dev/null +++ b/src/mbgl/style/style_calculation_parameters.hpp @@ -0,0 +1,26 @@ +#ifndef STYLE_CALCULATION_PARAMETERS +#define STYLE_CALCULATION_PARAMETERS + +#include +#include + +namespace mbgl { + +class StyleCalculationParameters { +public: + StyleCalculationParameters(float z_) + : z(z_) {} + + StyleCalculationParameters(float z_, const TimePoint& now_, const ZoomHistory& zoomHistory_) + : z(z_), + now(now_), + zoomHistory(zoomHistory_) {} + + float z; + TimePoint now; + ZoomHistory zoomHistory; +}; + +} + +#endif diff --git a/src/mbgl/style/style_layer.cpp b/src/mbgl/style/style_layer.cpp index 61de61217..e033287ae 100644 --- a/src/mbgl/style/style_layer.cpp +++ b/src/mbgl/style/style_layer.cpp @@ -118,14 +118,14 @@ void StyleLayer::applyClassProperties(const ClassID class_id, } } -void StyleLayer::updateProperties(float z, const TimePoint& now, ZoomHistory &zoomHistory) { - cleanupAppliedStyleProperties(now); +void StyleLayer::updateProperties(const StyleCalculationParameters& parameters) { + cleanupAppliedStyleProperties(parameters.now); // Clear the pending transitions flag upon each update. hasPendingTransitions = false; // Update the render passes when this layer is visible. - passes = applyStyleProperties(z, now, zoomHistory); + passes = applyStyleProperties(parameters); } bool StyleLayer::hasTransitions() const { diff --git a/src/mbgl/style/style_layer.hpp b/src/mbgl/style/style_layer.hpp index febfb27fe..b6ff6ae8f 100644 --- a/src/mbgl/style/style_layer.hpp +++ b/src/mbgl/style/style_layer.hpp @@ -6,6 +6,7 @@ #include #include #include +#include #include @@ -34,7 +35,7 @@ public: // Updates the StyleProperties information in this layer by evaluating all // pending transitions and applied classes in order. - void updateProperties(float z, const TimePoint& now, ZoomHistory &zoomHistory); + void updateProperties(const StyleCalculationParameters&); // Sets the list of classes and creates transitions to the currently applied values. void setClasses(const std::vector &class_names, const TimePoint& now, @@ -58,14 +59,14 @@ public: protected: // TODO: extract template - void applyStyleProperty(PropertyKey key, T& target, const float z, const TimePoint& now, const ZoomHistory& zoomHistory) { + void applyStyleProperty(PropertyKey key, T& target, const StyleCalculationParameters& parameters) { auto it = appliedStyle.find(key); if (it != appliedStyle.end()) { AppliedClassPropertyValues &applied = it->second; // Iterate through all properties that we need to apply in order. - const PropertyEvaluator evaluator(z, zoomHistory); + const PropertyEvaluator evaluator(parameters); for (auto& property : applied.propertyValues) { - if (now >= property.begin) { + if (parameters.now >= property.begin) { // We overwrite the current property with the new value. target = mapbox::util::apply_visitor(evaluator, property.value); } else { @@ -76,19 +77,19 @@ protected: } template - void applyTransitionedStyleProperty(PropertyKey key, T& target, const float z, const TimePoint& now, const ZoomHistory& zoomHistory) { + void applyTransitionedStyleProperty(PropertyKey key, T& target, const StyleCalculationParameters& parameters) { auto it = appliedStyle.find(key); if (it != appliedStyle.end()) { AppliedClassPropertyValues &applied = it->second; // Iterate through all properties that we need to apply in order. - const PropertyEvaluator evaluator(z, zoomHistory); + const PropertyEvaluator evaluator(parameters); for (auto& property : applied.propertyValues) { - if (now >= property.end) { + if (parameters.now >= property.end) { // We overwrite the current property with the new value. target = mapbox::util::apply_visitor(evaluator, property.value); - } else if (now >= property.begin) { + } else if (parameters.now >= property.begin) { // We overwrite the current property partially with the new value. - float progress = std::chrono::duration(now - property.begin) / (property.end - property.begin); + float progress = std::chrono::duration(parameters.now - property.begin) / (property.end - property.begin); target = util::interpolate(target, mapbox::util::apply_visitor(evaluator, property.value), progress); hasPendingTransitions = true; } else { @@ -105,7 +106,7 @@ private: // Sets the properties of this object by evaluating all pending transitions and // aplied classes in order. - virtual RenderPass applyStyleProperties(float z, const TimePoint& now, const ZoomHistory&) = 0; + virtual RenderPass applyStyleProperties(const StyleCalculationParameters&) = 0; // Removes all expired style transitions. void cleanupAppliedStyleProperties(const TimePoint& now);