diff options
Diffstat (limited to 'include/mbgl/util/interpolate.hpp')
-rw-r--r-- | include/mbgl/util/interpolate.hpp | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/include/mbgl/util/interpolate.hpp b/include/mbgl/util/interpolate.hpp index aff730a0a2..566f2b0a6b 100644 --- a/include/mbgl/util/interpolate.hpp +++ b/include/mbgl/util/interpolate.hpp @@ -1,9 +1,10 @@ #pragma once +#include <mbgl/style/expression/value.hpp> +#include <mbgl/style/position.hpp> +#include <mbgl/style/rotation.hpp> #include <mbgl/util/color.hpp> #include <mbgl/util/range.hpp> -#include <mbgl/style/position.hpp> -#include <mbgl/style/expression/value.hpp> #include <array> #include <vector> @@ -102,6 +103,27 @@ public: } }; +template <> +struct Interpolator<style::Rotation> { +public: + style::Rotation operator()(const style::Rotation& a, const style::Rotation& b, const double t) { + assert(a.period() == b.period()); + auto period = a.period(); + auto aAngle = std::fmod(a.getAngle(), period); + auto bAngle = std::fmod(b.getAngle(), period); + + if (aAngle - bAngle > period * 0.5) { + return {std::fmod(aAngle * (1.0 - t) + (bAngle + period) * t, period)}; + } + + if (aAngle - bAngle < period * -0.5) { + return {std::fmod((aAngle + period) * (1.0 - t) + bAngle * t, period)}; + } + + return {aAngle * (1.0 - t) + bAngle * t}; + } +}; + struct Uninterpolated { template <class T> T operator()(const T& a, const T&, const double) const { |