From 2bf2217b1a0695db73e1b770353c3e1c4580dfd7 Mon Sep 17 00:00:00 2001 From: Markus Sauermann <6299227+Sauermann@users.noreply.github.com> Date: Thu, 31 Mar 2022 22:40:26 +0200 Subject: Calculate window input event transform only on window change --- scene/main/viewport.cpp | 11 ++++------- scene/main/window.cpp | 8 ++++++++ scene/main/window.h | 2 ++ 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp index 549cc19cb1..8b6305b3a4 100644 --- a/scene/main/viewport.cpp +++ b/scene/main/viewport.cpp @@ -1108,14 +1108,11 @@ Viewport::PositionalShadowAtlasQuadrantSubdiv Viewport::get_positional_shadow_at } Transform2D Viewport::_get_input_pre_xform() const { - Transform2D pre_xf; - - if (to_screen_rect.size.x != 0 && to_screen_rect.size.y != 0) { - pre_xf.columns[2] = -to_screen_rect.position; - pre_xf.scale(Vector2(size) / to_screen_rect.size); + const Window *this_window = Object::cast_to(this); + if (this_window) { + return this_window->window_transform.affine_inverse(); } - - return pre_xf; + return Transform2D(); } Ref Viewport::_make_input_local(const Ref &ev) { diff --git a/scene/main/window.cpp b/scene/main/window.cpp index 64869b2936..dc04941ae7 100644 --- a/scene/main/window.cpp +++ b/scene/main/window.cpp @@ -668,6 +668,7 @@ void Window::_update_viewport_size() { Rect2i attach_to_screen_rect(Point2i(), size); Transform2D stretch_transform; float font_oversampling = 1.0; + window_transform = Transform2D(); if (content_scale_mode == CONTENT_SCALE_MODE_DISABLED || content_scale_size.x == 0 || content_scale_size.y == 0) { font_oversampling = content_scale_factor; @@ -754,11 +755,18 @@ void Window::_update_viewport_size() { Size2 scale = Vector2(screen_size) / Vector2(final_size_override); stretch_transform.scale(scale); + window_transform.translate_local(margin); } break; case CONTENT_SCALE_MODE_VIEWPORT: { final_size = (viewport_size / content_scale_factor).floor(); attach_to_screen_rect = Rect2(margin, screen_size); + window_transform.translate_local(margin); + if (final_size.x != 0 && final_size.y != 0) { + Transform2D scale_transform; + scale_transform.scale(Vector2(attach_to_screen_rect.size) / Vector2(final_size)); + window_transform *= scale_transform; + } } break; } } diff --git a/scene/main/window.h b/scene/main/window.h index 786f0ada38..c019730cac 100644 --- a/scene/main/window.h +++ b/scene/main/window.h @@ -152,6 +152,8 @@ private: Viewport *embedder = nullptr; + Transform2D window_transform; + friend class Viewport; //friend back, can call the methods below void _window_input(const Ref &p_ev); -- cgit v1.2.3