summaryrefslogtreecommitdiff
path: root/scene/main
diff options
context:
space:
mode:
authorMarkus Sauermann <6299227+Sauermann@users.noreply.github.com>2022-03-31 22:40:26 +0200
committerMarkus Sauermann <6299227+Sauermann@users.noreply.github.com>2022-10-01 09:54:38 +0200
commit2bf2217b1a0695db73e1b770353c3e1c4580dfd7 (patch)
treecac672b0a9cf273a694dd361010059260515373f /scene/main
parente69b7083d45c5d8698508cce7086d361c4b1f44c (diff)
Calculate window input event transform only on window change
Diffstat (limited to 'scene/main')
-rw-r--r--scene/main/viewport.cpp11
-rw-r--r--scene/main/window.cpp8
-rw-r--r--scene/main/window.h2
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);