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;
}
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;
+}
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;
/* 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