// // Created by m on 12/11/21. // #include "camera.hpp" Rectangle Camera::get_bounds() { return cached_bounds; } void Camera::move_camera(Point new_center) { this->center = new_center; this->cached_bounds = calculate_bounds(); } void Camera::set_bounds(int max_x, int max_y) { this->max_x = max_x; this->max_y = max_y; this->cached_bounds = calculate_bounds(); } Rectangle Camera::calculate_bounds() { int minx = std::clamp(center.x-(tiles_rendered_x/2), 0, std::max(0,max_x - tiles_rendered_x)); int miny = std::clamp(center.y-(tiles_rendered_y/2), 0, std::max(0,max_y - tiles_rendered_y)); int width = std::min(tiles_rendered_x, max_x-minx); int height = std::min(tiles_rendered_y, max_y-miny); return Rectangle{minx, miny, width, height}; } Point Camera::camera_coords_to_screen_coords(Point camera_coord) { auto bounds = get_bounds(); return Point{camera_coord.x-bounds.x, camera_coord.y-bounds.y}; } ranges::any_view Camera::get_range() { auto bounds = get_bounds(); int height = bounds.height; int width = bounds.width; int miny = bounds.y; int minx = bounds.x; return ranges::views::iota(miny, height) | ranges::views::transform([width, minx](int y) { return ranges::views::iota(minx, width) | ranges::views::transform([y](int x) { return Point{x,y}; }); }) | ranges::views::join; }