| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | /*************************************************************************/ | 
					
						
							|  |  |  | /*  export.cpp                                                           */ | 
					
						
							|  |  |  | /*************************************************************************/ | 
					
						
							|  |  |  | /*                       This file is part of:                           */ | 
					
						
							|  |  |  | /*                           GODOT ENGINE                                */ | 
					
						
							|  |  |  | /*                    http://www.godotengine.org                         */ | 
					
						
							|  |  |  | /*************************************************************************/ | 
					
						
							| 
									
										
										
										
											2017-01-01 22:01:57 +01:00
										 |  |  | /* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur.                 */ | 
					
						
							| 
									
										
										
										
											2017-04-08 00:11:42 +02:00
										 |  |  | /* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md)    */ | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* Permission is hereby granted, free of charge, to any person obtaining */ | 
					
						
							|  |  |  | /* a copy of this software and associated documentation files (the       */ | 
					
						
							|  |  |  | /* "Software"), to deal in the Software without restriction, including   */ | 
					
						
							|  |  |  | /* without limitation the rights to use, copy, modify, merge, publish,   */ | 
					
						
							|  |  |  | /* distribute, sublicense, and/or sell copies of the Software, and to    */ | 
					
						
							|  |  |  | /* permit persons to whom the Software is furnished to do so, subject to */ | 
					
						
							|  |  |  | /* the following conditions:                                             */ | 
					
						
							|  |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* The above copyright notice and this permission notice shall be        */ | 
					
						
							|  |  |  | /* included in all copies or substantial portions of the Software.       */ | 
					
						
							|  |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */ | 
					
						
							|  |  |  | /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */ | 
					
						
							|  |  |  | /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ | 
					
						
							|  |  |  | /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */ | 
					
						
							|  |  |  | /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */ | 
					
						
							|  |  |  | /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */ | 
					
						
							|  |  |  | /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */ | 
					
						
							|  |  |  | /*************************************************************************/ | 
					
						
							| 
									
										
										
										
											2017-03-05 14:21:25 +01:00
										 |  |  | #include "editor/editor_node.h"
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | #include "editor_export.h"
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | #include "io/zip_io.h"
 | 
					
						
							| 
									
										
										
										
											2017-06-23 22:03:41 +07:00
										 |  |  | #include "platform/javascript/logo.gen.h"
 | 
					
						
							| 
									
										
										
										
											2017-05-25 20:57:13 +02:00
										 |  |  | #include "platform/javascript/run_icon.gen.h"
 | 
					
						
							| 
									
										
										
										
											2017-01-25 21:55:59 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | #define EXPORT_TEMPLATE_WEBASSEMBLY_RELEASE "webassembly_release.zip"
 | 
					
						
							|  |  |  | #define EXPORT_TEMPLATE_WEBASSEMBLY_DEBUG "webassembly_debug.zip"
 | 
					
						
							|  |  |  | #define EXPORT_TEMPLATE_ASMJS_RELEASE "javascript_release.zip"
 | 
					
						
							|  |  |  | #define EXPORT_TEMPLATE_ASMJS_DEBUG "javascript_debug.zip"
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | class EditorExportPlatformJavaScript : public EditorExportPlatform { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 	GDCLASS(EditorExportPlatformJavaScript, EditorExportPlatform) | 
					
						
							| 
									
										
										
										
											2016-01-20 03:21:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	Ref<ImageTexture> logo; | 
					
						
							| 
									
										
										
										
											2017-05-25 20:57:13 +02:00
										 |  |  | 	Ref<ImageTexture> run_icon; | 
					
						
							| 
									
										
										
										
											2017-06-27 03:13:36 +02:00
										 |  |  | 	bool runnable_when_last_polled; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 	void _fix_html(Vector<uint8_t> &p_html, const Ref<EditorExportPreset> &p_preset, const String &p_name, bool p_debug); | 
					
						
							|  |  |  | 	void _fix_fsloader_js(Vector<uint8_t> &p_js, const String &p_pack_name, uint64_t p_pack_size); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 	enum Target { | 
					
						
							|  |  |  | 		TARGET_WEBASSEMBLY, | 
					
						
							|  |  |  | 		TARGET_ASMJS | 
					
						
							|  |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 	virtual void get_preset_features(const Ref<EditorExportPreset> &p_preset, List<String> *r_features); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 	virtual void get_export_options(List<ExportOption> *r_options); | 
					
						
							|  |  |  | 	virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 	virtual String get_name() const; | 
					
						
							| 
									
										
										
										
											2017-07-19 17:00:46 -03:00
										 |  |  | 	virtual String get_os_name() const; | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 	virtual Ref<Texture> get_logo() const; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 	virtual bool can_export(const Ref<EditorExportPreset> &p_preset, String &r_error, bool &r_missing_templates) const; | 
					
						
							|  |  |  | 	virtual String get_binary_extension() const; | 
					
						
							|  |  |  | 	virtual Error export_project(const Ref<EditorExportPreset> &p_preset, bool p_debug, const String &p_path, int p_flags = 0); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-27 03:13:36 +02:00
										 |  |  | 	virtual bool poll_devices(); | 
					
						
							|  |  |  | 	virtual int get_device_count() const; | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 	virtual String get_device_name(int p_device) const { return TTR("Run in Browser"); } | 
					
						
							|  |  |  | 	virtual String get_device_info(int p_device) const { return TTR("Run exported HTML in the system's default browser."); } | 
					
						
							|  |  |  | 	virtual Error run(const Ref<EditorExportPreset> &p_preset, int p_device, int p_debug_flags); | 
					
						
							| 
									
										
										
										
											2017-05-25 20:57:13 +02:00
										 |  |  | 	virtual Ref<Texture> get_run_icon() const; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-19 17:00:46 -03:00
										 |  |  | 	virtual void get_platform_features(List<String> *r_features) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		r_features->push_back("web"); | 
					
						
							|  |  |  | 		r_features->push_back("JavaScript"); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	EditorExportPlatformJavaScript(); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | void EditorExportPlatformJavaScript::_fix_html(Vector<uint8_t> &p_html, const Ref<EditorExportPreset> &p_preset, const String &p_name, bool p_debug) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 	String str_template = String::utf8(reinterpret_cast<const char *>(p_html.ptr()), p_html.size()); | 
					
						
							|  |  |  | 	String str_export; | 
					
						
							|  |  |  | 	Vector<String> lines = str_template.split("\n"); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 	int memory_mb; | 
					
						
							|  |  |  | 	if (p_preset->get("options/target").operator int() != TARGET_ASMJS) | 
					
						
							|  |  |  | 		// WebAssembly allows memory growth, so start with a reasonable default
 | 
					
						
							|  |  |  | 		memory_mb = 1 << 4; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	else | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 		memory_mb = 1 << (p_preset->get("options/memory_size").operator int() + 5); | 
					
						
							| 
									
										
										
										
											2016-01-20 03:21:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 	for (int i = 0; i < lines.size(); i++) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 		String current_line = lines[i]; | 
					
						
							|  |  |  | 		current_line = current_line.replace("$GODOT_TMEM", itos(memory_mb * 1024 * 1024)); | 
					
						
							|  |  |  | 		current_line = current_line.replace("$GODOT_BASE", p_name); | 
					
						
							|  |  |  | 		current_line = current_line.replace("$GODOT_HEAD_INCLUDE", p_preset->get("html/head_include")); | 
					
						
							|  |  |  | 		current_line = current_line.replace("$GODOT_DEBUG_ENABLED", p_debug ? "true" : "false"); | 
					
						
							|  |  |  | 		str_export += current_line + "\n"; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 	CharString cs = str_export.utf8(); | 
					
						
							|  |  |  | 	p_html.resize(cs.length()); | 
					
						
							|  |  |  | 	for (int i = 0; i < cs.length(); i++) { | 
					
						
							|  |  |  | 		p_html[i] = cs[i]; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | void EditorExportPlatformJavaScript::_fix_fsloader_js(Vector<uint8_t> &p_js, const String &p_pack_name, uint64_t p_pack_size) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 	String str_template = String::utf8(reinterpret_cast<const char *>(p_js.ptr()), p_js.size()); | 
					
						
							|  |  |  | 	String str_export; | 
					
						
							|  |  |  | 	Vector<String> lines = str_template.split("\n"); | 
					
						
							|  |  |  | 	for (int i = 0; i < lines.size(); i++) { | 
					
						
							|  |  |  | 		if (lines[i].find("$GODOT_PACK_NAME") != -1) { | 
					
						
							|  |  |  | 			str_export += lines[i].replace("$GODOT_PACK_NAME", p_pack_name); | 
					
						
							|  |  |  | 		} else if (lines[i].find("$GODOT_PACK_SIZE") != -1) { | 
					
						
							|  |  |  | 			str_export += lines[i].replace("$GODOT_PACK_SIZE", itos(p_pack_size)); | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			str_export += lines[i] + "\n"; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 	CharString cs = str_export.utf8(); | 
					
						
							|  |  |  | 	p_js.resize(cs.length()); | 
					
						
							|  |  |  | 	for (int i = 0; i < cs.length(); i++) { | 
					
						
							|  |  |  | 		p_js[i] = cs[i]; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | void EditorExportPlatformJavaScript::get_preset_features(const Ref<EditorExportPreset> &p_preset, List<String> *r_features) { | 
					
						
							| 
									
										
										
										
											2015-09-10 00:10:54 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 	if (p_preset->get("texture_format/s3tc")) { | 
					
						
							|  |  |  | 		r_features->push_back("s3tc"); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 	if (p_preset->get("texture_format/etc")) { | 
					
						
							|  |  |  | 		r_features->push_back("etc"); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if (p_preset->get("texture_format/etc2")) { | 
					
						
							|  |  |  | 		r_features->push_back("etc2"); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | void EditorExportPlatformJavaScript::get_export_options(List<ExportOption> *r_options) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 	r_options->push_back(ExportOption(PropertyInfo(Variant::INT, "options/target", PROPERTY_HINT_ENUM, "WebAssembly,asm.js"), TARGET_WEBASSEMBLY)); | 
					
						
							|  |  |  | 	r_options->push_back(ExportOption(PropertyInfo(Variant::INT, "options/memory_size", PROPERTY_HINT_ENUM, "32 MB,64 MB,128 MB,256 MB,512 MB,1 GB"), 3)); | 
					
						
							|  |  |  | 	r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "texture_format/s3tc"), false)); | 
					
						
							|  |  |  | 	r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "texture_format/etc"), true)); | 
					
						
							|  |  |  | 	r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "texture_format/etc2"), false)); | 
					
						
							|  |  |  | 	r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "html/head_include", PROPERTY_HINT_MULTILINE_TEXT), "")); | 
					
						
							|  |  |  | 	r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "custom_template/release", PROPERTY_HINT_GLOBAL_FILE, "zip"), "")); | 
					
						
							|  |  |  | 	r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "custom_template/debug", PROPERTY_HINT_GLOBAL_FILE, "zip"), "")); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | bool EditorExportPlatformJavaScript::get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const { | 
					
						
							| 
									
										
										
										
											2014-02-13 18:03:28 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 	if (p_option == "options/memory_size") { | 
					
						
							|  |  |  | 		return p_options["options/target"].operator int() == TARGET_ASMJS; | 
					
						
							| 
									
										
										
										
											2014-02-13 18:03:28 -03:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 	return true; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | String EditorExportPlatformJavaScript::get_name() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return "HTML5"; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-19 17:00:46 -03:00
										 |  |  | String EditorExportPlatformJavaScript::get_os_name() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return "JavaScript"; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | Ref<Texture> EditorExportPlatformJavaScript::get_logo() const { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 	return logo; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | bool EditorExportPlatformJavaScript::can_export(const Ref<EditorExportPreset> &p_preset, String &r_error, bool &r_missing_templates) const { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 	r_missing_templates = false; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 	if (p_preset->get("options/target").operator int() == TARGET_WEBASSEMBLY) { | 
					
						
							|  |  |  | 		if (find_export_template(EXPORT_TEMPLATE_WEBASSEMBLY_RELEASE) == String()) | 
					
						
							|  |  |  | 			r_missing_templates = true; | 
					
						
							|  |  |  | 		else if (find_export_template(EXPORT_TEMPLATE_WEBASSEMBLY_DEBUG) == String()) | 
					
						
							|  |  |  | 			r_missing_templates = true; | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		if (find_export_template(EXPORT_TEMPLATE_ASMJS_RELEASE) == String()) | 
					
						
							|  |  |  | 			r_missing_templates = true; | 
					
						
							|  |  |  | 		else if (find_export_template(EXPORT_TEMPLATE_ASMJS_DEBUG) == String()) | 
					
						
							|  |  |  | 			r_missing_templates = true; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 	return !r_missing_templates; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | String EditorExportPlatformJavaScript::get_binary_extension() const { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 	return "html"; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | Error EditorExportPlatformJavaScript::export_project(const Ref<EditorExportPreset> &p_preset, bool p_debug, const String &p_path, int p_flags) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 	String custom_debug = p_preset->get("custom_template/debug"); | 
					
						
							|  |  |  | 	String custom_release = p_preset->get("custom_template/release"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	String template_path = p_debug ? custom_debug : custom_release; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 	template_path = template_path.strip_edges(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (template_path == String()) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (p_preset->get("options/target").operator int() == TARGET_WEBASSEMBLY) { | 
					
						
							|  |  |  | 			if (p_debug) | 
					
						
							|  |  |  | 				template_path = find_export_template(EXPORT_TEMPLATE_WEBASSEMBLY_DEBUG); | 
					
						
							|  |  |  | 			else | 
					
						
							|  |  |  | 				template_path = find_export_template(EXPORT_TEMPLATE_WEBASSEMBLY_RELEASE); | 
					
						
							| 
									
										
										
										
											2015-11-30 01:26:51 +01:00
										 |  |  | 		} else { | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 			if (p_debug) | 
					
						
							|  |  |  | 				template_path = find_export_template(EXPORT_TEMPLATE_ASMJS_DEBUG); | 
					
						
							|  |  |  | 			else | 
					
						
							|  |  |  | 				template_path = find_export_template(EXPORT_TEMPLATE_ASMJS_RELEASE); | 
					
						
							| 
									
										
										
										
											2015-11-30 01:26:51 +01:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 	if (template_path != String() && !FileAccess::exists(template_path)) { | 
					
						
							|  |  |  | 		EditorNode::get_singleton()->show_warning(TTR("Template file not found:\n") + template_path); | 
					
						
							|  |  |  | 		return ERR_FILE_NOT_FOUND; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 	String pck_path = p_path.get_basename() + ".pck"; | 
					
						
							|  |  |  | 	Error error = save_pack(p_preset, pck_path); | 
					
						
							|  |  |  | 	if (error != OK) { | 
					
						
							|  |  |  | 		EditorNode::get_singleton()->show_warning(TTR("Could not write file:\n") + pck_path); | 
					
						
							|  |  |  | 		return error; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-02-13 18:03:28 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 	FileAccess *f = FileAccess::open(pck_path, FileAccess::READ); | 
					
						
							| 
									
										
										
										
											2014-02-13 18:03:28 -03:00
										 |  |  | 	if (!f) { | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 		EditorNode::get_singleton()->show_warning(TTR("Could not read file:\n") + pck_path); | 
					
						
							|  |  |  | 		return ERR_FILE_CANT_READ; | 
					
						
							| 
									
										
										
										
											2014-02-13 18:03:28 -03:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 	size_t pack_size = f->get_len(); | 
					
						
							| 
									
										
										
										
											2014-02-13 18:03:28 -03:00
										 |  |  | 	memdelete(f); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 	FileAccess *src_f = NULL; | 
					
						
							|  |  |  | 	zlib_filefunc_def io = zipio_create_io_from_file(&src_f); | 
					
						
							|  |  |  | 	unzFile pkg = unzOpen2(template_path.utf8().get_data(), &io); | 
					
						
							| 
									
										
										
										
											2014-02-13 18:03:28 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	if (!pkg) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 		EditorNode::get_singleton()->show_warning(TTR("Could not open template for export:\n") + template_path); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 		return ERR_FILE_NOT_FOUND; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	int ret = unzGoToFirstFile(pkg); | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 	while (ret == UNZ_OK) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		//get filename
 | 
					
						
							|  |  |  | 		unz_file_info info; | 
					
						
							|  |  |  | 		char fname[16384]; | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 		ret = unzGetCurrentFileInfo(pkg, &info, fname, 16384, NULL, 0, NULL, 0); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 		String file = fname; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		Vector<uint8_t> data; | 
					
						
							|  |  |  | 		data.resize(info.uncompressed_size); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		//read
 | 
					
						
							|  |  |  | 		unzOpenCurrentFile(pkg); | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 		unzReadCurrentFile(pkg, data.ptr(), data.size()); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 		unzCloseCurrentFile(pkg); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		//write
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 		if (file == "godot.html") { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 			_fix_html(data, p_preset, p_path.get_file().get_basename(), p_debug); | 
					
						
							|  |  |  | 			file = p_path.get_file(); | 
					
						
							|  |  |  | 		} else if (file == "godotfs.js") { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 			_fix_fsloader_js(data, pck_path.get_file(), pack_size); | 
					
						
							|  |  |  | 			file = p_path.get_file().get_basename() + "fs.js"; | 
					
						
							|  |  |  | 		} else if (file == "godot.js") { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 			file = p_path.get_file().get_basename() + ".js"; | 
					
						
							|  |  |  | 		} else if (file == "godot.wasm") { | 
					
						
							| 
									
										
										
										
											2016-11-30 22:47:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 			file = p_path.get_file().get_basename() + ".wasm"; | 
					
						
							|  |  |  | 		} else if (file == "godot.asm.js") { | 
					
						
							| 
									
										
										
										
											2016-11-30 22:47:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 			file = p_path.get_file().get_basename() + ".asm.js"; | 
					
						
							|  |  |  | 		} else if (file == "godot.mem") { | 
					
						
							| 
									
										
										
										
											2015-09-10 00:10:54 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 			file = p_path.get_file().get_basename() + ".mem"; | 
					
						
							| 
									
										
										
										
											2016-10-30 23:10:17 +01:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 		String dst = p_path.get_base_dir().plus_file(file); | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 		FileAccess *f = FileAccess::open(dst, FileAccess::WRITE); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 		if (!f) { | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 			EditorNode::get_singleton()->show_warning(TTR("Could not write file:\n") + dst); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 			unzClose(pkg); | 
					
						
							|  |  |  | 			return ERR_FILE_CANT_WRITE; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 		f->store_buffer(data.ptr(), data.size()); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 		memdelete(f); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		ret = unzGoToNextFile(pkg); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return OK; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-27 03:13:36 +02:00
										 |  |  | bool EditorExportPlatformJavaScript::poll_devices() { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Ref<EditorExportPreset> preset; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for (int i = 0; i < EditorExport::get_singleton()->get_export_preset_count(); i++) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		Ref<EditorExportPreset> ep = EditorExport::get_singleton()->get_export_preset(i); | 
					
						
							|  |  |  | 		if (ep->is_runnable() && ep->get_platform() == this) { | 
					
						
							|  |  |  | 			preset = ep; | 
					
						
							|  |  |  | 			break; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	bool prev = runnable_when_last_polled; | 
					
						
							|  |  |  | 	runnable_when_last_polled = preset.is_valid(); | 
					
						
							|  |  |  | 	return runnable_when_last_polled != prev; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int EditorExportPlatformJavaScript::get_device_count() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return runnable_when_last_polled; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | Error EditorExportPlatformJavaScript::run(const Ref<EditorExportPreset> &p_preset, int p_device, int p_debug_flags) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 	String path = EditorSettings::get_singleton()->get_settings_path() + "/tmp/tmp_export.html"; | 
					
						
							|  |  |  | 	Error err = export_project(p_preset, true, path, p_debug_flags); | 
					
						
							|  |  |  | 	if (err) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 		return err; | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	OS::get_singleton()->shell_open(path); | 
					
						
							|  |  |  | 	return OK; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-25 20:57:13 +02:00
										 |  |  | Ref<Texture> EditorExportPlatformJavaScript::get_run_icon() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return run_icon; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | EditorExportPlatformJavaScript::EditorExportPlatformJavaScript() { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-17 07:36:47 -03:00
										 |  |  | 	Ref<Image> img = memnew(Image(_javascript_logo)); | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 	logo.instance(); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	logo->create_from_image(img); | 
					
						
							| 
									
										
										
										
											2017-05-25 20:57:13 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	img = Ref<Image>(memnew(Image(_javascript_run_icon))); | 
					
						
							|  |  |  | 	run_icon.instance(); | 
					
						
							|  |  |  | 	run_icon->create_from_image(img); | 
					
						
							| 
									
										
										
										
											2017-06-27 03:13:36 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	runnable_when_last_polled = false; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void register_javascript_exporter() { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 03:21:21 +02:00
										 |  |  | 	Ref<EditorExportPlatformJavaScript> platform; | 
					
						
							|  |  |  | 	platform.instance(); | 
					
						
							|  |  |  | 	EditorExport::get_singleton()->add_export_platform(platform); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } |