Merge pull request #112426 from MuffinTastic/MuffinTastic/filesystemdock-thumbnail-nearest-point

[Editor] Make FileSystemDock use nearest-neighbor filtering for textures
This commit is contained in:
Thaddeus Crews 2026-01-28 17:57:57 -06:00
commit ccb0b49799
No known key found for this signature in database
GPG key ID: 8C6E5FEB5FC03CCC
2 changed files with 37 additions and 5 deletions

View file

@ -863,12 +863,16 @@ void FileSystemDock::navigate_to_path(const String &p_path) {
void FileSystemDock::_file_list_thumbnail_done(const String &p_path, const Ref<Texture2D> &p_preview, const Ref<Texture2D> &p_small_preview, int p_index, const String &p_filename) {
if (p_preview.is_valid()) {
if (p_index < files->get_item_count() && files->get_item_text(p_index) == p_filename && files->get_item_metadata(p_index) == p_path) {
Ref<Texture2D> thumbnail;
if (file_list_display_mode == FILE_LIST_DISPLAY_LIST) {
if (p_small_preview.is_valid()) {
files->set_item_icon(p_index, p_small_preview);
}
thumbnail = p_small_preview;
} else {
files->set_item_icon(p_index, p_preview);
thumbnail = p_preview;
}
if (thumbnail.is_valid()) {
files->set_item_icon(p_index, _apply_thumbnail_filter(thumbnail, p_path));
}
}
}
@ -877,10 +881,37 @@ void FileSystemDock::_file_list_thumbnail_done(const String &p_path, const Ref<T
void FileSystemDock::_tree_thumbnail_done(const String &p_path, const Ref<Texture2D> &p_preview, const Ref<Texture2D> &p_small_preview, int p_update_id, ObjectID p_item) {
TreeItem *item = ObjectDB::get_instance<TreeItem>(p_item);
if (item && tree_update_id == p_update_id && p_small_preview.is_valid()) {
item->set_icon(0, p_small_preview);
item->set_icon(0, _apply_thumbnail_filter(p_small_preview, p_path));
}
}
Ref<Texture2D> FileSystemDock::_apply_thumbnail_filter(const Ref<Texture2D> &p_thumbnail, const String &p_file_path) const {
if (!p_file_path.is_empty()) {
int index;
EditorFileSystemDirectory *dir = EditorFileSystem::get_singleton()->find_file(p_file_path, &index);
if (dir) {
if (dir->get_file_import_is_valid(index)) {
const StringName &file_type = dir->get_file_type(index);
if (file_type == SNAME("CompressedTexture2D") || file_type == SNAME("Image")) {
const String extension = p_file_path.get_extension();
if (extension != "svg" && extension != "svgz") {
Ref<CanvasTexture> thumbnail_wrapped;
thumbnail_wrapped.instantiate();
thumbnail_wrapped->set_diffuse_texture(p_thumbnail);
thumbnail_wrapped->set_texture_filter(CanvasItem::TextureFilter::TEXTURE_FILTER_NEAREST_WITH_MIPMAPS);
return thumbnail_wrapped;
}
}
}
}
}
return p_thumbnail;
}
void FileSystemDock::_toggle_file_display() {
_set_file_display(file_list_display_mode != FILE_LIST_DISPLAY_LIST);
emit_signal(SNAME("display_mode_changed"));

View file

@ -367,6 +367,7 @@ private:
void _preview_invalidated(const String &p_path);
void _file_list_thumbnail_done(const String &p_path, const Ref<Texture2D> &p_preview, const Ref<Texture2D> &p_small_preview, int p_index, const String &p_filename);
void _tree_thumbnail_done(const String &p_path, const Ref<Texture2D> &p_preview, const Ref<Texture2D> &p_small_preview, int p_update_id, ObjectID p_item);
Ref<Texture2D> _apply_thumbnail_filter(const Ref<Texture2D> &p_thumbnail, const String &p_file_path) const;
void _update_display_mode(bool p_force = false);