From 509b223fbf63ea326b60e82dec2f0c0cdb160a66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20Ka=CC=88fer?= Date: Fri, 17 Jan 2014 13:33:39 +0100 Subject: animate northing --- src/CMakeLists.txt | 2 ++ src/map/map.cpp | 6 ++++-- src/map/transform.cpp | 24 +++++++++++++++++++----- src/util/animation.cpp | 26 ++++++++++++++++++++++++++ 4 files changed, 51 insertions(+), 7 deletions(-) create mode 100644 src/util/animation.cpp (limited to 'src') 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 - #include #include #include @@ -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 +#include +#include + +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; + } +} -- cgit v1.2.1