diff --git a/include/vec2.h b/include/vec2.h index 0e94a79..5d135a2 100644 --- a/include/vec2.h +++ b/include/vec2.h @@ -24,3 +24,4 @@ struct Vec2 vec2_mul(struct Vec2, int scale); struct Vec2f vec2f_mul(struct Vec2f, int scale); struct Vec2 vec2f_vec2(struct Vec2f); struct Vec2f vec2_vec2f(struct Vec2); +struct Vec2f vec2f_lerp(struct Vec2f from, struct Vec2f to, float scale); diff --git a/src/camera.c b/src/camera.c index 87add9b..8d8e203 100644 --- a/src/camera.c +++ b/src/camera.c @@ -11,6 +11,6 @@ struct Camera camera_new(struct Vec2f *target) { } void camera_update(struct Camera *c) { - c->pos = *c->target; + c->pos = vec2f_lerp(c->pos, *c->target, 0.2); c->offset = vec2f_vec2(c->pos); } diff --git a/src/vec2.c b/src/vec2.c index 4f5bd61..b6f5bcb 100644 --- a/src/vec2.c +++ b/src/vec2.c @@ -41,3 +41,13 @@ vec2_vec2f(struct Vec2 v) { return VEC2F(v.x, v.y); } + +struct Vec2f +vec2f_lerp(struct Vec2f from, struct Vec2f to, float scale) { + /* Linear interpolation: can be used for camera and animations. + * 'scale' is the transformation speed, 0 slow and 1 fast. */ + return VEC2F( + from.x * (1.0-scale) + to.x * scale, + from.y * (1.0-scale) + to.y * scale + ); +}