diff options
author | Konstantin Käfer <mail@kkaefer.com> | 2014-01-17 13:33:39 +0100 |
---|---|---|
committer | Konstantin Käfer <mail@kkaefer.com> | 2014-01-17 13:33:39 +0100 |
commit | 509b223fbf63ea326b60e82dec2f0c0cdb160a66 (patch) | |
tree | b10a8529540fe11c4822d994a8dd893876b45150 /src | |
parent | fc8a0d00ac17dfaa16c363a88c4c4c14298ec1dc (diff) | |
download | qtlocation-mapboxgl-509b223fbf63ea326b60e82dec2f0c0cdb160a66.tar.gz |
animate northing
Diffstat (limited to 'src')
-rw-r--r-- | src/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/map/map.cpp | 6 | ||||
-rw-r--r-- | src/map/transform.cpp | 24 | ||||
-rw-r--r-- | src/util/animation.cpp | 26 |
4 files changed, 51 insertions, 7 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 4db400e113..8d596e65f4 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -9,6 +9,7 @@ SET(llmr_SOURCES renderer/shader-line.cpp renderer/shader.cpp shader/shaders.c + util/animation.cpp util/mat4.c ) @@ -25,6 +26,7 @@ SET(llmr_HEADERS ../include/llmr/renderer/shader-fill.hpp ../include/llmr/renderer/shader-line.hpp ../include/llmr/renderer/shader.hpp + ../include/llmr/util/animation.hpp ../include/llmr/util/math.hpp ../include/llmr/util/vec2.hpp ) diff --git a/src/map/map.cpp b/src/map/map.cpp index f550d90967..0fff04d75a 100644 --- a/src/map/map.cpp +++ b/src/map/map.cpp @@ -65,7 +65,7 @@ void map::rotateBy(double cx, double cy, double sx, double sy, double ex, double } void map::resetNorth() { - transform->setAngle(0); + transform->setAngle(0, 0.5); // 500 ms update(); settings->angle = transform->getAngle(); @@ -261,6 +261,8 @@ void map::updateTiles() { } bool map::render() { + transform->updateAnimations(); + painter->clear(); for (tile::ptr& tile : tiles) { @@ -270,7 +272,7 @@ bool map::render() { } } - return false; + return transform->needsAnimation(); } void map::tileLoaded(tile::ptr tile) { diff --git a/src/map/transform.cpp b/src/map/transform.cpp index 6dbfad1711..e314bcd3a8 100644 --- a/src/map/transform.cpp +++ b/src/map/transform.cpp @@ -1,5 +1,4 @@ #include <llmr/map/transform.hpp> - #include <llmr/util/mat4.h> #include <llmr/util/math.hpp> #include <cmath> @@ -29,6 +28,16 @@ transform::transform() setAngle(angle); } +bool transform::needsAnimation() const { + return !animations.empty(); +} + +void transform::updateAnimations() { + animations.remove_if([](const util::animation& animation) { + return animation.update() == util::animation::complete; + }); +} + void transform::moveBy(double dx, double dy) { x += cos(angle) * dx + sin(angle) * dy; y += cos(angle) * dy + sin(-angle) * dx; @@ -82,10 +91,15 @@ void transform::rotateBy(double anchor_x, double anchor_y, double start_x, doubl setAngle(ang); } -void transform::setAngle(double new_angle) { - angle = new_angle; - while (angle > M_PI) angle -= M2PI; - while (angle <= -M_PI) angle += M2PI; +void transform::setAngle(double new_angle, double duration) { + while (new_angle > M_PI) new_angle -= M2PI; + while (new_angle <= -M_PI) new_angle += M2PI; + + if (duration == 0) { + angle = new_angle; + } else { + animations.emplace_front(angle, new_angle, angle, duration); + } } void transform::setScale(double new_scale) { diff --git a/src/util/animation.cpp b/src/util/animation.cpp new file mode 100644 index 0000000000..a2c3e778e8 --- /dev/null +++ b/src/util/animation.cpp @@ -0,0 +1,26 @@ +#include <llmr/util/animation.hpp> +#include <llmr/util/unitbezier.hpp> +#include <llmr/platform/platform.hpp> + +using namespace llmr::util; + +UnitBezier ease(0.25, 0.1, 0.25, 1); + +animation::animation(double from, double to, double &value, double duration) + : start(platform::time()), + duration(duration), + from(from), + to(to), + value(value) { +} + +animation::state animation::update() const { + double t = (platform::time() - start) / duration; + if (t >= 1) { + value = to; + return complete; + } else { + value = from + (to - from) * ease.solve(t, 0.001); + return running; + } +} |