animate northing

This commit is contained in:
Konstantin Käfer
2014-01-17 13:33:39 +01:00
parent fc8a0d00ac
commit 509b223fbf
10 changed files with 222 additions and 10 deletions

View File

@@ -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) {

View File

@@ -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) {