#include "app.hpp" #include "src/global-coords.hpp" #include "shaders/tile.hpp" #include "floormat/main.hpp" namespace floormat { void app::do_camera(float dt) { if (keys[key::camera_reset]) { reset_camera_offset(); do_mouse_move(); } else { Vector2d dir{}; if (keys[key::camera_up]) dir += Vector2d{0, -1}; else if (keys[key::camera_down]) dir += Vector2d{0, 1}; if (keys[key::camera_left]) dir += Vector2d{-1, 0}; else if (keys[key::camera_right]) dir += Vector2d{1, 0}; if (dir != Vector2d{}) { auto& shader = M->shader(); const auto sz = M->window_size(); constexpr double screens_per_second = 0.75; const double pixels_per_second = sz.length() / screens_per_second; auto camera_offset = shader.camera_offset(); const auto max_camera_offset = Vector2d(sz * 10); camera_offset -= dir.normalized() * (double)dt * pixels_per_second; camera_offset[0] = std::clamp(camera_offset[0], -max_camera_offset[0], max_camera_offset[0]); camera_offset[1] = std::clamp(camera_offset[1], -max_camera_offset[1], max_camera_offset[1]); shader.set_camera_offset(camera_offset); update_cursor_tile(cursor.pixel); do_mouse_move(); } } } void app::reset_camera_offset() { constexpr Vector3d size = TILE_MAX_DIM20d*dTILE_SIZE*-.5; constexpr auto projected = tile_shader::project(size); M->shader().set_camera_offset(projected); update_cursor_tile(cursor.pixel); } void app::update_cursor_tile(const std::optional& pixel) { cursor.pixel = pixel; if (pixel) cursor.tile = M->pixel_to_tile(Vector2d{*pixel}); else cursor.tile = std::nullopt; } } // namespace floormat