diff options
Diffstat (limited to 'editor/editor_resource_preview.cpp')
-rw-r--r-- | editor/editor_resource_preview.cpp | 43 |
1 files changed, 7 insertions, 36 deletions
diff --git a/editor/editor_resource_preview.cpp b/editor/editor_resource_preview.cpp index 2a4300f833..7ac8fae156 100644 --- a/editor/editor_resource_preview.cpp +++ b/editor/editor_resource_preview.cpp @@ -42,7 +42,6 @@ #include "editor_settings.h" bool EditorResourcePreviewGenerator::handles(const String &p_type) const { - if (get_script_instance() && get_script_instance()->has_method("handles")) { return get_script_instance()->call("handles", p_type); } @@ -50,7 +49,6 @@ bool EditorResourcePreviewGenerator::handles(const String &p_type) const { } Ref<Texture2D> EditorResourcePreviewGenerator::generate(const RES &p_from, const Size2 &p_size) const { - if (get_script_instance() && get_script_instance()->has_method("generate")) { return get_script_instance()->call("generate", p_from, p_size); } @@ -58,19 +56,18 @@ Ref<Texture2D> EditorResourcePreviewGenerator::generate(const RES &p_from, const } Ref<Texture2D> EditorResourcePreviewGenerator::generate_from_path(const String &p_path, const Size2 &p_size) const { - if (get_script_instance() && get_script_instance()->has_method("generate_from_path")) { return get_script_instance()->call("generate_from_path", p_path, p_size); } RES res = ResourceLoader::load(p_path); - if (!res.is_valid()) + if (!res.is_valid()) { return res; + } return generate(res, p_size); } bool EditorResourcePreviewGenerator::generate_small_preview_automatically() const { - if (get_script_instance() && get_script_instance()->has_method("generate_small_preview_automatically")) { return get_script_instance()->call("generate_small_preview_automatically"); } @@ -79,7 +76,6 @@ bool EditorResourcePreviewGenerator::generate_small_preview_automatically() cons } bool EditorResourcePreviewGenerator::can_generate_small_preview() const { - if (get_script_instance() && get_script_instance()->has_method("can_generate_small_preview")) { return get_script_instance()->call("can_generate_small_preview"); } @@ -88,7 +84,6 @@ bool EditorResourcePreviewGenerator::can_generate_small_preview() const { } void EditorResourcePreviewGenerator::_bind_methods() { - ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::BOOL, "handles", PropertyInfo(Variant::STRING, "type"))); ClassDB::add_virtual_method(get_class_static(), MethodInfo(CLASS_INFO(Texture2D), "generate", PropertyInfo(Variant::OBJECT, "from", PROPERTY_HINT_RESOURCE_TYPE, "Resource"), PropertyInfo(Variant::VECTOR2, "size"))); ClassDB::add_virtual_method(get_class_static(), MethodInfo(CLASS_INFO(Texture2D), "generate_from_path", PropertyInfo(Variant::STRING, "path", PROPERTY_HINT_FILE), PropertyInfo(Variant::VECTOR2, "size"))); @@ -102,13 +97,11 @@ EditorResourcePreviewGenerator::EditorResourcePreviewGenerator() { EditorResourcePreview *EditorResourcePreview::singleton = nullptr; void EditorResourcePreview::_thread_func(void *ud) { - EditorResourcePreview *erp = (EditorResourcePreview *)ud; erp->_thread(); } void EditorResourcePreview::_preview_ready(const String &p_str, const Ref<Texture2D> &p_texture, const Ref<Texture2D> &p_small_texture, ObjectID id, const StringName &p_func, const Variant &p_ud) { - String path = p_str; { MutexLock lock(preview_mutex); @@ -139,10 +132,11 @@ void EditorResourcePreview::_preview_ready(const String &p_str, const Ref<Textur void EditorResourcePreview::_generate_preview(Ref<ImageTexture> &r_texture, Ref<ImageTexture> &r_small_texture, const QueueItem &p_item, const String &cache_base) { String type; - if (p_item.resource.is_valid()) + if (p_item.resource.is_valid()) { type = p_item.resource->get_class(); - else + } else { type = ResourceLoader::get_resource_type(p_item.path); + } if (type == "") { r_texture = Ref<ImageTexture>(); @@ -157,8 +151,9 @@ void EditorResourcePreview::_generate_preview(Ref<ImageTexture> &r_texture, Ref< r_small_texture = Ref<ImageTexture>(); for (int i = 0; i < preview_generators.size(); i++) { - if (!preview_generators[i]->handles(type)) + if (!preview_generators[i]->handles(type)) { continue; + } Ref<Texture2D> generated; if (p_item.resource.is_valid()) { @@ -214,15 +209,12 @@ void EditorResourcePreview::_generate_preview(Ref<ImageTexture> &r_texture, Ref< } void EditorResourcePreview::_thread() { - exited = false; while (!exit) { - preview_sem.wait(); preview_mutex.lock(); if (queue.size()) { - QueueItem item = queue.front()->get(); queue.pop_front(); @@ -237,7 +229,6 @@ void EditorResourcePreview::_thread() { preview_mutex.unlock(); } else { - preview_mutex.unlock(); Ref<ImageTexture> texture; @@ -247,14 +238,12 @@ void EditorResourcePreview::_thread() { thumbnail_size *= EDSCALE; if (item.resource.is_valid()) { - _generate_preview(texture, small_texture, item, String()); //adding hash to the end of path (should be ID:<objid>:<hash>) because of 5 argument limit to call_deferred _preview_ready(item.path + ":" + itos(item.resource->hash_edited_version()), texture, small_texture, item.id, item.function, item.userdata); } else { - String temp_path = EditorSettings::get_singleton()->get_cache_dir(); String cache_base = ProjectSettings::get_singleton()->globalize_path(item.path).md5_text(); cache_base = temp_path.plus_file("resthumb-" + cache_base); @@ -264,11 +253,9 @@ void EditorResourcePreview::_thread() { String file = cache_base + ".txt"; FileAccess *f = FileAccess::open(file, FileAccess::READ); if (!f) { - // No cache found, generate _generate_preview(texture, small_texture, item, cache_base); } else { - uint64_t modtime = FileAccess::get_modified_time(item.path); int tsize = f->get_line().to_int64(); bool has_small_texture = f->get_line().to_int(); @@ -277,17 +264,14 @@ void EditorResourcePreview::_thread() { bool cache_valid = true; if (tsize != thumbnail_size) { - cache_valid = false; memdelete(f); } else if (last_modtime != modtime) { - String last_md5 = f->get_line(); String md5 = FileAccess::get_md5(item.path); memdelete(f); if (last_md5 != md5) { - cache_valid = false; } else { @@ -311,7 +295,6 @@ void EditorResourcePreview::_thread() { } if (cache_valid) { - Ref<Image> img; img.instance(); Ref<Image> small_img; @@ -320,7 +303,6 @@ void EditorResourcePreview::_thread() { if (img->load(cache_base + ".png") != OK) { cache_valid = false; } else { - texture.instance(); texture->create_from_image(img); @@ -336,7 +318,6 @@ void EditorResourcePreview::_thread() { } if (!cache_valid) { - _generate_preview(texture, small_texture, item, cache_base); } } @@ -352,7 +333,6 @@ void EditorResourcePreview::_thread() { } void EditorResourcePreview::queue_edited_resource_preview(const Ref<Resource> &p_res, Object *p_receiver, const StringName &p_receiver_func, const Variant &p_userdata) { - ERR_FAIL_NULL(p_receiver); ERR_FAIL_COND(!p_res.is_valid()); @@ -362,7 +342,6 @@ void EditorResourcePreview::queue_edited_resource_preview(const Ref<Resource> &p String path_id = "ID:" + itos(p_res->get_instance_id()); if (cache.has(path_id) && cache[path_id].last_hash == p_res->hash_edited_version()) { - cache[path_id].order = order++; p_receiver->call(p_receiver_func, path_id, cache[path_id].preview, cache[path_id].small_preview, p_userdata); return; @@ -383,7 +362,6 @@ void EditorResourcePreview::queue_edited_resource_preview(const Ref<Resource> &p } void EditorResourcePreview::queue_resource_preview(const String &p_path, Object *p_receiver, const StringName &p_receiver_func, const Variant &p_userdata) { - ERR_FAIL_NULL(p_receiver); { MutexLock lock(preview_mutex); @@ -406,22 +384,18 @@ void EditorResourcePreview::queue_resource_preview(const String &p_path, Object } void EditorResourcePreview::add_preview_generator(const Ref<EditorResourcePreviewGenerator> &p_generator) { - preview_generators.push_back(p_generator); } void EditorResourcePreview::remove_preview_generator(const Ref<EditorResourcePreviewGenerator> &p_generator) { - preview_generators.erase(p_generator); } EditorResourcePreview *EditorResourcePreview::get_singleton() { - return singleton; } void EditorResourcePreview::_bind_methods() { - ClassDB::bind_method("_preview_ready", &EditorResourcePreview::_preview_ready); ClassDB::bind_method(D_METHOD("queue_resource_preview", "path", "receiver", "receiver_func", "userdata"), &EditorResourcePreview::queue_resource_preview); @@ -434,13 +408,11 @@ void EditorResourcePreview::_bind_methods() { } void EditorResourcePreview::check_for_invalidation(const String &p_path) { - bool call_invalidated = false; { MutexLock lock(preview_mutex); if (cache.has(p_path)) { - uint64_t modified_time = FileAccess::get_modified_time(p_path); if (modified_time != cache[p_path].modified_time) { cache.erase(p_path); @@ -482,6 +454,5 @@ EditorResourcePreview::EditorResourcePreview() { } EditorResourcePreview::~EditorResourcePreview() { - stop(); } |