From 068d40a5a903dbfa9055dda201c6cba81569fae1 Mon Sep 17 00:00:00 2001 From: Hilderin <81109165+Hilderin@users.noreply.github.com> Date: Thu, 20 Feb 2025 20:24:12 -0500 Subject: [PATCH] Fix Embedded Game window wrong first startup location and size --- editor/plugins/embedded_process.cpp | 15 ++++++--------- editor/plugins/embedded_process.h | 1 + editor/plugins/game_view_plugin.cpp | 20 +++++++++++++++++++- 3 files changed, 26 insertions(+), 10 deletions(-) diff --git a/editor/plugins/embedded_process.cpp b/editor/plugins/embedded_process.cpp index 0da2dceb5f4..b4897bcd48f 100644 --- a/editor/plugins/embedded_process.cpp +++ b/editor/plugins/embedded_process.cpp @@ -95,9 +95,11 @@ void EmbeddedProcess::set_keep_aspect(bool p_keep_aspect) { } } -Rect2i EmbeddedProcess::_get_global_embedded_window_rect() { - Rect2i control_rect = get_global_rect(); - control_rect = Rect2i(control_rect.position + margin_top_left, (control_rect.size - get_margins_size()).maxi(1)); +Rect2i EmbeddedProcess::get_adjusted_embedded_window_rect(Rect2i p_rect) { + Rect2i control_rect = Rect2i(p_rect.position + margin_top_left, (p_rect.size - get_margins_size()).maxi(1)); + if (window) { + control_rect.position += window->get_position(); + } if (window_size != Size2i()) { Rect2i desired_rect = Rect2i(); if (!keep_aspect && control_rect.size.x >= window_size.x && control_rect.size.y >= window_size.y) { @@ -116,12 +118,7 @@ Rect2i EmbeddedProcess::_get_global_embedded_window_rect() { } Rect2i EmbeddedProcess::get_screen_embedded_window_rect() { - Rect2i rect = _get_global_embedded_window_rect(); - if (window) { - rect.position += window->get_position(); - } - - return rect; + return get_adjusted_embedded_window_rect(get_global_rect()); } int EmbeddedProcess::get_margin_size(Side p_side) const { diff --git a/editor/plugins/embedded_process.h b/editor/plugins/embedded_process.h index 55988be3f0b..298424b0c55 100644 --- a/editor/plugins/embedded_process.h +++ b/editor/plugins/embedded_process.h @@ -83,6 +83,7 @@ public: void set_keep_aspect(bool p_keep_aspect); void queue_update_embedded_process(); + Rect2i get_adjusted_embedded_window_rect(Rect2i p_rect); Rect2i get_screen_embedded_window_rect(); int get_margin_size(Side p_side) const; Size2 get_margins_size(); diff --git a/editor/plugins/game_view_plugin.cpp b/editor/plugins/game_view_plugin.cpp index 6318bf6d164..30c558e0bd5 100644 --- a/editor/plugins/game_view_plugin.cpp +++ b/editor/plugins/game_view_plugin.cpp @@ -812,10 +812,28 @@ void GameView::_update_arguments_for_instance(int p_idx, List &r_argumen _update_embed_window_size(); Rect2i rect = embedded_process->get_screen_embedded_window_rect(); + // On the first startup, the global rect of the embedded process control is invalid because it was + // never displayed. We will calculated it manually. + if (!window_wrapper->get_window_enabled() && rect.size.y < embedded_process->get_custom_minimum_size().y) { + Size2 old_min_size = embedded_process->get_custom_minimum_size(); + embedded_process->set_custom_minimum_size(Size2i()); + + Control *container = EditorNode::get_singleton()->get_editor_main_screen()->get_control(); + rect = container->get_global_rect(); + + Size2 wrapped_min_size = window_wrapper->get_minimum_size(); + rect.position.y += wrapped_min_size.y; + rect.size.y -= wrapped_min_size.y; + + rect = embedded_process->get_adjusted_embedded_window_rect(rect); + + embedded_process->set_custom_minimum_size(old_min_size); + } + // When using the floating window, we need to force the position and size from the // editor/project settings, because the get_screen_embedded_window_rect of the // embedded_process will be updated only on the next frame. - if (p_idx == 0 && window_wrapper->get_window_enabled()) { + if (window_wrapper->get_window_enabled()) { EditorRun::WindowPlacement placement = EditorRun::get_window_placement(); if (placement.position != Point2i(INT_MAX, INT_MAX)) { rect.position = placement.position;