diff options
author | Markus Sauermann <6299227+Sauermann@users.noreply.github.com> | 2022-03-31 22:40:26 +0200 |
---|---|---|
committer | Markus Sauermann <6299227+Sauermann@users.noreply.github.com> | 2022-10-01 09:54:38 +0200 |
commit | 2bf2217b1a0695db73e1b770353c3e1c4580dfd7 (patch) | |
tree | cac672b0a9cf273a694dd361010059260515373f /scene/main | |
parent | e69b7083d45c5d8698508cce7086d361c4b1f44c (diff) |
Calculate window input event transform only on window change
Diffstat (limited to 'scene/main')
-rw-r--r-- | scene/main/viewport.cpp | 11 | ||||
-rw-r--r-- | scene/main/window.cpp | 8 | ||||
-rw-r--r-- | 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<Window>(this); + if (this_window) { + return this_window->window_transform.affine_inverse(); } - - return pre_xf; + return Transform2D(); } Ref<InputEvent> Viewport::_make_input_local(const Ref<InputEvent> &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<InputEvent> &p_ev); |