diff --git a/core/os/os.cpp b/core/os/os.cpp index fba014703d2..a2ddc4d716c 100644 --- a/core/os/os.cpp +++ b/core/os/os.cpp @@ -426,6 +426,27 @@ OS::ScreenOrientation OS::get_screen_orientation() const { return (OS::ScreenOrientation)_orientation; } +// Internal helper function that returns the screen orientation enum value from a string +// (generally coming from the Project Settings). +// This is required to keep compatibility with existing projects. +OS::ScreenOrientation OS::get_screen_orientation_from_string(const String &p_orientation) const { + if (p_orientation == "portrait") { + return OS::SCREEN_PORTRAIT; + } else if (p_orientation == "reverse_landscape") { + return OS::SCREEN_REVERSE_LANDSCAPE; + } else if (p_orientation == "reverse_portrait") { + return OS::SCREEN_REVERSE_PORTRAIT; + } else if (p_orientation == "sensor_landscape") { + return OS::SCREEN_SENSOR_LANDSCAPE; + } else if (p_orientation == "sensor_portrait") { + return OS::SCREEN_SENSOR_PORTRAIT; + } else if (p_orientation == "sensor") { + return OS::SCREEN_SENSOR; + } + + return OS::SCREEN_LANDSCAPE; +} + void OS::ensure_user_data_dir() { String dd = get_user_data_dir(); DirAccess *da = DirAccess::open(dd); diff --git a/core/os/os.h b/core/os/os.h index f5994cd0c16..121c47bf4e8 100644 --- a/core/os/os.h +++ b/core/os/os.h @@ -471,6 +471,7 @@ public: virtual void set_screen_orientation(ScreenOrientation p_orientation); virtual ScreenOrientation get_screen_orientation() const; + ScreenOrientation get_screen_orientation_from_string(const String &p_orientation) const; virtual void enable_for_stealing_focus(ProcessID pid) {} virtual void move_window_to_foreground() {} diff --git a/doc/classes/ProjectSettings.xml b/doc/classes/ProjectSettings.xml index 8a4bca95a5d..cc60577c1c1 100644 --- a/doc/classes/ProjectSettings.xml +++ b/doc/classes/ProjectSettings.xml @@ -464,7 +464,8 @@ If [code]true[/code], keeps the screen on (even in case of inactivity), so the screensaver does not take over. Works on desktop and mobile platforms. - Default orientation on mobile devices. + The default screen orientation to use on mobile devices. + [b]Note:[/b] When set to a portrait orientation, this project setting does not flip the project resolution's width and height automatically. Instead, you have to set [member display/window/size/width] and [member display/window/size/height] accordingly. If [code]true[/code], the home indicator is hidden automatically. This only affects iOS devices without a physical home button. diff --git a/platform/android/export/export.cpp b/platform/android/export/export.cpp index 6d8808fbc05..2500a7a1f0a 100644 --- a/platform/android/export/export.cpp +++ b/platform/android/export/export.cpp @@ -855,7 +855,8 @@ class EditorExportPlatformAndroid : public EditorExportPlatform { int version_code = p_preset->get("version/code"); String package_name = p_preset->get("package/unique_name"); - const int screen_orientation = _get_android_orientation_value(_get_screen_orientation()); + const int screen_orientation = _get_android_orientation_value( + OS::get_singleton()->get_screen_orientation_from_string(GLOBAL_GET("display/window/handheld/orientation"))); bool min_gles3 = ProjectSettings::get_singleton()->get("rendering/quality/driver/driver_name") == "GLES3" && !ProjectSettings::get_singleton()->get("rendering/quality/driver/fallback_to_gles2"); diff --git a/platform/android/export/gradle_export_util.h b/platform/android/export/gradle_export_util.h index 727d2369112..2fc32ec9173 100644 --- a/platform/android/export/gradle_export_util.h +++ b/platform/android/export/gradle_export_util.h @@ -44,28 +44,6 @@ const String godot_project_name_xml_string = R"( )"; -OS::ScreenOrientation _get_screen_orientation() { - String orientation_settings = ProjectSettings::get_singleton()->get("display/window/handheld/orientation"); - OS::ScreenOrientation screen_orientation; - if (orientation_settings == "portrait") { - screen_orientation = OS::SCREEN_PORTRAIT; - } else if (orientation_settings == "reverse_landscape") { - screen_orientation = OS::SCREEN_REVERSE_LANDSCAPE; - } else if (orientation_settings == "reverse_portrait") { - screen_orientation = OS::SCREEN_REVERSE_PORTRAIT; - } else if (orientation_settings == "sensor_landscape") { - screen_orientation = OS::SCREEN_SENSOR_LANDSCAPE; - } else if (orientation_settings == "sensor_portrait") { - screen_orientation = OS::SCREEN_SENSOR_PORTRAIT; - } else if (orientation_settings == "sensor") { - screen_orientation = OS::SCREEN_SENSOR; - } else { - screen_orientation = OS::SCREEN_LANDSCAPE; - } - - return screen_orientation; -} - int _get_android_orientation_value(OS::ScreenOrientation screen_orientation) { switch (screen_orientation) { case OS::SCREEN_PORTRAIT: @@ -272,7 +250,8 @@ String _get_instrumentation_tag(const Ref &p_preset) { String _get_activity_tag(const Ref &p_preset) { bool uses_xr = (int)(p_preset->get("xr_features/xr_mode")) == 1; - String orientation = _get_android_orientation_label(_get_screen_orientation()); + String orientation = _get_android_orientation_label( + OS::get_singleton()->get_screen_orientation_from_string(GLOBAL_GET("display/window/handheld/orientation"))); String manifest_activity_text = vformat( " *r_options) r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "privacy/microphone_usage_description", PROPERTY_HINT_PLACEHOLDER_TEXT, "Provide a message if you need to use the microphone"), "")); r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "privacy/photolibrary_usage_description", PROPERTY_HINT_PLACEHOLDER_TEXT, "Provide a message if you need access to the photo library"), "")); - r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "orientation/portrait"), true)); - r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "orientation/landscape_left"), true)); - r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "orientation/landscape_right"), true)); - r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "orientation/portrait_upside_down"), true)); - r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "required_icons/iphone_120x120", PROPERTY_HINT_FILE, "*.png"), "")); // Home screen on iPhone/iPod Touch with retina display r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "required_icons/ipad_76x76", PROPERTY_HINT_FILE, "*.png"), "")); // Home screen on iPad r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "required_icons/app_store_1024x1024", PROPERTY_HINT_FILE, "*.png"), "")); // App Store @@ -497,18 +492,39 @@ void EditorExportPlatformIOS::_fix_config_file(const Ref &p_ strnew += lines[i].replace("$required_device_capabilities", capabilities); } else if (lines[i].find("$interface_orientations") != -1) { String orientations; + const OS::ScreenOrientation screen_orientation = + OS::get_singleton()->get_screen_orientation_from_string(GLOBAL_GET("display/window/handheld/orientation")); - if ((bool)p_preset->get("orientation/portrait")) { - orientations += "UIInterfaceOrientationPortrait\n"; - } - if ((bool)p_preset->get("orientation/landscape_left")) { - orientations += "UIInterfaceOrientationLandscapeLeft\n"; - } - if ((bool)p_preset->get("orientation/landscape_right")) { - orientations += "UIInterfaceOrientationLandscapeRight\n"; - } - if ((bool)p_preset->get("orientation/portrait_upside_down")) { - orientations += "UIInterfaceOrientationPortraitUpsideDown\n"; + switch (screen_orientation) { + case OS::SCREEN_LANDSCAPE: + orientations += "UIInterfaceOrientationLandscapeLeft\n"; + break; + case OS::SCREEN_PORTRAIT: + orientations += "UIInterfaceOrientationPortrait\n"; + break; + case OS::SCREEN_REVERSE_LANDSCAPE: + orientations += "UIInterfaceOrientationLandscapeRight\n"; + break; + case OS::SCREEN_REVERSE_PORTRAIT: + orientations += "UIInterfaceOrientationPortraitUpsideDown\n"; + break; + case OS::SCREEN_SENSOR_LANDSCAPE: + // Allow both landscape orientations depending on sensor direction. + orientations += "UIInterfaceOrientationLandscapeLeft\n"; + orientations += "UIInterfaceOrientationLandscapeRight\n"; + break; + case OS::SCREEN_SENSOR_PORTRAIT: + // Allow both portrait orientations depending on sensor direction. + orientations += "UIInterfaceOrientationPortrait\n"; + orientations += "UIInterfaceOrientationPortraitUpsideDown\n"; + break; + case OS::SCREEN_SENSOR: + // Allow all screen orientations depending on sensor direction. + orientations += "UIInterfaceOrientationLandscapeLeft\n"; + orientations += "UIInterfaceOrientationLandscapeRight\n"; + orientations += "UIInterfaceOrientationPortrait\n"; + orientations += "UIInterfaceOrientationPortraitUpsideDown\n"; + break; } strnew += lines[i].replace("$interface_orientations", orientations);