From 7495a8a02e363baa3ae49d496b45528f8bb793b5 Mon Sep 17 00:00:00 2001 From: Fredia Huya-Kouadio Date: Tue, 7 Jan 2025 21:31:53 -0800 Subject: [PATCH] Add support for embedding game process in the Android Editor - Implement Android editor specific `EmbeddedGodotGame` to support embedding the game window in the Android editor --- doc/classes/EditorSettings.xml | 8 - editor/editor_main_screen.cpp | 7 + editor/editor_main_screen.h | 2 + editor/editor_settings.cpp | 17 +- editor/plugins/game_view_plugin.cpp | 54 +- editor/plugins/game_view_plugin.h | 13 +- platform/android/SCsub | 1 + platform/android/game_menu_utils_jni.cpp | 127 +++++ platform/android/game_menu_utils_jni.h | 49 ++ .../java/editor/src/main/AndroidManifest.xml | 15 + .../org/godotengine/editor/BaseGodotEditor.kt | 473 +++++++++++++---- .../org/godotengine/editor/BaseGodotGame.kt | 104 ++++ .../editor/EditorMessageDispatcher.kt | 117 ++++- .../godotengine/editor/EditorWindowInfo.kt | 15 +- .../java/org/godotengine/editor/GodotGame.kt | 231 +++++---- .../org/godotengine/editor/GodotXRGame.kt | 4 +- .../editor/embed/EmbeddedGodotGame.kt | 147 ++++++ .../editor/embed/GameMenuFragment.kt | 480 ++++++++++++++++++ .../res/color/game_menu_icons_color_state.xml | 9 + .../main/res/drawable/baseline_close_24.xml | 5 + .../res/drawable/baseline_expand_less_24.xml | 12 + ...xit_48.xml => baseline_expand_more_48.xml} | 4 +- .../res/drawable/baseline_fullscreen_24.xml | 5 + .../drawable/baseline_fullscreen_exit_24.xml | 5 + .../drawable/baseline_fullscreen_selector.xml | 6 + .../res/drawable/baseline_minimize_24.xml | 5 + .../baseline_picture_in_picture_alt_24.xml | 5 + .../res/drawable/baseline_push_pin_24.xml | 5 + .../editor/src/main/res/drawable/camera.xml | 9 + ...ted_bg_drawable.xml => expand_more_bg.xml} | 7 +- .../main/res/drawable/game_menu_button_bg.xml | 7 + .../res/drawable/game_menu_message_bg.xml | 6 + .../res/drawable/game_menu_selected_bg.xml | 10 + .../drawable/game_menu_selected_button_bg.xml | 6 + .../src/main/res/drawable/gui_tab_menu.xml | 9 + .../res/drawable/gui_visibility_hidden.xml | 9 + .../res/drawable/gui_visibility_selector.xml | 5 + .../res/drawable/gui_visibility_visible.xml | 9 + .../drawable/input_event_joypad_motion.xml | 24 + .../src/main/res/drawable/list_select.xml | 9 + .../src/main/res/drawable/next_frame.xml | 9 + .../editor/src/main/res/drawable/node_3d.xml | 11 + .../editor/src/main/res/drawable/nodes_2d.xml | 16 + .../editor/src/main/res/drawable/pause.xml | 9 + .../main/res/drawable/pause_play_selector.xml | 5 + .../res/drawable/pip_button_bg_drawable.xml | 9 - .../pip_button_default_bg_drawable.xml | 10 - .../editor/src/main/res/drawable/play.xml | 9 + .../src/main/res/drawable/play_48dp.xml | 9 + .../src/main/res/drawable/tool_select.xml | 9 + .../res/layout/game_menu_fragment_layout.xml | 190 +++++++ .../main/res/layout/godot_editor_layout.xml | 47 +- .../src/main/res/layout/godot_game_layout.xml | 39 +- .../main/res/layout/godot_xr_game_layout.xml | 11 + .../editor/src/main/res/menu/options_menu.xml | 56 ++ .../editor/src/main/res/values/colors.xml | 8 + .../editor/src/main/res/values/dimens.xml | 4 + .../editor/src/main/res/values/strings.xml | 18 +- .../editor/src/main/res/values/themes.xml | 3 + .../lib/src/org/godotengine/godot/Godot.kt | 17 +- .../org/godotengine/godot/GodotFragment.java | 7 + .../src/org/godotengine/godot/GodotHost.java | 5 + .../src/org/godotengine/godot/GodotLib.java | 28 + .../godotengine/godot/utils/DialogUtils.kt | 6 +- .../godotengine/godot/utils/GameMenuUtils.kt | 117 +++++ platform/android/java_godot_lib_jni.cpp | 58 +++ platform/android/java_godot_lib_jni.h | 5 + platform/android/java_godot_wrapper.cpp | 11 + platform/android/java_godot_wrapper.h | 3 + platform/android/os_android.cpp | 30 ++ platform/android/os_android.h | 4 + 71 files changed, 2497 insertions(+), 301 deletions(-) create mode 100644 platform/android/game_menu_utils_jni.cpp create mode 100644 platform/android/game_menu_utils_jni.h create mode 100644 platform/android/java/editor/src/main/java/org/godotengine/editor/BaseGodotGame.kt create mode 100644 platform/android/java/editor/src/main/java/org/godotengine/editor/embed/EmbeddedGodotGame.kt create mode 100644 platform/android/java/editor/src/main/java/org/godotengine/editor/embed/GameMenuFragment.kt create mode 100644 platform/android/java/editor/src/main/res/color/game_menu_icons_color_state.xml create mode 100644 platform/android/java/editor/src/main/res/drawable/baseline_close_24.xml create mode 100644 platform/android/java/editor/src/main/res/drawable/baseline_expand_less_24.xml rename platform/android/java/editor/src/main/res/drawable/{outline_fullscreen_exit_48.xml => baseline_expand_more_48.xml} (61%) create mode 100644 platform/android/java/editor/src/main/res/drawable/baseline_fullscreen_24.xml create mode 100644 platform/android/java/editor/src/main/res/drawable/baseline_fullscreen_exit_24.xml create mode 100644 platform/android/java/editor/src/main/res/drawable/baseline_fullscreen_selector.xml create mode 100644 platform/android/java/editor/src/main/res/drawable/baseline_minimize_24.xml create mode 100644 platform/android/java/editor/src/main/res/drawable/baseline_picture_in_picture_alt_24.xml create mode 100644 platform/android/java/editor/src/main/res/drawable/baseline_push_pin_24.xml create mode 100644 platform/android/java/editor/src/main/res/drawable/camera.xml rename platform/android/java/editor/src/main/res/drawable/{pip_button_activated_bg_drawable.xml => expand_more_bg.xml} (58%) create mode 100644 platform/android/java/editor/src/main/res/drawable/game_menu_button_bg.xml create mode 100644 platform/android/java/editor/src/main/res/drawable/game_menu_message_bg.xml create mode 100644 platform/android/java/editor/src/main/res/drawable/game_menu_selected_bg.xml create mode 100644 platform/android/java/editor/src/main/res/drawable/game_menu_selected_button_bg.xml create mode 100644 platform/android/java/editor/src/main/res/drawable/gui_tab_menu.xml create mode 100644 platform/android/java/editor/src/main/res/drawable/gui_visibility_hidden.xml create mode 100644 platform/android/java/editor/src/main/res/drawable/gui_visibility_selector.xml create mode 100644 platform/android/java/editor/src/main/res/drawable/gui_visibility_visible.xml create mode 100644 platform/android/java/editor/src/main/res/drawable/input_event_joypad_motion.xml create mode 100644 platform/android/java/editor/src/main/res/drawable/list_select.xml create mode 100644 platform/android/java/editor/src/main/res/drawable/next_frame.xml create mode 100644 platform/android/java/editor/src/main/res/drawable/node_3d.xml create mode 100644 platform/android/java/editor/src/main/res/drawable/nodes_2d.xml create mode 100644 platform/android/java/editor/src/main/res/drawable/pause.xml create mode 100644 platform/android/java/editor/src/main/res/drawable/pause_play_selector.xml delete mode 100644 platform/android/java/editor/src/main/res/drawable/pip_button_bg_drawable.xml delete mode 100644 platform/android/java/editor/src/main/res/drawable/pip_button_default_bg_drawable.xml create mode 100644 platform/android/java/editor/src/main/res/drawable/play.xml create mode 100644 platform/android/java/editor/src/main/res/drawable/play_48dp.xml create mode 100644 platform/android/java/editor/src/main/res/drawable/tool_select.xml create mode 100644 platform/android/java/editor/src/main/res/layout/game_menu_fragment_layout.xml create mode 100644 platform/android/java/editor/src/main/res/layout/godot_xr_game_layout.xml create mode 100644 platform/android/java/editor/src/main/res/menu/options_menu.xml create mode 100644 platform/android/java/editor/src/main/res/values/colors.xml create mode 100644 platform/android/java/lib/src/org/godotengine/godot/utils/GameMenuUtils.kt diff --git a/doc/classes/EditorSettings.xml b/doc/classes/EditorSettings.xml index c4aa05fcb31..feb40553ea4 100644 --- a/doc/classes/EditorSettings.xml +++ b/doc/classes/EditorSettings.xml @@ -1154,19 +1154,11 @@ - [b]Auto (based on screen size)[/b] (default) will automatically choose how to launch the Play window based on the device and screen metrics. Defaults to [b]Same as Editor[/b] on phones and [b]Side-by-side with Editor[/b] on tablets. - [b]Same as Editor[/b] will launch the Play window in the same window as the Editor. - [b]Side-by-side with Editor[/b] will launch the Play window side-by-side with the Editor window. - - [b]Launch in PiP mode[/b] will launch the Play window directly in picture-in-picture (PiP) mode if PiP mode is supported and enabled. When maximized, the Play window will occupy the same window as the Editor. [b]Note:[/b] Only available in the Android editor. Overrides game embedding setting for all newly opened projects. If enabled, game embedding settings are not saved. - - Specifies the picture-in-picture (PiP) mode for the Play window. - - [b]Disabled:[/b] PiP is disabled for the Play window. - - [b]Enabled:[/b] If the device supports it, PiP is always enabled for the Play window. The Play window will contain a button to enter PiP mode. - - [b]Enabled when Play window is same as Editor[/b] (default for Android editor): If the device supports it, PiP is enabled when the Play window is the same as the Editor. The Play window will contain a button to enter PiP mode. - [b]Note:[/b] Only available in the Android editor. - The window mode to use to display the project when starting the project from the editor. [b]Note:[/b] Game embedding is not available for "Force Maximized" or "Force Fullscreen." diff --git a/editor/editor_main_screen.cpp b/editor/editor_main_screen.cpp index dfc1152d17e..fdd4615c33f 100644 --- a/editor/editor_main_screen.cpp +++ b/editor/editor_main_screen.cpp @@ -228,6 +228,11 @@ EditorPlugin *EditorMainScreen::get_selected_plugin() const { return selected_plugin; } +EditorPlugin *EditorMainScreen::get_plugin_by_name(const String &p_plugin_name) const { + ERR_FAIL_COND_V(!main_editor_plugins.has(p_plugin_name), nullptr); + return main_editor_plugins[p_plugin_name]; +} + VBoxContainer *EditorMainScreen::get_control() const { return main_screen_vbox; } @@ -254,6 +259,7 @@ void EditorMainScreen::add_main_plugin(EditorPlugin *p_editor) { buttons.push_back(tb); button_hb->add_child(tb); editor_table.push_back(p_editor); + main_editor_plugins.insert(p_editor->get_plugin_name(), p_editor); } void EditorMainScreen::remove_main_plugin(EditorPlugin *p_editor) { @@ -280,6 +286,7 @@ void EditorMainScreen::remove_main_plugin(EditorPlugin *p_editor) { } editor_table.erase(p_editor); + main_editor_plugins.erase(p_editor->get_plugin_name()); } EditorMainScreen::EditorMainScreen() { diff --git a/editor/editor_main_screen.h b/editor/editor_main_screen.h index ca78ceaa885..06bf2f7aaf2 100644 --- a/editor/editor_main_screen.h +++ b/editor/editor_main_screen.h @@ -58,6 +58,7 @@ private: HBoxContainer *button_hb = nullptr; Vector