diff options
Diffstat (limited to 'platform/iphone')
| -rw-r--r-- | platform/iphone/display_server_iphone.h | 7 | ||||
| -rw-r--r-- | platform/iphone/display_server_iphone.mm | 30 | ||||
| -rw-r--r-- | platform/iphone/export/export.cpp | 53 | ||||
| -rw-r--r-- | platform/iphone/os_iphone.mm | 4 | ||||
| -rw-r--r-- | platform/iphone/plugin/godot_plugin_config.h | 85 | ||||
| -rw-r--r-- | platform/iphone/vulkan_context_iphone.h | 2 | ||||
| -rw-r--r-- | platform/iphone/vulkan_context_iphone.mm | 4 | 
7 files changed, 155 insertions, 30 deletions
diff --git a/platform/iphone/display_server_iphone.h b/platform/iphone/display_server_iphone.h index 34c56382a4..6f64130b23 100644 --- a/platform/iphone/display_server_iphone.h +++ b/platform/iphone/display_server_iphone.h @@ -67,7 +67,7 @@ class DisplayServerIPhone : public DisplayServer {  	void perform_event(const Ref<InputEvent> &p_event); -	DisplayServerIPhone(const String &p_rendering_driver, DisplayServer::WindowMode p_mode, uint32_t p_flags, const Vector2i &p_resolution, Error &r_error); +	DisplayServerIPhone(const String &p_rendering_driver, DisplayServer::WindowMode p_mode, DisplayServer::VSyncMode p_vsync_mode, uint32_t p_flags, const Vector2i &p_resolution, Error &r_error);  	~DisplayServerIPhone();  public: @@ -76,7 +76,7 @@ public:  	static DisplayServerIPhone *get_singleton();  	static void register_iphone_driver(); -	static DisplayServer *create_func(const String &p_rendering_driver, WindowMode p_mode, uint32_t p_flags, const Vector2i &p_resolution, Error &r_error); +	static DisplayServer *create_func(const String &p_rendering_driver, WindowMode p_mode, DisplayServer::VSyncMode p_vsync_mode, uint32_t p_flags, const Vector2i &p_resolution, Error &r_error);  	static Vector<String> get_rendering_drivers_func();  	// MARK: - Events @@ -176,6 +176,9 @@ public:  	virtual bool can_any_window_draw() const override; +	virtual void window_set_vsync_mode(DisplayServer::VSyncMode p_vsync_mode, WindowID p_window = MAIN_WINDOW_ID) override; +	virtual DisplayServer::VSyncMode window_get_vsync_mode(WindowID p_vsync_mode) const override; +  	virtual bool screen_is_touchscreen(int p_screen) const override;  	virtual void virtual_keyboard_show(const String &p_existing_text, const Rect2 &p_screen_rect, bool p_multiline, int p_max_length, int p_cursor_start, int p_cursor_end) override; diff --git a/platform/iphone/display_server_iphone.mm b/platform/iphone/display_server_iphone.mm index 9e74de0842..bd95e2c703 100644 --- a/platform/iphone/display_server_iphone.mm +++ b/platform/iphone/display_server_iphone.mm @@ -48,7 +48,7 @@ DisplayServerIPhone *DisplayServerIPhone::get_singleton() {  	return (DisplayServerIPhone *)DisplayServer::get_singleton();  } -DisplayServerIPhone::DisplayServerIPhone(const String &p_rendering_driver, DisplayServer::WindowMode p_mode, uint32_t p_flags, const Vector2i &p_resolution, Error &r_error) { +DisplayServerIPhone::DisplayServerIPhone(const String &p_rendering_driver, WindowMode p_mode, DisplayServer::VSyncMode p_vsync_mode, uint32_t p_flags, const Vector2i &p_resolution, Error &r_error) {  	rendering_driver = p_rendering_driver;  #if defined(OPENGL_ENABLED) @@ -108,7 +108,7 @@ DisplayServerIPhone::DisplayServerIPhone(const String &p_rendering_driver, Displ  		}  		Size2i size = Size2i(layer.bounds.size.width, layer.bounds.size.height) * screen_get_max_scale(); -		if (context_vulkan->window_create(MAIN_WINDOW_ID, layer, size.width, size.height) != OK) { +		if (context_vulkan->window_create(MAIN_WINDOW_ID, p_vsync_mode, layer, size.width, size.height) != OK) {  			memdelete(context_vulkan);  			context_vulkan = nullptr;  			ERR_FAIL_MSG("Failed to create Vulkan window."); @@ -147,8 +147,8 @@ DisplayServerIPhone::~DisplayServerIPhone() {  #endif  } -DisplayServer *DisplayServerIPhone::create_func(const String &p_rendering_driver, WindowMode p_mode, uint32_t p_flags, const Vector2i &p_resolution, Error &r_error) { -	return memnew(DisplayServerIPhone(p_rendering_driver, p_mode, p_flags, p_resolution, r_error)); +DisplayServer *DisplayServerIPhone::create_func(const String &p_rendering_driver, WindowMode p_mode, DisplayServer::VSyncMode p_vsync_mode, uint32_t p_flags, const Vector2i &p_resolution, Error &r_error) { +	return memnew(DisplayServerIPhone(p_rendering_driver, p_mode, p_vsync_mode, p_flags, p_resolution, r_error));  }  Vector<String> DisplayServerIPhone::get_rendering_drivers_func() { @@ -224,7 +224,7 @@ void DisplayServerIPhone::_window_callback(const Callable &p_callable, const Var  void DisplayServerIPhone::touch_press(int p_idx, int p_x, int p_y, bool p_pressed, bool p_double_click) {  	if (!GLOBAL_DEF("debug/disable_touch", false)) {  		Ref<InputEventScreenTouch> ev; -		ev.instance(); +		ev.instantiate();  		ev->set_index(p_idx);  		ev->set_pressed(p_pressed); @@ -236,7 +236,7 @@ void DisplayServerIPhone::touch_press(int p_idx, int p_x, int p_y, bool p_presse  void DisplayServerIPhone::touch_drag(int p_idx, int p_prev_x, int p_prev_y, int p_x, int p_y) {  	if (!GLOBAL_DEF("debug/disable_touch", false)) {  		Ref<InputEventScreenDrag> ev; -		ev.instance(); +		ev.instantiate();  		ev->set_index(p_idx);  		ev->set_position(Vector2(p_x, p_y));  		ev->set_relative(Vector2(p_x - p_prev_x, p_y - p_prev_y)); @@ -256,7 +256,7 @@ void DisplayServerIPhone::touches_cancelled(int p_idx) {  void DisplayServerIPhone::key(uint32_t p_key, bool p_pressed) {  	Ref<InputEventKey> ev; -	ev.instance(); +	ev.instantiate();  	ev->set_echo(false);  	ev->set_pressed(p_pressed);  	ev->set_keycode(p_key); @@ -581,3 +581,19 @@ void DisplayServerIPhone::resize_window(CGSize viewSize) {  	Variant resize_rect = Rect2i(Point2i(), size);  	_window_callback(window_resize_callback, resize_rect);  } + +void DisplayServerIPhone::window_set_vsync_mode(DisplayServer::VSyncMode p_vsync_mode, WindowID p_window) { +	_THREAD_SAFE_METHOD_ +#if defined(VULKAN_ENABLED) +	context_vulkan->set_vsync_mode(p_window, p_vsync_mode); +#endif +} + +DisplayServer::VSyncMode DisplayServerIPhone::window_get_vsync_mode(WindowID p_window) const { +	_THREAD_SAFE_METHOD_ +#if defined(VULKAN_ENABLED) +	return context_vulkan->get_vsync_mode(p_window); +#else +	return DisplayServer::VSYNC_ENABLED; +#endif +} diff --git a/platform/iphone/export/export.cpp b/platform/iphone/export/export.cpp index 73723b98a0..1d1961ac2f 100644 --- a/platform/iphone/export/export.cpp +++ b/platform/iphone/export/export.cpp @@ -31,11 +31,11 @@  #include "export.h"  #include "core/config/project_settings.h" +#include "core/io/file_access.h"  #include "core/io/image_loader.h"  #include "core/io/marshalls.h"  #include "core/io/resource_saver.h"  #include "core/io/zip_io.h" -#include "core/os/file_access.h"  #include "core/os/os.h"  #include "core/templates/safe_refcount.h"  #include "core/version.h" @@ -367,6 +367,26 @@ void EditorExportPlatformIOS::get_export_options(List<ExportOption> *r_options)  	for (int i = 0; i < found_plugins.size(); i++) {  		r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "plugins/" + found_plugins[i].name), false));  	} + +	for (int i = 0; i < found_plugins.size(); i++) { +		// Editable plugin plist values +		PluginConfigIOS plugin = found_plugins[i]; +		const String *K = nullptr; + +		while ((K = plugin.plist.next(K))) { +			String key = *K; +			PluginConfigIOS::PlistItem item = plugin.plist[key]; +			switch (item.type) { +				case PluginConfigIOS::PlistItemType::STRING_INPUT: { +					String preset_name = "plugins_plist/" + key; +					r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, preset_name), item.value)); +				} break; +				default: +					continue; +			} +		} +	} +  	plugins_changed.clear();  	plugins = found_plugins; @@ -820,7 +840,7 @@ Error EditorExportPlatformIOS::_export_loading_screen_file(const Ref<EditorExpor  	if (custom_launch_image_2x.length() > 0 && custom_launch_image_3x.length() > 0) {  		Ref<Image> image;  		String image_path = p_dest_dir.plus_file("splash@2x.png"); -		image.instance(); +		image.instantiate();  		Error err = image->load(custom_launch_image_2x);  		if (err) { @@ -834,7 +854,7 @@ Error EditorExportPlatformIOS::_export_loading_screen_file(const Ref<EditorExpor  		image.unref();  		image_path = p_dest_dir.plus_file("splash@3x.png"); -		image.instance(); +		image.instantiate();  		err = image->load(custom_launch_image_3x);  		if (err) { @@ -851,7 +871,7 @@ Error EditorExportPlatformIOS::_export_loading_screen_file(const Ref<EditorExpor  		const String splash_path = ProjectSettings::get_singleton()->get("application/boot_splash/image");  		if (!splash_path.is_empty()) { -			splash.instance(); +			splash.instantiate();  			const Error err = splash->load(splash_path);  			if (err) {  				splash.unref(); @@ -1467,13 +1487,28 @@ Error EditorExportPlatformIOS::_export_ios_plugins(const Ref<EditorExportPreset>  		while ((K = plugin.plist.next(K))) {  			String key = *K; -			String value = plugin.plist[key]; +			PluginConfigIOS::PlistItem item = plugin.plist[key]; + +			String value; + +			switch (item.type) { +				case PluginConfigIOS::PlistItemType::STRING_INPUT: { +					String preset_name = "plugins_plist/" + key; +					String input_value = p_preset->get(preset_name); +					value = "<string>" + input_value + "</string>"; +				} break; +				default: +					value = item.value; +					break; +			}  			if (key.is_empty() || value.is_empty()) {  				continue;  			} -			plist_values[key] = value; +			String plist_key = "<key>" + key + "</key>"; + +			plist_values[plist_key] = value;  		}  		// CPP Code @@ -1500,7 +1535,7 @@ Error EditorExportPlatformIOS::_export_ios_plugins(const Ref<EditorExportPreset>  				continue;  			} -			p_config_data.plist_content += "<key>" + key + "</key><string>" + value + "</string>\n"; +			p_config_data.plist_content += key + value + "\n";  		}  	} @@ -1999,7 +2034,7 @@ bool EditorExportPlatformIOS::can_export(const Ref<EditorExportPreset> &p_preset  EditorExportPlatformIOS::EditorExportPlatformIOS() {  	Ref<Image> img = memnew(Image(_iphone_logo)); -	logo.instance(); +	logo.instantiate();  	logo->create_from_image(img);  	plugins_changed.set(); @@ -2014,7 +2049,7 @@ EditorExportPlatformIOS::~EditorExportPlatformIOS() {  void register_iphone_exporter() {  	Ref<EditorExportPlatformIOS> platform; -	platform.instance(); +	platform.instantiate();  	EditorExport::get_singleton()->add_export_platform(platform);  } diff --git a/platform/iphone/os_iphone.mm b/platform/iphone/os_iphone.mm index 458834ce3a..1f08901082 100644 --- a/platform/iphone/os_iphone.mm +++ b/platform/iphone/os_iphone.mm @@ -33,9 +33,9 @@  #include "os_iphone.h"  #import "app_delegate.h"  #include "core/config/project_settings.h" +#include "core/io/dir_access.h" +#include "core/io/file_access.h"  #include "core/io/file_access_pack.h" -#include "core/os/dir_access.h" -#include "core/os/file_access.h"  #include "display_server_iphone.h"  #include "drivers/unix/syslog_logger.h"  #import "godot_view.h" diff --git a/platform/iphone/plugin/godot_plugin_config.h b/platform/iphone/plugin/godot_plugin_config.h index e2546e733c..06770260aa 100644 --- a/platform/iphone/plugin/godot_plugin_config.h +++ b/platform/iphone/plugin/godot_plugin_config.h @@ -70,6 +70,20 @@ struct PluginConfigIOS {  	inline static const char *PLIST_SECTION = "plist"; +	enum PlistItemType { +		UNKNOWN, +		STRING, +		INTEGER, +		BOOLEAN, +		RAW, +		STRING_INPUT, +	}; + +	struct PlistItem { +		PlistItemType type; +		String value; +	}; +  	// Set to true when the config file is properly loaded.  	bool valid_config = false;  	bool supports_targets = false; @@ -93,8 +107,10 @@ struct PluginConfigIOS {  	Vector<String> linker_flags;  	// Optional plist section -	// Supports only string types for now -	HashMap<String, String> plist; +	// String value is default value. +	// Currently supports `string`, `boolean`, `integer`, `raw`, `string_input` types +	// <name>:<type> = <value> +	HashMap<String, PlistItem> plist;  };  static inline String resolve_local_dependency_path(String plugin_config_dir, String dependency_path) { @@ -104,7 +120,7 @@ static inline String resolve_local_dependency_path(String plugin_config_dir, Str  		return absolute_path;  	} -	if (dependency_path.is_abs_path()) { +	if (dependency_path.is_absolute_path()) {  		return dependency_path;  	} @@ -121,7 +137,7 @@ static inline String resolve_system_dependency_path(String dependency_path) {  		return absolute_path;  	} -	if (dependency_path.is_abs_path()) { +	if (dependency_path.is_absolute_path()) {  		return dependency_path;  	} @@ -273,13 +289,68 @@ static inline PluginConfigIOS load_plugin_config(Ref<ConfigFile> config_file, co  		config_file->get_section_keys(PluginConfigIOS::PLIST_SECTION, &keys);  		for (int i = 0; i < keys.size(); i++) { -			String value = config_file->get_value(PluginConfigIOS::PLIST_SECTION, keys[i], String()); +			Vector<String> key_components = keys[i].split(":"); + +			String key_value = ""; +			PluginConfigIOS::PlistItemType key_type = PluginConfigIOS::PlistItemType::UNKNOWN; + +			if (key_components.size() == 1) { +				key_value = key_components[0]; +				key_type = PluginConfigIOS::PlistItemType::STRING; +			} else if (key_components.size() == 2) { +				key_value = key_components[0]; + +				if (key_components[1].to_lower() == "string") { +					key_type = PluginConfigIOS::PlistItemType::STRING; +				} else if (key_components[1].to_lower() == "integer") { +					key_type = PluginConfigIOS::PlistItemType::INTEGER; +				} else if (key_components[1].to_lower() == "boolean") { +					key_type = PluginConfigIOS::PlistItemType::BOOLEAN; +				} else if (key_components[1].to_lower() == "raw") { +					key_type = PluginConfigIOS::PlistItemType::RAW; +				} else if (key_components[1].to_lower() == "string_input") { +					key_type = PluginConfigIOS::PlistItemType::STRING_INPUT; +				} +			} -			if (value.is_empty()) { +			if (key_value.is_empty() || key_type == PluginConfigIOS::PlistItemType::UNKNOWN) {  				continue;  			} -			plugin_config.plist[keys[i]] = value; +			String value; + +			switch (key_type) { +				case PluginConfigIOS::PlistItemType::STRING: { +					String raw_value = config_file->get_value(PluginConfigIOS::PLIST_SECTION, keys[i], String()); +					value = "<string>" + raw_value + "</string>"; +				} break; +				case PluginConfigIOS::PlistItemType::INTEGER: { +					int raw_value = config_file->get_value(PluginConfigIOS::PLIST_SECTION, keys[i], 0); +					Dictionary value_dictionary; +					String value_format = "<integer>$value</integer>"; +					value_dictionary["value"] = raw_value; +					value = value_format.format(value_dictionary, "$_"); +				} break; +				case PluginConfigIOS::PlistItemType::BOOLEAN: +					if (config_file->get_value(PluginConfigIOS::PLIST_SECTION, keys[i], false)) { +						value = "<true/>"; +					} else { +						value = "<false/>"; +					} +					break; +				case PluginConfigIOS::PlistItemType::RAW: { +					String raw_value = config_file->get_value(PluginConfigIOS::PLIST_SECTION, keys[i], String()); +					value = raw_value; +				} break; +				case PluginConfigIOS::PlistItemType::STRING_INPUT: { +					String raw_value = config_file->get_value(PluginConfigIOS::PLIST_SECTION, keys[i], String()); +					value = raw_value; +				} break; +				default: +					continue; +			} + +			plugin_config.plist[key_value] = PluginConfigIOS::PlistItem{ key_type, value };  		}  	} diff --git a/platform/iphone/vulkan_context_iphone.h b/platform/iphone/vulkan_context_iphone.h index 88764e270e..ec6aaf46e8 100644 --- a/platform/iphone/vulkan_context_iphone.h +++ b/platform/iphone/vulkan_context_iphone.h @@ -39,7 +39,7 @@ class VulkanContextIPhone : public VulkanContext {  	virtual const char *_get_platform_surface_extension() const;  public: -	Error window_create(DisplayServer::WindowID p_window_id, CALayer *p_metal_layer, int p_width, int p_height); +	Error window_create(DisplayServer::WindowID p_window_id, DisplayServer::VSyncMode p_vsync_mode, CALayer *p_metal_layer, int p_width, int p_height);  	VulkanContextIPhone();  	~VulkanContextIPhone(); diff --git a/platform/iphone/vulkan_context_iphone.mm b/platform/iphone/vulkan_context_iphone.mm index 08c9007fbb..17f2b167b3 100644 --- a/platform/iphone/vulkan_context_iphone.mm +++ b/platform/iphone/vulkan_context_iphone.mm @@ -35,7 +35,7 @@ const char *VulkanContextIPhone::_get_platform_surface_extension() const {  	return VK_MVK_IOS_SURFACE_EXTENSION_NAME;  } -Error VulkanContextIPhone::window_create(DisplayServer::WindowID p_window_id, CALayer *p_metal_layer, int p_width, int p_height) { +Error VulkanContextIPhone::window_create(DisplayServer::WindowID p_window_id, DisplayServer::VSyncMode p_vsync_mode, CALayer *p_metal_layer, int p_width, int p_height) {  	VkIOSSurfaceCreateInfoMVK createInfo;  	createInfo.sType = VK_STRUCTURE_TYPE_IOS_SURFACE_CREATE_INFO_MVK;  	createInfo.pNext = nullptr; @@ -47,7 +47,7 @@ Error VulkanContextIPhone::window_create(DisplayServer::WindowID p_window_id, CA  			vkCreateIOSSurfaceMVK(_get_instance(), &createInfo, nullptr, &surface);  	ERR_FAIL_COND_V(err, ERR_CANT_CREATE); -	return _window_create(p_window_id, surface, p_width, p_height); +	return _window_create(p_window_id, p_vsync_mode, surface, p_width, p_height);  }  VulkanContextIPhone::VulkanContextIPhone() {}  |