summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKonstantin Käfer <mail@kkaefer.com>2014-01-17 13:33:39 +0100
committerKonstantin Käfer <mail@kkaefer.com>2014-01-17 13:33:39 +0100
commit509b223fbf63ea326b60e82dec2f0c0cdb160a66 (patch)
treeb10a8529540fe11c4822d994a8dd893876b45150 /src
parentfc8a0d00ac17dfaa16c363a88c4c4c14298ec1dc (diff)
downloadqtlocation-mapboxgl-509b223fbf63ea326b60e82dec2f0c0cdb160a66.tar.gz
animate northing
Diffstat (limited to 'src')
-rw-r--r--src/CMakeLists.txt2
-rw-r--r--src/map/map.cpp6
-rw-r--r--src/map/transform.cpp24
-rw-r--r--src/util/animation.cpp26
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;
+ }
+}