diff options
-rw-r--r-- | main/app.cpp | 12 | ||||
-rw-r--r-- | main/camera.cpp | 53 |
2 files changed, 37 insertions, 28 deletions
diff --git a/main/app.cpp b/main/app.cpp index 45e712de..42246bbd 100644 --- a/main/app.cpp +++ b/main/app.cpp @@ -81,6 +81,9 @@ void app::recalc_viewport(Vector2i size) _shader.set_scale(Vector2(size)); _imgui.relayout(Vector2{ size }, size, size); + _cursor_pixel = std::nullopt; + recalc_cursor_tile(); + GL::defaultFramebuffer.setViewport({{}, size }); _framebuffer.detach(GL::Framebuffer::ColorAttachment{0}); _msaa_color_texture = GL::MultisampleTexture2D{}; @@ -133,7 +136,10 @@ void app::mouseReleaseEvent(Platform::Sdl2Application::MouseEvent& event) void app::mouseMoveEvent(Platform::Sdl2Application::MouseMoveEvent& event) { _cursor_in_imgui = _imgui.handleMouseMoveEvent(event); - _cursor_pixel = event.position(); + if (_cursor_in_imgui) + _cursor_pixel = std::nullopt; + else + _cursor_pixel = event.position(); recalc_cursor_tile(); } @@ -193,7 +199,7 @@ void app::anyEvent(SDL_Event& event) void app::event_focus_out() { _cursor_pixel = std::nullopt; - _cursor_tile = std::nullopt; + recalc_cursor_tile(); } void app::event_focus_in() @@ -203,7 +209,7 @@ void app::event_focus_in() void app::event_mouse_leave() { _cursor_pixel = std::nullopt; - _cursor_tile = std::nullopt; + recalc_cursor_tile(); } void app::event_mouse_enter() diff --git a/main/camera.cpp b/main/camera.cpp index fd31066e..a063b619 100644 --- a/main/camera.cpp +++ b/main/camera.cpp @@ -5,33 +5,37 @@ namespace floormat { void app::do_camera(double dt) { - constexpr double screens_per_second = 1; - const auto pixels_per_second = windowSize().length() / screens_per_second; - auto camera_offset = _shader.camera_offset(); - 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{}) + if (keys[key::camera_reset]) + reset_camera_offset(); + else { - camera_offset += dir.normalized() * dt * pixels_per_second; + Vector2d dir{}; - const auto max_camera_offset = Vector2d(windowSize() * 10); - 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); + 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 (keys[key::camera_reset]) - reset_camera_offset(); + if (dir != Vector2d{}) + { + constexpr double screens_per_second = 1; + const auto pixels_per_second = windowSize().length() / screens_per_second; + auto camera_offset = _shader.camera_offset(); + const auto max_camera_offset = Vector2d(windowSize() * 10); + + camera_offset += dir.normalized() * 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); + } + else + return; + } recalc_cursor_tile(); } @@ -42,12 +46,11 @@ void app::reset_camera_offset() #else _shader.set_camera_offset({}); #endif - recalc_cursor_tile(); } void app::recalc_cursor_tile() { - if (_cursor_pixel) + if (_cursor_pixel && !_cursor_in_imgui) _cursor_tile = pixel_to_tile(Vector2d(*_cursor_pixel)); else _cursor_tile = std::nullopt; |