2021-10-27 13:14:46 +00:00
|
|
|
#include "zpl.h"
|
|
|
|
#include "camera.h"
|
|
|
|
#include "platform.h"
|
|
|
|
#include "entity_view.h"
|
|
|
|
#include "game.h"
|
|
|
|
|
|
|
|
#define CAMERA_LERP_FACTOR 11.2f
|
|
|
|
|
|
|
|
static camera main_camera;
|
|
|
|
|
|
|
|
void camera_reset(void) {
|
|
|
|
zpl_zero_item(&main_camera);
|
|
|
|
main_camera.mode = CAMERA_MODE_STATIONARY;
|
|
|
|
main_camera.first_time = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
void camera_update(void) {
|
|
|
|
switch (main_camera.mode) {
|
|
|
|
case CAMERA_MODE_FOLLOW: {
|
|
|
|
world_view *world = game_world_view_get_active();
|
|
|
|
if (!world) break;
|
|
|
|
entity_view *view = entity_view_get(&world->entities, main_camera.ent_id);
|
|
|
|
if (!view) break;
|
|
|
|
float smooth_ms = zpl_clamp((float)platform_frametime(), 0.0f, 1.0f);
|
|
|
|
|
|
|
|
main_camera.x = zpl_lerp(main_camera.x, view->x, CAMERA_LERP_FACTOR*smooth_ms);
|
|
|
|
main_camera.y = zpl_lerp(main_camera.y, view->y, CAMERA_LERP_FACTOR*smooth_ms);
|
|
|
|
|
|
|
|
if (main_camera.first_time) {
|
|
|
|
main_camera.first_time = false;
|
|
|
|
main_camera.x = view->x;
|
|
|
|
main_camera.y = view->y;
|
|
|
|
}
|
|
|
|
}break;
|
|
|
|
|
|
|
|
default: {
|
|
|
|
|
|
|
|
}break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
void camera_set_follow(uint64_t ent_id) {
|
|
|
|
main_camera.mode = CAMERA_MODE_FOLLOW;
|
|
|
|
main_camera.ent_id = ent_id;
|
|
|
|
}
|
|
|
|
void camera_set_pos(double x, double y) {
|
|
|
|
main_camera.mode = CAMERA_MODE_STATIONARY;
|
|
|
|
main_camera.x = x;
|
|
|
|
main_camera.y = y;
|
|
|
|
}
|
|
|
|
camera camera_get(void) {
|
|
|
|
return main_camera;
|
|
|
|
}
|