animate northing
This commit is contained in:
@@ -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
|
||||
)
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
26
src/util/animation.cpp
Normal 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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user