mirror of
https://github.com/godotengine/godot.git
synced 2025-10-19 16:03:29 +00:00
Merge pull request #104590 from bruvzg/tex_decomp_load
Load decompressable texture format if no supported one is found.
This commit is contained in:
commit
e3063f5675
4 changed files with 45 additions and 18 deletions
|
@ -2694,6 +2694,19 @@ Error Image::decompress() {
|
|||
return OK;
|
||||
}
|
||||
|
||||
bool Image::can_decompress(const String &p_format_tag) {
|
||||
if (p_format_tag == "astc") {
|
||||
return _image_decompress_astc != nullptr;
|
||||
} else if (p_format_tag == "bptc") {
|
||||
return _image_decompress_bptc != nullptr;
|
||||
} else if (p_format_tag == "etc2") {
|
||||
return _image_decompress_etc2 != nullptr;
|
||||
} else if (p_format_tag == "s3tc") {
|
||||
return _image_decompress_bc != nullptr;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
Error Image::compress(CompressMode p_mode, CompressSource p_source, ASTCFormat p_astc_format) {
|
||||
ERR_FAIL_INDEX_V_MSG(p_mode, COMPRESS_MAX, ERR_INVALID_PARAMETER, "Invalid compress mode.");
|
||||
ERR_FAIL_INDEX_V_MSG(p_source, COMPRESS_SOURCE_MAX, ERR_INVALID_PARAMETER, "Invalid compress source.");
|
||||
|
|
|
@ -379,6 +379,8 @@ public:
|
|||
bool is_compressed() const;
|
||||
static bool is_format_compressed(Format p_format);
|
||||
|
||||
static bool can_decompress(const String &p_format_tag);
|
||||
|
||||
void fix_alpha_edges();
|
||||
void premultiply_alpha();
|
||||
void srgb_to_linear();
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
|
||||
#include "core/config/project_settings.h"
|
||||
#include "core/io/config_file.h"
|
||||
#include "core/io/image.h"
|
||||
#include "core/os/os.h"
|
||||
#include "core/variant/variant_parser.h"
|
||||
|
||||
|
@ -41,7 +42,7 @@ bool ResourceFormatImporter::SortImporterByName::operator()(const Ref<ResourceIm
|
|||
return p_a->get_importer_name() < p_b->get_importer_name();
|
||||
}
|
||||
|
||||
Error ResourceFormatImporter::_get_path_and_type(const String &p_path, PathAndType &r_path_and_type, bool *r_valid) const {
|
||||
Error ResourceFormatImporter::_get_path_and_type(const String &p_path, PathAndType &r_path_and_type, bool p_load, bool *r_valid) const {
|
||||
Error err;
|
||||
Ref<FileAccess> f = FileAccess::open(p_path + ".import", FileAccess::READ, &err);
|
||||
|
||||
|
@ -65,7 +66,10 @@ Error ResourceFormatImporter::_get_path_and_type(const String &p_path, PathAndTy
|
|||
|
||||
int lines = 0;
|
||||
String error_text;
|
||||
bool path_found = false; //first match must have priority
|
||||
bool path_found = false; // First match must have priority.
|
||||
|
||||
String decomp_path;
|
||||
bool decomp_path_found = false;
|
||||
while (true) {
|
||||
assign = Variant();
|
||||
next_tag.fields.clear();
|
||||
|
@ -73,6 +77,11 @@ Error ResourceFormatImporter::_get_path_and_type(const String &p_path, PathAndTy
|
|||
|
||||
err = VariantParser::parse_tag_assign_eof(&stream, lines, error_text, next_tag, assign, value, nullptr, true);
|
||||
if (err == ERR_FILE_EOF) {
|
||||
if (p_load && !path_found && decomp_path_found) {
|
||||
print_verbose(vformat("No natively supported texture format found for %s, using decompressable format %s.", p_path, decomp_path));
|
||||
r_path_and_type.path = decomp_path;
|
||||
}
|
||||
|
||||
return OK;
|
||||
} else if (err != OK) {
|
||||
ERR_PRINT(vformat("ResourceFormatImporter::load - %s.import:%d error: %s.", p_path, lines, error_text));
|
||||
|
@ -84,12 +93,15 @@ Error ResourceFormatImporter::_get_path_and_type(const String &p_path, PathAndTy
|
|||
String feature = assign.get_slicec('.', 1);
|
||||
if (OS::get_singleton()->has_feature(feature)) {
|
||||
r_path_and_type.path = value;
|
||||
path_found = true; //first match must have priority
|
||||
path_found = true; // First match must have priority.
|
||||
} else if (p_load && Image::can_decompress(feature) && !decomp_path_found) { // When loading, check for decompressable formats and use first one found if nothing else is supported.
|
||||
decomp_path = value;
|
||||
decomp_path_found = true; // First match must have priority.
|
||||
}
|
||||
|
||||
} else if (!path_found && assign == "path") {
|
||||
r_path_and_type.path = value;
|
||||
path_found = true; //first match must have priority
|
||||
path_found = true; // First match must have priority.
|
||||
} else if (assign == "type") {
|
||||
r_path_and_type.type = ClassDB::get_compatibility_remapped_class(value);
|
||||
} else if (assign == "importer") {
|
||||
|
@ -154,7 +166,7 @@ Ref<Resource> ResourceFormatImporter::load(const String &p_path, const String &p
|
|||
|
||||
Ref<Resource> ResourceFormatImporter::load_internal(const String &p_path, Error *r_error, bool p_use_sub_threads, float *r_progress, CacheMode p_cache_mode, bool p_silence_errors) {
|
||||
PathAndType pat;
|
||||
Error err = _get_path_and_type(p_path, pat);
|
||||
Error err = _get_path_and_type(p_path, pat, true);
|
||||
|
||||
if (err != OK) {
|
||||
if (r_error) {
|
||||
|
@ -244,7 +256,7 @@ Error ResourceFormatImporter::get_import_order_threads_and_importer(const String
|
|||
|
||||
if (FileAccess::exists(p_path + ".import")) {
|
||||
PathAndType pat;
|
||||
Error err = _get_path_and_type(p_path, pat);
|
||||
Error err = _get_path_and_type(p_path, pat, false);
|
||||
|
||||
if (err == OK) {
|
||||
importer = get_importer_by_name(pat.importer);
|
||||
|
@ -268,7 +280,7 @@ int ResourceFormatImporter::get_import_order(const String &p_path) const {
|
|||
|
||||
if (FileAccess::exists(p_path + ".import")) {
|
||||
PathAndType pat;
|
||||
Error err = _get_path_and_type(p_path, pat);
|
||||
Error err = _get_path_and_type(p_path, pat, false);
|
||||
|
||||
if (err == OK) {
|
||||
importer = get_importer_by_name(pat.importer);
|
||||
|
@ -300,7 +312,7 @@ bool ResourceFormatImporter::handles_type(const String &p_type) const {
|
|||
|
||||
String ResourceFormatImporter::get_internal_resource_path(const String &p_path) const {
|
||||
PathAndType pat;
|
||||
Error err = _get_path_and_type(p_path, pat);
|
||||
Error err = _get_path_and_type(p_path, pat, false);
|
||||
|
||||
if (err != OK) {
|
||||
return String();
|
||||
|
@ -354,20 +366,20 @@ void ResourceFormatImporter::get_internal_resource_path_list(const String &p_pat
|
|||
String ResourceFormatImporter::get_import_group_file(const String &p_path) const {
|
||||
bool valid = true;
|
||||
PathAndType pat;
|
||||
_get_path_and_type(p_path, pat, &valid);
|
||||
_get_path_and_type(p_path, pat, false, &valid);
|
||||
return valid ? pat.group_file : String();
|
||||
}
|
||||
|
||||
bool ResourceFormatImporter::is_import_valid(const String &p_path) const {
|
||||
bool valid = true;
|
||||
PathAndType pat;
|
||||
_get_path_and_type(p_path, pat, &valid);
|
||||
_get_path_and_type(p_path, pat, false, &valid);
|
||||
return valid;
|
||||
}
|
||||
|
||||
String ResourceFormatImporter::get_resource_type(const String &p_path) const {
|
||||
PathAndType pat;
|
||||
Error err = _get_path_and_type(p_path, pat);
|
||||
Error err = _get_path_and_type(p_path, pat, false);
|
||||
|
||||
if (err != OK) {
|
||||
return "";
|
||||
|
@ -378,7 +390,7 @@ String ResourceFormatImporter::get_resource_type(const String &p_path) const {
|
|||
|
||||
ResourceUID::ID ResourceFormatImporter::get_resource_uid(const String &p_path) const {
|
||||
PathAndType pat;
|
||||
Error err = _get_path_and_type(p_path, pat);
|
||||
Error err = _get_path_and_type(p_path, pat, false);
|
||||
|
||||
if (err != OK) {
|
||||
return ResourceUID::INVALID_ID;
|
||||
|
@ -393,7 +405,7 @@ bool ResourceFormatImporter::has_custom_uid_support() const {
|
|||
|
||||
Error ResourceFormatImporter::get_resource_import_info(const String &p_path, StringName &r_type, ResourceUID::ID &r_uid, String &r_import_group_file) const {
|
||||
PathAndType pat;
|
||||
Error err = _get_path_and_type(p_path, pat);
|
||||
Error err = _get_path_and_type(p_path, pat, false);
|
||||
|
||||
if (err == OK) {
|
||||
r_type = pat.type;
|
||||
|
@ -410,7 +422,7 @@ Error ResourceFormatImporter::get_resource_import_info(const String &p_path, Str
|
|||
|
||||
Variant ResourceFormatImporter::get_resource_metadata(const String &p_path) const {
|
||||
PathAndType pat;
|
||||
Error err = _get_path_and_type(p_path, pat);
|
||||
Error err = _get_path_and_type(p_path, pat, false);
|
||||
|
||||
if (err != OK) {
|
||||
return Variant();
|
||||
|
@ -420,7 +432,7 @@ Variant ResourceFormatImporter::get_resource_metadata(const String &p_path) cons
|
|||
}
|
||||
void ResourceFormatImporter::get_classes_used(const String &p_path, HashSet<StringName> *r_classes) {
|
||||
PathAndType pat;
|
||||
Error err = _get_path_and_type(p_path, pat);
|
||||
Error err = _get_path_and_type(p_path, pat, false);
|
||||
|
||||
if (err != OK) {
|
||||
return;
|
||||
|
@ -431,7 +443,7 @@ void ResourceFormatImporter::get_classes_used(const String &p_path, HashSet<Stri
|
|||
|
||||
void ResourceFormatImporter::get_dependencies(const String &p_path, List<String> *p_dependencies, bool p_add_types) {
|
||||
PathAndType pat;
|
||||
Error err = _get_path_and_type(p_path, pat);
|
||||
Error err = _get_path_and_type(p_path, pat, false);
|
||||
|
||||
if (err != OK) {
|
||||
return;
|
||||
|
@ -503,7 +515,7 @@ String ResourceFormatImporter::get_import_base_path(const String &p_for_file) co
|
|||
bool ResourceFormatImporter::are_import_settings_valid(const String &p_path) const {
|
||||
bool valid = true;
|
||||
PathAndType pat;
|
||||
_get_path_and_type(p_path, pat, &valid);
|
||||
_get_path_and_type(p_path, pat, false, &valid);
|
||||
|
||||
if (!valid) {
|
||||
return false;
|
||||
|
|
|
@ -48,7 +48,7 @@ class ResourceFormatImporter : public ResourceFormatLoader {
|
|||
ResourceUID::ID uid = ResourceUID::INVALID_ID;
|
||||
};
|
||||
|
||||
Error _get_path_and_type(const String &p_path, PathAndType &r_path_and_type, bool *r_valid = nullptr) const;
|
||||
Error _get_path_and_type(const String &p_path, PathAndType &r_path_and_type, bool p_load, bool *r_valid = nullptr) const;
|
||||
|
||||
static ResourceFormatImporter *singleton;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue