camera: Added zoom functions
authorLukas Krickl <lukas@krickl.dev>
Fri, 6 Mar 2026 07:33:05 +0000 (08:33 +0100)
committerLukas Krickl <lukas@krickl.dev>
Fri, 6 Mar 2026 07:33:05 +0000 (08:33 +0100)
src/t_camera.c
src/t_camera.h

index 69822a9d6543d038e61199f3f06dce3625c7214a..d8f9522a3e1a9d9f97b4c55246ba8456d5c480bb 100644 (file)
@@ -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;
+}
index 3cc33956f7d0864c1a135f590d1b5ecc3bc6baba..71e79da766e09b147809464d31d2c501a067c4ba 100644 (file)
@@ -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