From 0bc2c269cbd6dcec44d1d780d21bea9cbcd2e436 Mon Sep 17 00:00:00 2001 From: scgm0 <2682963017@qq.com> Date: Thu, 3 Oct 2024 01:10:42 +0800 Subject: [PATCH] Fix blurred content of embedded windows --- scene/main/viewport.cpp | 12 ++++++------ scene/main/window.cpp | 4 ++++ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp index d29ea240b29..018ac748e67 100644 --- a/scene/main/viewport.cpp +++ b/scene/main/viewport.cpp @@ -127,7 +127,7 @@ int ViewportTexture::get_width() const { _err_print_viewport_not_set(); return 0; } - return vp->size.width; + return get_size().width; } int ViewportTexture::get_height() const { @@ -135,7 +135,7 @@ int ViewportTexture::get_height() const { _err_print_viewport_not_set(); return 0; } - return vp->size.height; + return get_size().height; } Size2 ViewportTexture::get_size() const { @@ -143,7 +143,8 @@ Size2 ViewportTexture::get_size() const { _err_print_viewport_not_set(); return Size2(); } - return vp->size; + float scale = MIN(vp->get_screen_transform().get_scale().width, vp->get_screen_transform().get_scale().height); + return Size2(vp->size.width * scale, vp->size.height * scale).ceil(); } RID ViewportTexture::get_rid() const { @@ -313,10 +314,8 @@ void Viewport::_sub_window_update(Window *p_window) { SubWindow &sw = gui.sub_windows.write[index]; sw.pending_window_update = false; - Transform2D pos; - pos.set_origin(p_window->get_position()); RS::get_singleton()->canvas_item_clear(sw.canvas_item); - Rect2i r = Rect2i(p_window->get_position(), sw.window->get_size()); + Rect2i r = Rect2i(p_window->get_position(), p_window->get_size()); if (!p_window->get_flag(Window::FLAG_BORDERLESS)) { Ref panel = gui.subwindow_focused == p_window ? p_window->theme_cache.embedded_border : p_window->theme_cache.embedded_unfocused_border; @@ -987,6 +986,7 @@ void Viewport::update_canvas_items() { for (Viewport::SubWindow w : gui.sub_windows) { if (w.window && !w.pending_window_update) { w.pending_window_update = true; + w.window->_update_viewport_size(); callable_mp(this, &Viewport::_sub_window_update).call_deferred(w.window); } } diff --git a/scene/main/window.cpp b/scene/main/window.cpp index 154d4d199d8..f388cad6605 100644 --- a/scene/main/window.cpp +++ b/scene/main/window.cpp @@ -1259,6 +1259,10 @@ void Window::_update_viewport_size() { notification(NOTIFICATION_WM_SIZE_CHANGED); if (embedder) { + float scale = MIN(embedder->stretch_transform.get_scale().width, embedder->stretch_transform.get_scale().height); + Size2 s = Size2(final_size.width * scale, final_size.height * scale).ceil(); + RS::get_singleton()->viewport_set_global_canvas_transform(get_viewport_rid(), global_canvas_transform * scale * content_scale_factor); + RS::get_singleton()->viewport_set_size(get_viewport_rid(), s.width, s.height); embedder->_sub_window_update(this); } }