| 
									
										
										
										
											2016-06-18 14:46:12 +02:00
										 |  |  | /*************************************************************************/ | 
					
						
							|  |  |  | /*  editor_preview_plugins.cpp                                           */ | 
					
						
							|  |  |  | /*************************************************************************/ | 
					
						
							|  |  |  | /*                       This file is part of:                           */ | 
					
						
							|  |  |  | /*                           GODOT ENGINE                                */ | 
					
						
							| 
									
										
										
										
											2017-08-27 14:16:55 +02:00
										 |  |  | /*                      https://godotengine.org                          */ | 
					
						
							| 
									
										
										
										
											2016-06-18 14:46:12 +02:00
										 |  |  | /*************************************************************************/ | 
					
						
							| 
									
										
										
										
											2019-01-01 12:53:14 +01:00
										 |  |  | /* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.                 */ | 
					
						
							|  |  |  | /* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)    */ | 
					
						
							| 
									
										
										
										
											2016-06-18 14:46:12 +02: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.                */ | 
					
						
							|  |  |  | /*************************************************************************/ | 
					
						
							| 
									
										
										
										
											2018-01-05 00:50:27 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | #include "editor_preview_plugins.h"
 | 
					
						
							| 
									
										
										
										
											2017-01-16 08:04:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 18:13:45 +02:00
										 |  |  | #include "core/io/file_access_memory.h"
 | 
					
						
							|  |  |  | #include "core/io/resource_loader.h"
 | 
					
						
							|  |  |  | #include "core/os/os.h"
 | 
					
						
							| 
									
										
										
										
											2017-12-30 13:38:51 +01:00
										 |  |  | #include "editor/editor_node.h"
 | 
					
						
							| 
									
										
										
										
											2017-08-26 17:46:49 +02:00
										 |  |  | #include "editor/editor_scale.h"
 | 
					
						
							| 
									
										
										
										
											2017-03-05 14:21:25 +01:00
										 |  |  | #include "editor/editor_settings.h"
 | 
					
						
							| 
									
										
										
										
											2019-02-12 17:18:13 +01:00
										 |  |  | #include "scene/resources/bit_map.h"
 | 
					
						
							| 
									
										
										
										
											2018-04-15 22:00:56 -05:00
										 |  |  | #include "scene/resources/dynamic_font.h"
 | 
					
						
							| 
									
										
										
										
											2017-08-26 17:46:49 +02:00
										 |  |  | #include "scene/resources/material.h"
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | #include "scene/resources/mesh.h"
 | 
					
						
							| 
									
										
										
										
											2016-07-06 19:04:21 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-28 20:23:40 +01:00
										 |  |  | void post_process_preview(Ref<Image> p_image) { | 
					
						
							| 
									
										
										
										
											2017-12-30 13:38:51 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (p_image->get_format() != Image::FORMAT_RGBA8) | 
					
						
							|  |  |  | 		p_image->convert(Image::FORMAT_RGBA8); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	p_image->lock(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	const int w = p_image->get_width(); | 
					
						
							|  |  |  | 	const int h = p_image->get_height(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	const int r = MIN(w, h) / 32; | 
					
						
							|  |  |  | 	const int r2 = r * r; | 
					
						
							|  |  |  | 	Color transparent = Color(0, 0, 0, 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for (int i = 0; i < r; i++) { | 
					
						
							|  |  |  | 		for (int j = 0; j < r; j++) { | 
					
						
							|  |  |  | 			int dx = i - r; | 
					
						
							|  |  |  | 			int dy = j - r; | 
					
						
							|  |  |  | 			if (dx * dx + dy * dy > r2) { | 
					
						
							|  |  |  | 				p_image->set_pixel(i, j, transparent); | 
					
						
							|  |  |  | 				p_image->set_pixel(w - 1 - i, j, transparent); | 
					
						
							|  |  |  | 				p_image->set_pixel(w - 1 - i, h - 1 - j, transparent); | 
					
						
							|  |  |  | 				p_image->set_pixel(i, h - 1 - j, transparent); | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	p_image->unlock(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | bool EditorTexturePreviewPlugin::handles(const String &p_type) const { | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	return ClassDB::is_parent_class(p_type, "Texture"); | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-20 10:45:12 +02:00
										 |  |  | bool EditorTexturePreviewPlugin::generate_small_preview_automatically() const { | 
					
						
							| 
									
										
										
										
											2018-09-12 13:10:49 +02:00
										 |  |  | 	return true; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Ref<Texture> EditorTexturePreviewPlugin::generate(const RES &p_from, const Size2 p_size) const { | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	Ref<Image> img; | 
					
						
							| 
									
										
										
										
											2016-01-19 04:27:27 +01:00
										 |  |  | 	Ref<AtlasTexture> atex = p_from; | 
					
						
							| 
									
										
										
										
											2019-01-03 13:08:06 +01:00
										 |  |  | 	Ref<LargeTexture> ltex = p_from; | 
					
						
							| 
									
										
										
										
											2016-01-19 04:27:27 +01:00
										 |  |  | 	if (atex.is_valid()) { | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 		Ref<Texture> tex = atex->get_atlas(); | 
					
						
							| 
									
										
										
										
											2016-01-19 04:27:27 +01:00
										 |  |  | 		if (!tex.is_valid()) { | 
					
						
							|  |  |  | 			return Ref<Texture>(); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2019-02-27 00:44:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 		Ref<Image> atlas = tex->get_data(); | 
					
						
							| 
									
										
										
										
											2019-02-27 00:44:09 +00:00
										 |  |  | 		if (!atlas.is_valid()) { | 
					
						
							|  |  |  | 			return Ref<Texture>(); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 		img = atlas->get_rect(atex->get_region()); | 
					
						
							| 
									
										
										
										
											2019-01-03 13:08:06 +01:00
										 |  |  | 	} else if (ltex.is_valid()) { | 
					
						
							|  |  |  | 		img = ltex->to_image(); | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	} else { | 
					
						
							|  |  |  | 		Ref<Texture> tex = p_from; | 
					
						
							| 
									
										
										
										
											2016-01-19 04:27:27 +01:00
										 |  |  | 		img = tex->get_data(); | 
					
						
							| 
									
										
										
										
											2019-01-27 13:39:16 -03:00
										 |  |  | 		if (img.is_valid()) { | 
					
						
							|  |  |  | 			img = img->duplicate(); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-01-19 04:27:27 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	if (img.is_null() || img->empty()) | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 		return Ref<Texture>(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	img->clear_mipmaps(); | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	if (img->is_compressed()) { | 
					
						
							|  |  |  | 		if (img->decompress() != OK) | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 			return Ref<Texture>(); | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	} else if (img->get_format() != Image::FORMAT_RGB8 && img->get_format() != Image::FORMAT_RGBA8) { | 
					
						
							|  |  |  | 		img->convert(Image::FORMAT_RGBA8); | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-12 13:10:49 +02:00
										 |  |  | 	Vector2 new_size = img->get_size(); | 
					
						
							|  |  |  | 	if (new_size.x > p_size.x) { | 
					
						
							|  |  |  | 		new_size = Vector2(p_size.x, new_size.y * p_size.x / new_size.x); | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-09-12 13:10:49 +02:00
										 |  |  | 	if (new_size.y > p_size.y) { | 
					
						
							|  |  |  | 		new_size = Vector2(new_size.x * p_size.y / new_size.y, p_size.y); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	img->resize(new_size.x, new_size.y, Image::INTERPOLATE_CUBIC); | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-30 13:38:51 +01:00
										 |  |  | 	post_process_preview(img); | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	Ref<ImageTexture> ptex = Ref<ImageTexture>(memnew(ImageTexture)); | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	ptex->create_from_image(img, 0); | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 	return ptex; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | EditorTexturePreviewPlugin::EditorTexturePreviewPlugin() { | 
					
						
							| 
									
										
										
										
											2016-01-03 17:14:28 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ////////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-29 16:45:23 -03:00
										 |  |  | bool EditorImagePreviewPlugin::handles(const String &p_type) const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return p_type == "Image"; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-12 13:10:49 +02:00
										 |  |  | Ref<Texture> EditorImagePreviewPlugin::generate(const RES &p_from, const Size2 p_size) const { | 
					
						
							| 
									
										
										
										
											2018-07-29 16:45:23 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	Ref<Image> img = p_from; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (img.is_null() || img->empty()) | 
					
						
							|  |  |  | 		return Ref<Image>(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	img = img->duplicate(); | 
					
						
							|  |  |  | 	img->clear_mipmaps(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (img->is_compressed()) { | 
					
						
							|  |  |  | 		if (img->decompress() != OK) | 
					
						
							|  |  |  | 			return Ref<Image>(); | 
					
						
							|  |  |  | 	} else if (img->get_format() != Image::FORMAT_RGB8 && img->get_format() != Image::FORMAT_RGBA8) { | 
					
						
							|  |  |  | 		img->convert(Image::FORMAT_RGBA8); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-12 13:10:49 +02:00
										 |  |  | 	Vector2 new_size = img->get_size(); | 
					
						
							|  |  |  | 	if (new_size.x > p_size.x) { | 
					
						
							|  |  |  | 		new_size = Vector2(p_size.x, new_size.y * p_size.x / new_size.x); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if (new_size.y > p_size.y) { | 
					
						
							|  |  |  | 		new_size = Vector2(new_size.x * p_size.y / new_size.y, p_size.y); | 
					
						
							| 
									
										
										
										
											2018-07-29 16:45:23 -03:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-09-12 13:10:49 +02:00
										 |  |  | 	img->resize(new_size.x, new_size.y, Image::INTERPOLATE_CUBIC); | 
					
						
							| 
									
										
										
										
											2018-07-29 16:45:23 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	post_process_preview(img); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Ref<ImageTexture> ptex; | 
					
						
							|  |  |  | 	ptex.instance(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ptex->create_from_image(img, 0); | 
					
						
							|  |  |  | 	return ptex; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | EditorImagePreviewPlugin::EditorImagePreviewPlugin() { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-20 10:45:12 +02:00
										 |  |  | bool EditorImagePreviewPlugin::generate_small_preview_automatically() const { | 
					
						
							| 
									
										
										
										
											2018-09-12 13:10:49 +02:00
										 |  |  | 	return true; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2018-07-29 16:45:23 -03:00
										 |  |  | ////////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | /////////////////////////////////////////////////
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | bool EditorBitmapPreviewPlugin::handles(const String &p_type) const { | 
					
						
							| 
									
										
										
										
											2016-01-03 17:14:28 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	return ClassDB::is_parent_class(p_type, "BitMap"); | 
					
						
							| 
									
										
										
										
											2016-01-03 17:14:28 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-12 13:10:49 +02:00
										 |  |  | Ref<Texture> EditorBitmapPreviewPlugin::generate(const RES &p_from, const Size2 p_size) const { | 
					
						
							| 
									
										
										
										
											2016-01-03 17:14:28 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	Ref<BitMap> bm = p_from; | 
					
						
							| 
									
										
										
										
											2016-01-03 17:14:28 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	if (bm->get_size() == Size2()) { | 
					
						
							| 
									
										
										
										
											2016-01-03 17:14:28 -03:00
										 |  |  | 		return Ref<Texture>(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-07 18:25:37 -03:00
										 |  |  | 	PoolVector<uint8_t> data; | 
					
						
							| 
									
										
										
										
											2016-01-03 17:14:28 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	data.resize(bm->get_size().width * bm->get_size().height); | 
					
						
							| 
									
										
										
										
											2016-01-03 17:14:28 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 		PoolVector<uint8_t>::Write w = data.write(); | 
					
						
							| 
									
										
										
										
											2016-01-03 17:14:28 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 		for (int i = 0; i < bm->get_size().width; i++) { | 
					
						
							|  |  |  | 			for (int j = 0; j < bm->get_size().height; j++) { | 
					
						
							|  |  |  | 				if (bm->get_bit(Point2i(i, j))) { | 
					
						
							|  |  |  | 					w[j * bm->get_size().width + i] = 255; | 
					
						
							| 
									
										
										
										
											2016-01-03 17:14:28 -03:00
										 |  |  | 				} else { | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 					w[j * bm->get_size().width + i] = 0; | 
					
						
							| 
									
										
										
										
											2016-01-03 17:14:28 -03:00
										 |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	Ref<Image> img; | 
					
						
							|  |  |  | 	img.instance(); | 
					
						
							|  |  |  | 	img->create(bm->get_size().width, bm->get_size().height, 0, Image::FORMAT_L8, data); | 
					
						
							| 
									
										
										
										
											2016-01-03 17:14:28 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	if (img->is_compressed()) { | 
					
						
							|  |  |  | 		if (img->decompress() != OK) | 
					
						
							| 
									
										
										
										
											2016-01-03 17:14:28 -03:00
										 |  |  | 			return Ref<Texture>(); | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	} else if (img->get_format() != Image::FORMAT_RGB8 && img->get_format() != Image::FORMAT_RGBA8) { | 
					
						
							|  |  |  | 		img->convert(Image::FORMAT_RGBA8); | 
					
						
							| 
									
										
										
										
											2016-01-03 17:14:28 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-12 13:10:49 +02:00
										 |  |  | 	Vector2 new_size = img->get_size(); | 
					
						
							|  |  |  | 	if (new_size.x > p_size.x) { | 
					
						
							|  |  |  | 		new_size = Vector2(p_size.x, new_size.y * p_size.x / new_size.x); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if (new_size.y > p_size.y) { | 
					
						
							|  |  |  | 		new_size = Vector2(new_size.x * p_size.y / new_size.y, p_size.y); | 
					
						
							| 
									
										
										
										
											2016-01-03 17:14:28 -03:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-09-12 13:10:49 +02:00
										 |  |  | 	img->resize(new_size.x, new_size.y, Image::INTERPOLATE_CUBIC); | 
					
						
							| 
									
										
										
										
											2016-01-03 17:14:28 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-30 13:38:51 +01:00
										 |  |  | 	post_process_preview(img); | 
					
						
							| 
									
										
										
										
											2016-01-03 17:14:28 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	Ref<ImageTexture> ptex = Ref<ImageTexture>(memnew(ImageTexture)); | 
					
						
							| 
									
										
										
										
											2016-01-03 17:14:28 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	ptex->create_from_image(img, 0); | 
					
						
							| 
									
										
										
										
											2016-01-03 17:14:28 -03:00
										 |  |  | 	return ptex; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-20 10:45:12 +02:00
										 |  |  | bool EditorBitmapPreviewPlugin::generate_small_preview_automatically() const { | 
					
						
							| 
									
										
										
										
											2018-09-12 13:10:49 +02:00
										 |  |  | 	return true; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-03 17:14:28 -03:00
										 |  |  | EditorBitmapPreviewPlugin::EditorBitmapPreviewPlugin() { | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ///////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | bool EditorPackedScenePreviewPlugin::handles(const String &p_type) const { | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	return ClassDB::is_parent_class(p_type, "PackedScene"); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2018-09-12 13:10:49 +02:00
										 |  |  | Ref<Texture> EditorPackedScenePreviewPlugin::generate(const RES &p_from, const Size2 p_size) const { | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-12 13:10:49 +02:00
										 |  |  | 	return generate_from_path(p_from->get_path(), p_size); | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-12 13:10:49 +02:00
										 |  |  | Ref<Texture> EditorPackedScenePreviewPlugin::generate_from_path(const String &p_path, const Size2 p_size) const { | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-17 21:48:24 +01:00
										 |  |  | 	String temp_path = EditorSettings::get_singleton()->get_cache_dir(); | 
					
						
							| 
									
										
										
										
											2017-07-19 17:00:46 -03:00
										 |  |  | 	String cache_base = ProjectSettings::get_singleton()->globalize_path(p_path).md5_text(); | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	cache_base = temp_path.plus_file("resthumb-" + cache_base); | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	//does not have it, try to load a cached thumbnail
 | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	String path = cache_base + ".png"; | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	if (!FileAccess::exists(path)) | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 		return Ref<Texture>(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	Ref<Image> img; | 
					
						
							|  |  |  | 	img.instance(); | 
					
						
							|  |  |  | 	Error err = img->load(path); | 
					
						
							|  |  |  | 	if (err == OK) { | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 		Ref<ImageTexture> ptex = Ref<ImageTexture>(memnew(ImageTexture)); | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-30 13:38:51 +01:00
										 |  |  | 		post_process_preview(img); | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 		ptex->create_from_image(img, 0); | 
					
						
							|  |  |  | 		return ptex; | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	} else { | 
					
						
							|  |  |  | 		return Ref<Texture>(); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | EditorPackedScenePreviewPlugin::EditorPackedScenePreviewPlugin() { | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | //////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void EditorMaterialPreviewPlugin::_preview_done(const Variant &p_udata) { | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	preview_done = true; | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | void EditorMaterialPreviewPlugin::_bind_methods() { | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	ClassDB::bind_method("_preview_done", &EditorMaterialPreviewPlugin::_preview_done); | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | bool EditorMaterialPreviewPlugin::handles(const String &p_type) const { | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	return ClassDB::is_parent_class(p_type, "Material"); //any material
 | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-20 10:45:12 +02:00
										 |  |  | bool EditorMaterialPreviewPlugin::generate_small_preview_automatically() const { | 
					
						
							| 
									
										
										
										
											2018-09-12 13:10:49 +02:00
										 |  |  | 	return true; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Ref<Texture> EditorMaterialPreviewPlugin::generate(const RES &p_from, const Size2 p_size) const { | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	Ref<Material> material = p_from; | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	ERR_FAIL_COND_V(material.is_null(), Ref<Texture>()); | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-06 19:43:22 -03:00
										 |  |  | 	if (material->get_shader_mode() == Shader::MODE_SPATIAL) { | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-06 19:43:22 -03:00
										 |  |  | 		VS::get_singleton()->mesh_surface_set_material(sphere, 0, material->get_rid()); | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-06 19:43:22 -03:00
										 |  |  | 		VS::get_singleton()->viewport_set_update_mode(viewport, VS::VIEWPORT_UPDATE_ONCE); //once used for capture
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-06 19:43:22 -03:00
										 |  |  | 		preview_done = false; | 
					
						
							| 
									
										
										
										
											2018-07-29 16:45:23 -03:00
										 |  |  | 		VS::get_singleton()->request_frame_drawn_callback(const_cast<EditorMaterialPreviewPlugin *>(this), "_preview_done", Variant()); | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-06 19:43:22 -03:00
										 |  |  | 		while (!preview_done) { | 
					
						
							|  |  |  | 			OS::get_singleton()->delay_usec(10); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-29 02:55:13 +09:00
										 |  |  | 		Ref<Image> img = VS::get_singleton()->texture_get_data(viewport_texture); | 
					
						
							| 
									
										
										
										
											2017-12-06 19:43:22 -03:00
										 |  |  | 		VS::get_singleton()->mesh_surface_set_material(sphere, 0, RID()); | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-06 19:43:22 -03:00
										 |  |  | 		ERR_FAIL_COND_V(!img.is_valid(), Ref<ImageTexture>()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		img->convert(Image::FORMAT_RGBA8); | 
					
						
							| 
									
										
										
										
											2018-09-12 13:10:49 +02:00
										 |  |  | 		int thumbnail_size = MAX(p_size.x, p_size.y); | 
					
						
							|  |  |  | 		img->resize(thumbnail_size, thumbnail_size, Image::INTERPOLATE_CUBIC); | 
					
						
							| 
									
										
										
										
											2017-12-30 13:38:51 +01:00
										 |  |  | 		post_process_preview(img); | 
					
						
							| 
									
										
										
										
											2017-12-06 19:43:22 -03:00
										 |  |  | 		Ref<ImageTexture> ptex = Ref<ImageTexture>(memnew(ImageTexture)); | 
					
						
							|  |  |  | 		ptex->create_from_image(img, 0); | 
					
						
							|  |  |  | 		return ptex; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return Ref<Texture>(); | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | EditorMaterialPreviewPlugin::EditorMaterialPreviewPlugin() { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	scenario = VS::get_singleton()->scenario_create(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	viewport = VS::get_singleton()->viewport_create(); | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	VS::get_singleton()->viewport_set_update_mode(viewport, VS::VIEWPORT_UPDATE_DISABLED); | 
					
						
							|  |  |  | 	VS::get_singleton()->viewport_set_scenario(viewport, scenario); | 
					
						
							|  |  |  | 	VS::get_singleton()->viewport_set_size(viewport, 128, 128); | 
					
						
							|  |  |  | 	VS::get_singleton()->viewport_set_transparent_background(viewport, true); | 
					
						
							|  |  |  | 	VS::get_singleton()->viewport_set_active(viewport, true); | 
					
						
							|  |  |  | 	VS::get_singleton()->viewport_set_vflip(viewport, true); | 
					
						
							|  |  |  | 	viewport_texture = VS::get_singleton()->viewport_get_texture(viewport); | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	camera = VS::get_singleton()->camera_create(); | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	VS::get_singleton()->viewport_attach_camera(viewport, camera); | 
					
						
							|  |  |  | 	VS::get_singleton()->camera_set_transform(camera, Transform(Basis(), Vector3(0, 0, 3))); | 
					
						
							|  |  |  | 	VS::get_singleton()->camera_set_perspective(camera, 45, 0.1, 10); | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-09 23:34:01 -03:00
										 |  |  | 	light = VS::get_singleton()->directional_light_create(); | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	light_instance = VS::get_singleton()->instance_create2(light, scenario); | 
					
						
							|  |  |  | 	VS::get_singleton()->instance_set_transform(light_instance, Transform().looking_at(Vector3(-1, -1, -1), Vector3(0, 1, 0))); | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-09 23:34:01 -03:00
										 |  |  | 	light2 = VS::get_singleton()->directional_light_create(); | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	VS::get_singleton()->light_set_color(light2, Color(0.7, 0.7, 0.7)); | 
					
						
							|  |  |  | 	//VS::get_singleton()->light_set_color(light2, Color(0.7, 0.7, 0.7));
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	light_instance2 = VS::get_singleton()->instance_create2(light2, scenario); | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	VS::get_singleton()->instance_set_transform(light_instance2, Transform().looking_at(Vector3(0, 1, 0), Vector3(0, 0, 1))); | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	sphere = VS::get_singleton()->mesh_create(); | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	sphere_instance = VS::get_singleton()->instance_create2(sphere, scenario); | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	int lats = 32; | 
					
						
							|  |  |  | 	int lons = 32; | 
					
						
							|  |  |  | 	float radius = 1.0; | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-07 18:25:37 -03:00
										 |  |  | 	PoolVector<Vector3> vertices; | 
					
						
							|  |  |  | 	PoolVector<Vector3> normals; | 
					
						
							|  |  |  | 	PoolVector<Vector2> uvs; | 
					
						
							|  |  |  | 	PoolVector<float> tangents; | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	Basis tt = Basis(Vector3(0, 1, 0), Math_PI * 0.5); | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	for (int i = 1; i <= lats; i++) { | 
					
						
							|  |  |  | 		double lat0 = Math_PI * (-0.5 + (double)(i - 1) / lats); | 
					
						
							|  |  |  | 		double z0 = Math::sin(lat0); | 
					
						
							|  |  |  | 		double zr0 = Math::cos(lat0); | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 		double lat1 = Math_PI * (-0.5 + (double)i / lats); | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 		double z1 = Math::sin(lat1); | 
					
						
							|  |  |  | 		double zr1 = Math::cos(lat1); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 		for (int j = lons; j >= 1; j--) { | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 			double lng0 = 2 * Math_PI * (double)(j - 1) / lons; | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 			double x0 = Math::cos(lng0); | 
					
						
							|  |  |  | 			double y0 = Math::sin(lng0); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 			double lng1 = 2 * Math_PI * (double)(j) / lons; | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 			double x1 = Math::cos(lng1); | 
					
						
							|  |  |  | 			double y1 = Math::sin(lng1); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 			Vector3 v[4] = { | 
					
						
							|  |  |  | 				Vector3(x1 * zr0, z0, y1 * zr0), | 
					
						
							|  |  |  | 				Vector3(x1 * zr1, z1, y1 * zr1), | 
					
						
							|  |  |  | 				Vector3(x0 * zr1, z1, y0 * zr1), | 
					
						
							|  |  |  | 				Vector3(x0 * zr0, z0, y0 * zr0) | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 			}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | #define ADD_POINT(m_idx)                                                                       \
 | 
					
						
							|  |  |  | 	normals.push_back(v[m_idx]);                                                               \ | 
					
						
							|  |  |  | 	vertices.push_back(v[m_idx] * radius);                                                     \ | 
					
						
							|  |  |  | 	{                                                                                          \ | 
					
						
							|  |  |  | 		Vector2 uv(Math::atan2(v[m_idx].x, v[m_idx].z), Math::atan2(-v[m_idx].y, v[m_idx].z)); \ | 
					
						
							|  |  |  | 		uv /= Math_PI;                                                                         \ | 
					
						
							|  |  |  | 		uv *= 4.0;                                                                             \ | 
					
						
							|  |  |  | 		uv = uv * 0.5 + Vector2(0.5, 0.5);                                                     \ | 
					
						
							|  |  |  | 		uvs.push_back(uv);                                                                     \ | 
					
						
							|  |  |  | 	}                                                                                          \ | 
					
						
							|  |  |  | 	{                                                                                          \ | 
					
						
							|  |  |  | 		Vector3 t = tt.xform(v[m_idx]);                                                        \ | 
					
						
							|  |  |  | 		tangents.push_back(t.x);                                                               \ | 
					
						
							|  |  |  | 		tangents.push_back(t.y);                                                               \ | 
					
						
							|  |  |  | 		tangents.push_back(t.z);                                                               \ | 
					
						
							|  |  |  | 		tangents.push_back(1.0);                                                               \ | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			ADD_POINT(0); | 
					
						
							|  |  |  | 			ADD_POINT(1); | 
					
						
							|  |  |  | 			ADD_POINT(2); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			ADD_POINT(2); | 
					
						
							|  |  |  | 			ADD_POINT(3); | 
					
						
							|  |  |  | 			ADD_POINT(0); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Array arr; | 
					
						
							|  |  |  | 	arr.resize(VS::ARRAY_MAX); | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	arr[VS::ARRAY_VERTEX] = vertices; | 
					
						
							|  |  |  | 	arr[VS::ARRAY_NORMAL] = normals; | 
					
						
							|  |  |  | 	arr[VS::ARRAY_TANGENT] = tangents; | 
					
						
							|  |  |  | 	arr[VS::ARRAY_TEX_UV] = uvs; | 
					
						
							|  |  |  | 	VS::get_singleton()->mesh_add_surface_from_arrays(sphere, VS::PRIMITIVE_TRIANGLES, arr); | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | EditorMaterialPreviewPlugin::~EditorMaterialPreviewPlugin() { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	VS::get_singleton()->free(sphere); | 
					
						
							|  |  |  | 	VS::get_singleton()->free(sphere_instance); | 
					
						
							|  |  |  | 	VS::get_singleton()->free(viewport); | 
					
						
							|  |  |  | 	VS::get_singleton()->free(light); | 
					
						
							|  |  |  | 	VS::get_singleton()->free(light_instance); | 
					
						
							|  |  |  | 	VS::get_singleton()->free(light2); | 
					
						
							|  |  |  | 	VS::get_singleton()->free(light_instance2); | 
					
						
							|  |  |  | 	VS::get_singleton()->free(camera); | 
					
						
							|  |  |  | 	VS::get_singleton()->free(scenario); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ///////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static bool _is_text_char(CharType c) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || c == '_'; | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | bool EditorScriptPreviewPlugin::handles(const String &p_type) const { | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	return ClassDB::is_parent_class(p_type, "Script"); | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-12 13:10:49 +02:00
										 |  |  | Ref<Texture> EditorScriptPreviewPlugin::generate(const RES &p_from, const Size2 p_size) const { | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	Ref<Script> scr = p_from; | 
					
						
							|  |  |  | 	if (scr.is_null()) | 
					
						
							|  |  |  | 		return Ref<Texture>(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	String code = scr->get_source_code().strip_edges(); | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	if (code == "") | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 		return Ref<Texture>(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	List<String> kwors; | 
					
						
							|  |  |  | 	scr->get_language()->get_reserved_words(&kwors); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Set<String> keywords; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	for (List<String>::Element *E = kwors.front(); E; E = E->next()) { | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		keywords.insert(E->get()); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	int line = 0; | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	int col = 0; | 
					
						
							|  |  |  | 	Ref<Image> img; | 
					
						
							|  |  |  | 	img.instance(); | 
					
						
							| 
									
										
										
										
											2018-09-12 13:10:49 +02:00
										 |  |  | 	int thumbnail_size = MAX(p_size.x, p_size.y); | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	img->create(thumbnail_size, thumbnail_size, 0, Image::FORMAT_RGBA8); | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 19:41:36 -03:00
										 |  |  | 	Color bg_color = EditorSettings::get_singleton()->get("text_editor/highlighting/background_color"); | 
					
						
							|  |  |  | 	Color keyword_color = EditorSettings::get_singleton()->get("text_editor/highlighting/keyword_color"); | 
					
						
							|  |  |  | 	Color text_color = EditorSettings::get_singleton()->get("text_editor/highlighting/text_color"); | 
					
						
							|  |  |  | 	Color symbol_color = EditorSettings::get_singleton()->get("text_editor/highlighting/symbol_color"); | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-17 17:11:43 +01:00
										 |  |  | 	img->lock(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-30 13:38:51 +01:00
										 |  |  | 	if (bg_color.a == 0) | 
					
						
							|  |  |  | 		bg_color = Color(0, 0, 0, 0); | 
					
						
							|  |  |  | 	bg_color.a = MAX(bg_color.a, 0.2); // some background
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	for (int i = 0; i < thumbnail_size; i++) { | 
					
						
							|  |  |  | 		for (int j = 0; j < thumbnail_size; j++) { | 
					
						
							| 
									
										
										
										
											2017-07-07 19:05:45 +02:00
										 |  |  | 			img->set_pixel(i, j, bg_color); | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-30 13:38:51 +01:00
										 |  |  | 	const int x0 = thumbnail_size / 8; | 
					
						
							|  |  |  | 	const int y0 = thumbnail_size / 8; | 
					
						
							|  |  |  | 	const int available_height = thumbnail_size - 2 * y0; | 
					
						
							|  |  |  | 	col = x0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	bool prev_is_text = false; | 
					
						
							|  |  |  | 	bool in_keyword = false; | 
					
						
							|  |  |  | 	for (int i = 0; i < code.length(); i++) { | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		CharType c = code[i]; | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 		if (c > 32) { | 
					
						
							|  |  |  | 			if (col < thumbnail_size) { | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 				Color color = text_color; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 				if (c != '_' && ((c >= '!' && c <= '/') || (c >= ':' && c <= '@') || (c >= '[' && c <= '`') || (c >= '{' && c <= '~') || c == '\t')) { | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 					//make symbol a little visible
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 					color = symbol_color; | 
					
						
							|  |  |  | 					in_keyword = false; | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 				} else if (!prev_is_text && _is_text_char(c)) { | 
					
						
							|  |  |  | 					int pos = i; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 					while (_is_text_char(code[pos])) { | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 						pos++; | 
					
						
							|  |  |  | 					} | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 					String word = code.substr(i, pos - i); | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 					if (keywords.has(word)) | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 						in_keyword = true; | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				} else if (!_is_text_char(c)) { | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 					in_keyword = false; | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				if (in_keyword) | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 					color = keyword_color; | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 				Color ul = color; | 
					
						
							|  |  |  | 				ul.a *= 0.5; | 
					
						
							| 
									
										
										
										
											2017-12-30 13:38:51 +01:00
										 |  |  | 				img->set_pixel(col, y0 + line * 2, bg_color.blend(ul)); | 
					
						
							|  |  |  | 				img->set_pixel(col, y0 + line * 2 + 1, color); | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 				prev_is_text = _is_text_char(c); | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 			prev_is_text = false; | 
					
						
							|  |  |  | 			in_keyword = false; | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 			if (c == '\n') { | 
					
						
							| 
									
										
										
										
											2017-12-30 13:38:51 +01:00
										 |  |  | 				col = x0; | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 				line++; | 
					
						
							| 
									
										
										
										
											2017-12-30 13:38:51 +01:00
										 |  |  | 				if (line >= available_height / 2) | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 					break; | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 			} else if (c == '\t') { | 
					
						
							|  |  |  | 				col += 3; | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		col++; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	img->unlock(); | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-30 13:38:51 +01:00
										 |  |  | 	post_process_preview(img); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	Ref<ImageTexture> ptex = Ref<ImageTexture>(memnew(ImageTexture)); | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	ptex->create_from_image(img, 0); | 
					
						
							|  |  |  | 	return ptex; | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | EditorScriptPreviewPlugin::EditorScriptPreviewPlugin() { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | ///////////////////////////////////////////////////////////////////
 | 
					
						
							| 
									
										
										
										
											2017-08-26 17:46:49 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-07 12:46:14 -03:00
										 |  |  | bool EditorAudioStreamPreviewPlugin::handles(const String &p_type) const { | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-07 12:46:14 -03:00
										 |  |  | 	return ClassDB::is_parent_class(p_type, "AudioStream"); | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-12 13:10:49 +02:00
										 |  |  | Ref<Texture> EditorAudioStreamPreviewPlugin::generate(const RES &p_from, const Size2 p_size) const { | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-07 12:46:14 -03:00
										 |  |  | 	Ref<AudioStream> stream = p_from; | 
					
						
							|  |  |  | 	ERR_FAIL_COND_V(stream.is_null(), Ref<Texture>()); | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-07 18:25:37 -03:00
										 |  |  | 	PoolVector<uint8_t> img; | 
					
						
							| 
									
										
										
										
											2018-09-12 13:10:49 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	int w = p_size.x; | 
					
						
							|  |  |  | 	int h = p_size.y; | 
					
						
							| 
									
										
										
										
											2018-06-07 12:46:14 -03:00
										 |  |  | 	img.resize(w * h * 3); | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-07 18:25:37 -03:00
										 |  |  | 	PoolVector<uint8_t>::Write imgdata = img.write(); | 
					
						
							| 
									
										
										
										
											2018-06-07 12:46:14 -03:00
										 |  |  | 	uint8_t *imgw = imgdata.ptr(); | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-07 12:46:14 -03:00
										 |  |  | 	Ref<AudioStreamPlayback> playback = stream->instance_playback(); | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-07 12:46:14 -03:00
										 |  |  | 	float len_s = stream->get_length(); | 
					
						
							|  |  |  | 	if (len_s == 0) { | 
					
						
							|  |  |  | 		len_s = 60; //one minute audio if no length specified
 | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	int frame_length = AudioServer::get_singleton()->get_mix_rate() * len_s; | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-07 12:46:14 -03:00
										 |  |  | 	Vector<AudioFrame> frames; | 
					
						
							|  |  |  | 	frames.resize(frame_length); | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-07 12:46:14 -03:00
										 |  |  | 	playback->start(); | 
					
						
							|  |  |  | 	playback->mix(frames.ptrw(), 1, frames.size()); | 
					
						
							|  |  |  | 	playback->stop(); | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-07 12:46:14 -03:00
										 |  |  | 	for (int i = 0; i < w; i++) { | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-07 12:46:14 -03:00
										 |  |  | 		float max = -1000; | 
					
						
							|  |  |  | 		float min = 1000; | 
					
						
							|  |  |  | 		int from = uint64_t(i) * frame_length / w; | 
					
						
							| 
									
										
										
										
											2019-06-03 21:52:50 +02:00
										 |  |  | 		int to = (uint64_t(i) + 1) * frame_length / w; | 
					
						
							| 
									
										
										
										
											2018-06-07 12:46:14 -03:00
										 |  |  | 		to = MIN(to, frame_length); | 
					
						
							|  |  |  | 		from = MIN(from, frame_length - 1); | 
					
						
							|  |  |  | 		if (to == from) { | 
					
						
							|  |  |  | 			to = from + 1; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-07 12:46:14 -03:00
										 |  |  | 		for (int j = from; j < to; j++) { | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-07 12:46:14 -03:00
										 |  |  | 			max = MAX(max, frames[j].l); | 
					
						
							|  |  |  | 			max = MAX(max, frames[j].r); | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-07 12:46:14 -03:00
										 |  |  | 			min = MIN(min, frames[j].l); | 
					
						
							|  |  |  | 			min = MIN(min, frames[j].r); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-07 12:46:14 -03:00
										 |  |  | 		int pfrom = CLAMP((min * 0.5 + 0.5) * h / 2, 0, h / 2) + h / 4; | 
					
						
							|  |  |  | 		int pto = CLAMP((max * 0.5 + 0.5) * h / 2, 0, h / 2) + h / 4; | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-07 12:46:14 -03:00
										 |  |  | 		for (int j = 0; j < h; j++) { | 
					
						
							|  |  |  | 			uint8_t *p = &imgw[(j * w + i) * 3]; | 
					
						
							|  |  |  | 			if (j < pfrom || j > pto) { | 
					
						
							|  |  |  | 				p[0] = 100; | 
					
						
							|  |  |  | 				p[1] = 100; | 
					
						
							|  |  |  | 				p[2] = 100; | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 			} else { | 
					
						
							| 
									
										
										
										
											2018-06-07 12:46:14 -03:00
										 |  |  | 				p[0] = 180; | 
					
						
							|  |  |  | 				p[1] = 180; | 
					
						
							|  |  |  | 				p[2] = 180; | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-07 18:25:37 -03:00
										 |  |  | 	imgdata = PoolVector<uint8_t>::Write(); | 
					
						
							| 
									
										
										
										
											2018-06-07 12:46:14 -03:00
										 |  |  | 	//post_process_preview(img);
 | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-07 12:46:14 -03:00
										 |  |  | 	Ref<ImageTexture> ptex = Ref<ImageTexture>(memnew(ImageTexture)); | 
					
						
							|  |  |  | 	Ref<Image> image; | 
					
						
							|  |  |  | 	image.instance(); | 
					
						
							|  |  |  | 	image->create(w, h, false, Image::FORMAT_RGB8, img); | 
					
						
							|  |  |  | 	ptex->create_from_image(image, 0); | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 	return ptex; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-07 12:46:14 -03:00
										 |  |  | EditorAudioStreamPreviewPlugin::EditorAudioStreamPreviewPlugin() { | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2017-08-26 17:46:49 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | ///////////////////////////////////////////////////////////////////////////
 | 
					
						
							| 
									
										
										
										
											2015-05-31 21:13:24 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | void EditorMeshPreviewPlugin::_preview_done(const Variant &p_udata) { | 
					
						
							| 
									
										
										
										
											2015-05-31 21:13:24 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	preview_done = true; | 
					
						
							| 
									
										
										
										
											2015-05-31 21:13:24 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | void EditorMeshPreviewPlugin::_bind_methods() { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ClassDB::bind_method("_preview_done", &EditorMeshPreviewPlugin::_preview_done); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | bool EditorMeshPreviewPlugin::handles(const String &p_type) const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return ClassDB::is_parent_class(p_type, "Mesh"); //any Mesh
 | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2015-05-31 21:13:24 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-12 13:10:49 +02:00
										 |  |  | Ref<Texture> EditorMeshPreviewPlugin::generate(const RES &p_from, const Size2 p_size) const { | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-31 21:13:24 -03:00
										 |  |  | 	Ref<Mesh> mesh = p_from; | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	ERR_FAIL_COND_V(mesh.is_null(), Ref<Texture>()); | 
					
						
							| 
									
										
										
										
											2015-05-31 21:13:24 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	VS::get_singleton()->instance_set_base(mesh_instance, mesh->get_rid()); | 
					
						
							| 
									
										
										
										
											2015-05-31 21:13:24 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-16 21:09:00 -05:00
										 |  |  | 	AABB aabb = mesh->get_aabb(); | 
					
						
							| 
									
										
										
										
											2017-06-06 20:33:51 +02:00
										 |  |  | 	Vector3 ofs = aabb.position + aabb.size * 0.5; | 
					
						
							|  |  |  | 	aabb.position -= ofs; | 
					
						
							| 
									
										
										
										
											2015-05-31 21:13:24 -03:00
										 |  |  | 	Transform xform; | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	xform.basis = Basis().rotated(Vector3(0, 1, 0), -Math_PI * 0.125); | 
					
						
							|  |  |  | 	xform.basis = Basis().rotated(Vector3(1, 0, 0), Math_PI * 0.125) * xform.basis; | 
					
						
							| 
									
										
										
										
											2017-11-16 21:09:00 -05:00
										 |  |  | 	AABB rot_aabb = xform.xform(aabb); | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	float m = MAX(rot_aabb.size.x, rot_aabb.size.y) * 0.5; | 
					
						
							|  |  |  | 	if (m == 0) | 
					
						
							| 
									
										
										
										
											2015-05-31 21:13:24 -03:00
										 |  |  | 		return Ref<Texture>(); | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	m = 1.0 / m; | 
					
						
							|  |  |  | 	m *= 0.5; | 
					
						
							|  |  |  | 	xform.basis.scale(Vector3(m, m, m)); | 
					
						
							|  |  |  | 	xform.origin = -xform.basis.xform(ofs); //-ofs*m;
 | 
					
						
							|  |  |  | 	xform.origin.z -= rot_aabb.size.z * 2; | 
					
						
							|  |  |  | 	VS::get_singleton()->instance_set_transform(mesh_instance, xform); | 
					
						
							| 
									
										
										
										
											2015-05-31 21:13:24 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	VS::get_singleton()->viewport_set_update_mode(viewport, VS::VIEWPORT_UPDATE_ONCE); //once used for capture
 | 
					
						
							| 
									
										
										
										
											2015-05-31 21:13:24 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	preview_done = false; | 
					
						
							| 
									
										
										
										
											2018-07-29 16:45:23 -03:00
										 |  |  | 	VS::get_singleton()->request_frame_drawn_callback(const_cast<EditorMeshPreviewPlugin *>(this), "_preview_done", Variant()); | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	while (!preview_done) { | 
					
						
							| 
									
										
										
										
											2015-05-31 21:13:24 -03:00
										 |  |  | 		OS::get_singleton()->delay_usec(10); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-29 02:55:13 +09:00
										 |  |  | 	Ref<Image> img = VS::get_singleton()->texture_get_data(viewport_texture); | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	ERR_FAIL_COND_V(img.is_null(), Ref<ImageTexture>()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	VS::get_singleton()->instance_set_base(mesh_instance, RID()); | 
					
						
							| 
									
										
										
										
											2015-05-31 21:13:24 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	img->convert(Image::FORMAT_RGBA8); | 
					
						
							| 
									
										
										
										
											2018-09-12 13:10:49 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	Vector2 new_size = img->get_size(); | 
					
						
							|  |  |  | 	if (new_size.x > p_size.x) { | 
					
						
							|  |  |  | 		new_size = Vector2(p_size.x, new_size.y * p_size.x / new_size.x); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if (new_size.y > p_size.y) { | 
					
						
							|  |  |  | 		new_size = Vector2(new_size.x * p_size.y / new_size.y, p_size.y); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	img->resize(new_size.x, new_size.y, Image::INTERPOLATE_CUBIC); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-30 13:38:51 +01:00
										 |  |  | 	post_process_preview(img); | 
					
						
							| 
									
										
										
										
											2015-05-31 21:13:24 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	Ref<ImageTexture> ptex = Ref<ImageTexture>(memnew(ImageTexture)); | 
					
						
							|  |  |  | 	ptex->create_from_image(img, 0); | 
					
						
							| 
									
										
										
										
											2015-05-31 21:13:24 -03:00
										 |  |  | 	return ptex; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | EditorMeshPreviewPlugin::EditorMeshPreviewPlugin() { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	scenario = VS::get_singleton()->scenario_create(); | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-31 21:13:24 -03:00
										 |  |  | 	viewport = VS::get_singleton()->viewport_create(); | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	VS::get_singleton()->viewport_set_update_mode(viewport, VS::VIEWPORT_UPDATE_DISABLED); | 
					
						
							|  |  |  | 	VS::get_singleton()->viewport_set_vflip(viewport, true); | 
					
						
							|  |  |  | 	VS::get_singleton()->viewport_set_scenario(viewport, scenario); | 
					
						
							|  |  |  | 	VS::get_singleton()->viewport_set_size(viewport, 128, 128); | 
					
						
							|  |  |  | 	VS::get_singleton()->viewport_set_transparent_background(viewport, true); | 
					
						
							|  |  |  | 	VS::get_singleton()->viewport_set_active(viewport, true); | 
					
						
							|  |  |  | 	viewport_texture = VS::get_singleton()->viewport_get_texture(viewport); | 
					
						
							| 
									
										
										
										
											2015-05-31 21:13:24 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	camera = VS::get_singleton()->camera_create(); | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	VS::get_singleton()->viewport_attach_camera(viewport, camera); | 
					
						
							|  |  |  | 	VS::get_singleton()->camera_set_transform(camera, Transform(Basis(), Vector3(0, 0, 3))); | 
					
						
							| 
									
										
										
										
											2017-01-14 12:26:56 +01:00
										 |  |  | 	//VS::get_singleton()->camera_set_perspective(camera,45,0.1,10);
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	VS::get_singleton()->camera_set_orthogonal(camera, 1.0, 0.01, 1000.0); | 
					
						
							| 
									
										
										
										
											2015-05-31 21:13:24 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-09 23:34:01 -03:00
										 |  |  | 	light = VS::get_singleton()->directional_light_create(); | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	light_instance = VS::get_singleton()->instance_create2(light, scenario); | 
					
						
							|  |  |  | 	VS::get_singleton()->instance_set_transform(light_instance, Transform().looking_at(Vector3(-1, -1, -1), Vector3(0, 1, 0))); | 
					
						
							| 
									
										
										
										
											2015-05-31 21:13:24 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-09 23:34:01 -03:00
										 |  |  | 	light2 = VS::get_singleton()->directional_light_create(); | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	VS::get_singleton()->light_set_color(light2, Color(0.7, 0.7, 0.7)); | 
					
						
							|  |  |  | 	//VS::get_singleton()->light_set_color(light2, VS::LIGHT_COLOR_SPECULAR, Color(0.0, 0.0, 0.0));
 | 
					
						
							|  |  |  | 	light_instance2 = VS::get_singleton()->instance_create2(light2, scenario); | 
					
						
							| 
									
										
										
										
											2015-05-31 21:13:24 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	VS::get_singleton()->instance_set_transform(light_instance2, Transform().looking_at(Vector3(0, 1, 0), Vector3(0, 0, 1))); | 
					
						
							| 
									
										
										
										
											2015-05-31 21:13:24 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-14 12:26:56 +01:00
										 |  |  | 	//sphere = VS::get_singleton()->mesh_create();
 | 
					
						
							| 
									
										
										
										
											2015-05-31 21:13:24 -03:00
										 |  |  | 	mesh_instance = VS::get_singleton()->instance_create(); | 
					
						
							| 
									
										
										
										
											2017-06-09 00:23:50 -03:00
										 |  |  | 	VS::get_singleton()->instance_set_scenario(mesh_instance, scenario); | 
					
						
							| 
									
										
										
										
											2015-05-31 21:13:24 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | EditorMeshPreviewPlugin::~EditorMeshPreviewPlugin() { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	//VS::get_singleton()->free(sphere);
 | 
					
						
							|  |  |  | 	VS::get_singleton()->free(mesh_instance); | 
					
						
							|  |  |  | 	VS::get_singleton()->free(viewport); | 
					
						
							|  |  |  | 	VS::get_singleton()->free(light); | 
					
						
							|  |  |  | 	VS::get_singleton()->free(light_instance); | 
					
						
							|  |  |  | 	VS::get_singleton()->free(light2); | 
					
						
							|  |  |  | 	VS::get_singleton()->free(light_instance2); | 
					
						
							|  |  |  | 	VS::get_singleton()->free(camera); | 
					
						
							|  |  |  | 	VS::get_singleton()->free(scenario); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2018-04-15 22:00:56 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | ///////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void EditorFontPreviewPlugin::_preview_done(const Variant &p_udata) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	preview_done = true; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void EditorFontPreviewPlugin::_bind_methods() { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ClassDB::bind_method("_preview_done", &EditorFontPreviewPlugin::_preview_done); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool EditorFontPreviewPlugin::handles(const String &p_type) const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return ClassDB::is_parent_class(p_type, "DynamicFontData"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-12 13:10:49 +02:00
										 |  |  | Ref<Texture> EditorFontPreviewPlugin::generate_from_path(const String &p_path, const Size2 p_size) const { | 
					
						
							| 
									
										
										
										
											2018-04-15 22:00:56 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	Ref<DynamicFontData> SampledFont; | 
					
						
							|  |  |  | 	SampledFont.instance(); | 
					
						
							|  |  |  | 	SampledFont->set_font_path(p_path); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Ref<DynamicFont> sampled_font; | 
					
						
							|  |  |  | 	sampled_font.instance(); | 
					
						
							|  |  |  | 	sampled_font->set_size(50); | 
					
						
							|  |  |  | 	sampled_font->set_font_data(SampledFont); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	String sampled_text = "Abg"; | 
					
						
							|  |  |  | 	Vector2 size = sampled_font->get_string_size(sampled_text); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Vector2 pos; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	pos.x = 64 - size.x / 2; | 
					
						
							|  |  |  | 	pos.y = 80; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Ref<Font> font = sampled_font; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	font->draw(canvas_item, pos, sampled_text); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	preview_done = false; | 
					
						
							| 
									
										
										
										
											2019-02-23 21:30:39 -03:00
										 |  |  | 	VS::get_singleton()->viewport_set_update_mode(viewport, VS::VIEWPORT_UPDATE_ONCE); //once used for capture
 | 
					
						
							| 
									
										
										
										
											2018-07-29 16:45:23 -03:00
										 |  |  | 	VS::get_singleton()->request_frame_drawn_callback(const_cast<EditorFontPreviewPlugin *>(this), "_preview_done", Variant()); | 
					
						
							| 
									
										
										
										
											2018-04-15 22:00:56 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	while (!preview_done) { | 
					
						
							|  |  |  | 		OS::get_singleton()->delay_usec(10); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-23 21:30:39 -03:00
										 |  |  | 	VS::get_singleton()->canvas_item_clear(canvas_item); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-29 02:55:13 +09:00
										 |  |  | 	Ref<Image> img = VS::get_singleton()->texture_get_data(viewport_texture); | 
					
						
							| 
									
										
										
										
											2018-04-15 22:00:56 -05:00
										 |  |  | 	ERR_FAIL_COND_V(img.is_null(), Ref<ImageTexture>()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	img->convert(Image::FORMAT_RGBA8); | 
					
						
							| 
									
										
										
										
											2018-09-12 13:10:49 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	Vector2 new_size = img->get_size(); | 
					
						
							|  |  |  | 	if (new_size.x > p_size.x) { | 
					
						
							|  |  |  | 		new_size = Vector2(p_size.x, new_size.y * p_size.x / new_size.x); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if (new_size.y > p_size.y) { | 
					
						
							|  |  |  | 		new_size = Vector2(new_size.x * p_size.y / new_size.y, p_size.y); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	img->resize(new_size.x, new_size.y, Image::INTERPOLATE_CUBIC); | 
					
						
							| 
									
										
										
										
											2018-04-15 22:00:56 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	post_process_preview(img); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Ref<ImageTexture> ptex = Ref<ImageTexture>(memnew(ImageTexture)); | 
					
						
							|  |  |  | 	ptex->create_from_image(img, 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return ptex; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-12 13:10:49 +02:00
										 |  |  | Ref<Texture> EditorFontPreviewPlugin::generate(const RES &p_from, const Size2 p_size) const { | 
					
						
							| 
									
										
										
										
											2018-04-15 22:00:56 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-23 21:30:39 -03:00
										 |  |  | 	String path = p_from->get_path(); | 
					
						
							|  |  |  | 	if (!FileAccess::exists(path)) { | 
					
						
							|  |  |  | 		return Ref<Texture>(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return generate_from_path(path, p_size); | 
					
						
							| 
									
										
										
										
											2018-04-15 22:00:56 -05:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | EditorFontPreviewPlugin::EditorFontPreviewPlugin() { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	viewport = VS::get_singleton()->viewport_create(); | 
					
						
							|  |  |  | 	VS::get_singleton()->viewport_set_update_mode(viewport, VS::VIEWPORT_UPDATE_DISABLED); | 
					
						
							|  |  |  | 	VS::get_singleton()->viewport_set_vflip(viewport, true); | 
					
						
							|  |  |  | 	VS::get_singleton()->viewport_set_size(viewport, 128, 128); | 
					
						
							|  |  |  | 	VS::get_singleton()->viewport_set_active(viewport, true); | 
					
						
							|  |  |  | 	viewport_texture = VS::get_singleton()->viewport_get_texture(viewport); | 
					
						
							| 
									
										
										
										
											2018-07-29 16:45:23 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	canvas = VS::get_singleton()->canvas_create(); | 
					
						
							|  |  |  | 	canvas_item = VS::get_singleton()->canvas_item_create(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	VS::get_singleton()->viewport_attach_canvas(viewport, canvas); | 
					
						
							|  |  |  | 	VS::get_singleton()->canvas_item_set_parent(canvas_item, canvas); | 
					
						
							| 
									
										
										
										
											2018-04-15 22:00:56 -05:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | EditorFontPreviewPlugin::~EditorFontPreviewPlugin() { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	VS::get_singleton()->free(canvas_item); | 
					
						
							|  |  |  | 	VS::get_singleton()->free(canvas); | 
					
						
							|  |  |  | 	VS::get_singleton()->free(viewport); | 
					
						
							|  |  |  | } |