diff options
| -rw-r--r-- | drivers/dummy/rasterizer_dummy.h | 1 | ||||
| -rw-r--r-- | editor/project_manager.cpp | 5 | ||||
| -rw-r--r-- | misc/dist/html/editor.html | 6 | ||||
| -rw-r--r-- | modules/tga/image_loader_tga.cpp | 25 | ||||
| -rw-r--r-- | modules/tga/image_loader_tga.h | 2 | ||||
| -rw-r--r-- | platform/javascript/javascript_main.cpp | 7 | 
6 files changed, 39 insertions, 7 deletions
diff --git a/drivers/dummy/rasterizer_dummy.h b/drivers/dummy/rasterizer_dummy.h index 72ab18d115..e69f36e16f 100644 --- a/drivers/dummy/rasterizer_dummy.h +++ b/drivers/dummy/rasterizer_dummy.h @@ -566,6 +566,7 @@ public:  	AABB mesh_get_custom_aabb(RID p_mesh) const override { return AABB(); }  	AABB mesh_get_aabb(RID p_mesh, RID p_skeleton = RID()) override { return AABB(); } +	void mesh_set_shadow_mesh(RID p_mesh, RID p_shadow_mesh) override {}  	void mesh_clear(RID p_mesh) override {}  	/* MULTIMESH API */ diff --git a/editor/project_manager.cpp b/editor/project_manager.cpp index 5951373af9..afbed0c610 100644 --- a/editor/project_manager.cpp +++ b/editor/project_manager.cpp @@ -2281,6 +2281,11 @@ void ProjectManager::_install_project(const String &p_zip_path, const String &p_  }  void ProjectManager::_files_dropped(PackedStringArray p_files, int p_screen) { +	if (p_files.size() == 1 && p_files[0].ends_with(".zip")) { +		const String file = p_files[0].get_file(); +		_install_project(p_files[0], file.substr(0, file.length() - 4).capitalize()); +		return; +	}  	Set<String> folders_set;  	DirAccess *da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM);  	for (int i = 0; i < p_files.size(); i++) { diff --git a/misc/dist/html/editor.html b/misc/dist/html/editor.html index 53ad826730..540ab94e51 100644 --- a/misc/dist/html/editor.html +++ b/misc/dist/html/editor.html @@ -326,7 +326,7 @@  		function startEditor(zip) {  			const INDETERMINATE_STATUS_STEP_MS = 100; -			const persistentPaths = ['/home/web_user/.config', '/home/web_user/.cache', '/home/web_user/projects']; +			const persistentPaths = ['/home/web_user/'];  			var editorCanvas = document.getElementById('editor-canvas');  			var gameCanvas = document.getElementById('game-canvas'); @@ -493,11 +493,11 @@  				engine.setUnloadAfterInit(false); // Don't want to reload when starting game.  				engine.init('godot.tools').then(function() {  					if (zip) { -						engine.copyToFS("/home/web_user/preload.zip", zip); +						engine.copyToFS("/tmp/preload.zip", zip);  					}  					try {  						// Avoid user creating project in the persistent root folder. -						engine.copyToFS("/home/web_user/projects/keep", new Uint8Array()); +						engine.copyToFS("/home/web_user/keep", new Uint8Array());  					} catch(e) {  						// File exists  					} diff --git a/modules/tga/image_loader_tga.cpp b/modules/tga/image_loader_tga.cpp index 2da9159228..ef53661557 100644 --- a/modules/tga/image_loader_tga.cpp +++ b/modules/tga/image_loader_tga.cpp @@ -56,6 +56,10 @@ Error ImageLoaderTGA::decode_tga_rle(const uint8_t *p_compressed_buffer, size_t  		compressed_pos += 1;  		count = (c & 0x7f) + 1; +		if (output_pos + count * p_pixel_size > output_pos) { +			return ERR_PARSE_ERROR; +		} +  		if (c & 0x80) {  			for (size_t i = 0; i < p_pixel_size; i++) {  				pixels_w[i] = p_compressed_buffer[compressed_pos]; @@ -79,7 +83,7 @@ Error ImageLoaderTGA::decode_tga_rle(const uint8_t *p_compressed_buffer, size_t  	return OK;  } -Error ImageLoaderTGA::convert_to_image(Ref<Image> p_image, const uint8_t *p_buffer, const tga_header_s &p_header, const uint8_t *p_palette, const bool p_is_monochrome) { +Error ImageLoaderTGA::convert_to_image(Ref<Image> p_image, const uint8_t *p_buffer, const tga_header_s &p_header, const uint8_t *p_palette, const bool p_is_monochrome, size_t p_output_size) {  #define TGA_PUT_PIXEL(r, g, b, a)             \  	int image_data_ofs = ((y * width) + x);   \  	image_data_w[image_data_ofs * 4 + 0] = r; \ @@ -130,6 +134,9 @@ Error ImageLoaderTGA::convert_to_image(Ref<Image> p_image, const uint8_t *p_buff  		if (p_is_monochrome) {  			while (y != y_end) {  				while (x != x_end) { +					if (i > p_output_size) { +						return ERR_PARSE_ERROR; +					}  					uint8_t shade = p_buffer[i];  					TGA_PUT_PIXEL(shade, shade, shade, 0xff) @@ -143,6 +150,9 @@ Error ImageLoaderTGA::convert_to_image(Ref<Image> p_image, const uint8_t *p_buff  		} else {  			while (y != y_end) {  				while (x != x_end) { +					if (i > p_output_size) { +						return ERR_PARSE_ERROR; +					}  					uint8_t index = p_buffer[i];  					uint8_t r = 0x00;  					uint8_t g = 0x00; @@ -171,6 +181,10 @@ Error ImageLoaderTGA::convert_to_image(Ref<Image> p_image, const uint8_t *p_buff  	} else if (p_header.pixel_depth == 24) {  		while (y != y_end) {  			while (x != x_end) { +				if (i + 2 > p_output_size) { +					return ERR_PARSE_ERROR; +				} +  				uint8_t r = p_buffer[i + 2];  				uint8_t g = p_buffer[i + 1];  				uint8_t b = p_buffer[i + 0]; @@ -186,6 +200,10 @@ Error ImageLoaderTGA::convert_to_image(Ref<Image> p_image, const uint8_t *p_buff  	} else if (p_header.pixel_depth == 32) {  		while (y != y_end) {  			while (x != x_end) { +				if (i + 3 > p_output_size) { +					return ERR_PARSE_ERROR; +				} +  				uint8_t a = p_buffer[i + 3];  				uint8_t r = p_buffer[i + 2];  				uint8_t g = p_buffer[i + 1]; @@ -279,7 +297,7 @@ Error ImageLoaderTGA::load_image(Ref<Image> p_image, FileAccess *f, bool p_force  		const uint8_t *src_image_r = src_image.ptr();  		const size_t pixel_size = tga_header.pixel_depth >> 3; -		const size_t buffer_size = (tga_header.image_width * tga_header.image_height) * pixel_size; +		size_t buffer_size = (tga_header.image_width * tga_header.image_height) * pixel_size;  		Vector<uint8_t> uncompressed_buffer;  		uncompressed_buffer.resize(buffer_size); @@ -297,11 +315,12 @@ Error ImageLoaderTGA::load_image(Ref<Image> p_image, FileAccess *f, bool p_force  			}  		} else {  			buffer = src_image_r; +			buffer_size = src_image_len;  		};  		if (err == OK) {  			const uint8_t *palette_r = palette.ptr(); -			err = convert_to_image(p_image, buffer, tga_header, palette_r, is_monochrome); +			err = convert_to_image(p_image, buffer, tga_header, palette_r, is_monochrome, buffer_size);  		}  	} diff --git a/modules/tga/image_loader_tga.h b/modules/tga/image_loader_tga.h index 249e33411e..bbfc3fed32 100644 --- a/modules/tga/image_loader_tga.h +++ b/modules/tga/image_loader_tga.h @@ -73,7 +73,7 @@ class ImageLoaderTGA : public ImageFormatLoader {  		uint8_t image_descriptor;  	};  	static Error decode_tga_rle(const uint8_t *p_compressed_buffer, size_t p_pixel_size, uint8_t *p_uncompressed_buffer, size_t p_output_size); -	static Error convert_to_image(Ref<Image> p_image, const uint8_t *p_buffer, const tga_header_s &p_header, const uint8_t *p_palette, const bool p_is_monochrome); +	static Error convert_to_image(Ref<Image> p_image, const uint8_t *p_buffer, const tga_header_s &p_header, const uint8_t *p_palette, const bool p_is_monochrome, size_t p_output_size);  public:  	virtual Error load_image(Ref<Image> p_image, FileAccess *f, bool p_force_linear, float p_scale); diff --git a/platform/javascript/javascript_main.cpp b/platform/javascript/javascript_main.cpp index 0b8af70b13..0fe95b0a8f 100644 --- a/platform/javascript/javascript_main.cpp +++ b/platform/javascript/javascript_main.cpp @@ -88,6 +88,13 @@ extern EMSCRIPTEN_KEEPALIVE int godot_js_main(int argc, char *argv[]) {  	Main::start();  	os->get_main_loop()->initialize(); +#ifdef TOOLS_ENABLED +	if (Main::is_project_manager() && FileAccess::exists("/tmp/preload.zip")) { +		PackedStringArray ps; +		ps.push_back("/tmp/preload.zip"); +		os->get_main_loop()->emit_signal("files_dropped", ps, -1); +	} +#endif  	emscripten_set_main_loop(main_loop_callback, -1, false);  	// Immediately run the first iteration.  	// We are inside an animation frame, we want to immediately draw on the newly setup canvas.  |