From 08ac8eefbf3208130acf9ebfee56c9249fea8f48 Mon Sep 17 00:00:00 2001 From: Lukas Krickl Date: Fri, 6 Mar 2026 08:33:05 +0100 Subject: [PATCH] camera: Added zoom functions --- src/t_camera.c | 24 +++++++++++++++++++++++- src/t_camera.h | 12 ++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/src/t_camera.c b/src/t_camera.c index 69822a9..d8f9522 100644 --- a/src/t_camera.c +++ b/src/t_camera.c @@ -10,21 +10,29 @@ struct t_camera t_camera_init(i32 viewport_x, i32 viewport_y) { c.viewport_x = viewport_x; c.viewport_y = viewport_y; + c.zoom = 2; + return c; } void t_camera_scroll(struct t_camera *c, i32 by_x, i32 by_y) { + lrts_assert(c); + lrts_assert(c->zoom); /* TODO: calculate min/max viewport based on map in a better way */ c->x += by_x; c->y += by_y; } lrts_bool t_camera_is_visible_screen(struct t_camera *c, i32 x, i32 y) { - return u_point_in_rect(x, y, c->x, c->y, c->viewport_x, c->viewport_y); + lrts_assert(c); + lrts_assert(c->zoom); + return u_point_in_rect(x, y, c->x, c->y, c->viewport_x / c->zoom, c->viewport_y / c->zoom); } struct u_vec2 u_screen_to_camera(struct t_camera *c, struct u_vec2 v) { + lrts_assert(c); + lrts_assert(c->zoom); v.x -= c->x; v.y -= c->y; @@ -32,8 +40,22 @@ struct u_vec2 u_screen_to_camera(struct t_camera *c, struct u_vec2 v) { } struct u_vec2 u_world_to_camera(struct t_camera *c, struct u_vec2 v) { + lrts_assert(c); + lrts_assert(c->zoom); v.x += c->x; v.y += c->y; return v; } + +i32 t_camera_zoom(struct t_camera *c, i32 n) { + lrts_assert(c); + lrts_assert(c->zoom); + return n * t_camera_zoom_factor(c); +} + +i32 t_camera_zoom_factor(struct t_camera *c) { + lrts_assert(c); + lrts_assert(c->zoom); + return c->zoom; +} diff --git a/src/t_camera.h b/src/t_camera.h index 3cc3395..71e79da 100644 --- a/src/t_camera.h +++ b/src/t_camera.h @@ -9,6 +9,13 @@ struct t_camera { i32 viewport_x; i32 viewport_y; + + /* 1: normal zoom + * 2: 2x closer + * etc + * value must never be 0 + */ + i8 zoom; }; extern struct t_camera t_main_camera; @@ -26,5 +33,10 @@ struct u_vec2 u_world_to_camera(struct t_camera *c, struct u_vec2 v); /* tests if a point is visible in screen sapce */ lrts_bool t_camera_is_visible_screen(struct t_camera *c, i32 x, i32 y); +/* multiplies by zoom factor */ +i32 t_camera_zoom(struct t_camera *c, i32 n); + +i32 t_camera_zoom_factor(struct t_camera *c); + #endif -- 2.30.2