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

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

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

26
src/util/animation.cpp Normal file
View File

@@ -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;
}
}