1 #include <mbgl/renderer/cross_faded_property_evaluator.hpp>
2 #include <mbgl/util/chrono.hpp>
3
4 #include <cmath>
5
6 namespace mbgl {
7
8 template <typename T>
operator ()(const style::Undefined &) const9 Faded<T> CrossFadedPropertyEvaluator<T>::operator()(const style::Undefined&) const {
10 return calculate(defaultValue, defaultValue, defaultValue);
11 }
12
13 template <typename T>
operator ()(const T & constant) const14 Faded<T> CrossFadedPropertyEvaluator<T>::operator()(const T& constant) const {
15 return calculate(constant, constant, constant);
16 }
17
18 template <typename T>
operator ()(const style::PropertyExpression<T> & expression) const19 Faded<T> CrossFadedPropertyEvaluator<T>::operator()(const style::PropertyExpression<T>& expression) const {
20 return calculate(expression.evaluate(parameters.z - 1.0f),
21 expression.evaluate(parameters.z),
22 expression.evaluate(parameters.z + 1.0f));
23 }
24
25 template <typename T>
calculate(const T & min,const T & mid,const T & max) const26 Faded<T> CrossFadedPropertyEvaluator<T>::calculate(const T& min, const T& mid, const T& max) const {
27 const float z = parameters.z;
28 const float fraction = z - std::floor(z);
29 const std::chrono::duration<float> d = parameters.defaultFadeDuration;
30 const float t =
31 d != std::chrono::duration<float>::zero()
32 ? std::min((parameters.now - parameters.zoomHistory.lastIntegerZoomTime) / d, 1.0f)
33 : 1.0f;
34
35 return z > parameters.zoomHistory.lastIntegerZoom
36 ? Faded<T> { min, mid, 2.0f, 1.0f, fraction + (1.0f - fraction) * t }
37 : Faded<T> { max, mid, 0.5f, 1.0f, 1 - (1 - t) * fraction };
38 }
39
40 template class CrossFadedPropertyEvaluator<std::string>;
41 template class CrossFadedPropertyEvaluator<std::vector<float>>;
42
43 } // namespace mbgl
44