-Properly handle missing ETC support on export
-Added ability for resource importers to save metadata -Added ability for resource importers to validate depending on project settings
This commit is contained in:
parent
3b0f301660
commit
f669ebeeaf
|
@ -32,6 +32,9 @@
|
|||
|
||||
#include "core/os/os.h"
|
||||
#include "core/variant_parser.h"
|
||||
bool ResourceFormatImporter::SortImporterByName::operator() ( const Ref<ResourceImporter>& p_a,const Ref<ResourceImporter>& p_b) const {
|
||||
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 {
|
||||
|
||||
|
@ -90,6 +93,8 @@ Error ResourceFormatImporter::_get_path_and_type(const String &p_path, PathAndTy
|
|||
r_path_and_type.type = value;
|
||||
} else if (assign == "importer") {
|
||||
r_path_and_type.importer = value;
|
||||
} else if (assign == "metadata") {
|
||||
r_path_and_type.metadata = value;
|
||||
} else if (assign == "valid") {
|
||||
if (r_valid) {
|
||||
*r_valid = value;
|
||||
|
@ -304,6 +309,19 @@ String ResourceFormatImporter::get_resource_type(const String &p_path) const {
|
|||
return pat.type;
|
||||
}
|
||||
|
||||
Variant ResourceFormatImporter::get_resource_metadata(const String &p_path) const {
|
||||
PathAndType pat;
|
||||
Error err = _get_path_and_type(p_path, pat);
|
||||
|
||||
if (err != OK) {
|
||||
|
||||
return Variant();
|
||||
}
|
||||
|
||||
return pat.metadata;
|
||||
}
|
||||
|
||||
|
||||
void ResourceFormatImporter::get_dependencies(const String &p_path, List<String> *p_dependencies, bool p_add_types) {
|
||||
|
||||
PathAndType pat;
|
||||
|
@ -366,6 +384,35 @@ String ResourceFormatImporter::get_import_base_path(const String &p_for_file) co
|
|||
return "res://.import/" + p_for_file.get_file() + "-" + p_for_file.md5_text();
|
||||
}
|
||||
|
||||
bool ResourceFormatImporter::are_import_settings_valid(const String &p_path) const {
|
||||
|
||||
bool valid = true;
|
||||
PathAndType pat;
|
||||
_get_path_and_type(p_path, pat, &valid);
|
||||
|
||||
if (!valid) {
|
||||
return false;
|
||||
}
|
||||
|
||||
for(int i=0;i<importers.size();i++) {
|
||||
if (importers[i]->get_importer_name() == pat.importer) {
|
||||
if (!importers[i]->are_import_settings_valid(p_path)) { //importer thinks this is not valid
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
String ResourceFormatImporter::get_import_settings_hash() const {
|
||||
String hash;
|
||||
for(int i=0;i<importers.size();i++) {
|
||||
hash+=":"+importers[i]->get_importer_name()+":"+importers[i]->get_import_settings_string();
|
||||
}
|
||||
return hash.md5_text();
|
||||
}
|
||||
|
||||
ResourceFormatImporter *ResourceFormatImporter::singleton = NULL;
|
||||
|
||||
ResourceFormatImporter::ResourceFormatImporter() {
|
||||
|
|
|
@ -43,12 +43,18 @@ class ResourceFormatImporter : public ResourceFormatLoader {
|
|||
String path;
|
||||
String type;
|
||||
String importer;
|
||||
Variant metadata;
|
||||
};
|
||||
|
||||
Error _get_path_and_type(const String &p_path, PathAndType &r_path_and_type, bool *r_valid = NULL) const;
|
||||
|
||||
static ResourceFormatImporter *singleton;
|
||||
|
||||
//need them to stay in order to compute the settings hash
|
||||
struct SortImporterByName {
|
||||
bool operator() ( const Ref<ResourceImporter>& p_a,const Ref<ResourceImporter>& p_b) const;
|
||||
};
|
||||
|
||||
Vector<Ref<ResourceImporter> > importers;
|
||||
|
||||
public:
|
||||
|
@ -59,6 +65,7 @@ public:
|
|||
virtual bool recognize_path(const String &p_path, const String &p_for_type = String()) const;
|
||||
virtual bool handles_type(const String &p_type) const;
|
||||
virtual String get_resource_type(const String &p_path) const;
|
||||
virtual Variant get_resource_metadata(const String &p_path) const;
|
||||
virtual bool is_import_valid(const String &p_path) const;
|
||||
virtual void get_dependencies(const String &p_path, List<String> *p_dependencies, bool p_add_types = false);
|
||||
|
||||
|
@ -68,12 +75,15 @@ public:
|
|||
String get_internal_resource_path(const String &p_path) const;
|
||||
void get_internal_resource_path_list(const String &p_path, List<String> *r_paths);
|
||||
|
||||
void add_importer(const Ref<ResourceImporter> &p_importer) { importers.push_back(p_importer); }
|
||||
void add_importer(const Ref<ResourceImporter> &p_importer) { importers.push_back(p_importer); importers.sort_custom<SortImporterByName>();}
|
||||
void remove_importer(const Ref<ResourceImporter> &p_importer) { importers.erase(p_importer); }
|
||||
Ref<ResourceImporter> get_importer_by_name(const String &p_name) const;
|
||||
Ref<ResourceImporter> get_importer_by_extension(const String &p_extension) const;
|
||||
void get_importers_for_extension(const String &p_extension, List<Ref<ResourceImporter> > *r_importers);
|
||||
|
||||
bool are_import_settings_valid(const String &p_path) const;
|
||||
String get_import_settings_hash() const;
|
||||
|
||||
String get_import_base_path(const String &p_for_file) const;
|
||||
ResourceFormatImporter();
|
||||
};
|
||||
|
@ -107,7 +117,10 @@ public:
|
|||
virtual void get_import_options(List<ImportOption> *r_options, int p_preset = 0) const = 0;
|
||||
virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const = 0;
|
||||
|
||||
virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = NULL) = 0;
|
||||
virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = NULL, Variant *r_metadata=NULL) = 0;
|
||||
virtual bool are_import_settings_valid(const String &p_path) const { return true; }
|
||||
virtual String get_import_settings_string() const { return String(); }
|
||||
|
||||
};
|
||||
|
||||
#endif // RESOURCE_IMPORTER_H
|
||||
|
|
|
@ -1160,6 +1160,17 @@ void EditorExport::add_export_preset(const Ref<EditorExportPreset> &p_preset, in
|
|||
export_presets.insert(p_at_pos, p_preset);
|
||||
}
|
||||
|
||||
String EditorExportPlatform::test_etc2() const {
|
||||
|
||||
String driver = ProjectSettings::get_singleton()->get("rendering/quality/driver/driver_name");
|
||||
bool etc2_supported = ProjectSettings::get_singleton()->get("rendering/vram_compression/import_etc");
|
||||
|
||||
if (driver == "GLES2" && !etc2_supported) {
|
||||
return TTR("Target platform requires 'ETC' texture compression. Enable support in Project Settings.");
|
||||
}
|
||||
return String();
|
||||
}
|
||||
|
||||
int EditorExport::get_export_preset_count() const {
|
||||
|
||||
return export_presets.size();
|
||||
|
|
|
@ -258,6 +258,7 @@ public:
|
|||
virtual Error run(const Ref<EditorExportPreset> &p_preset, int p_device, int p_debug_flags) { return OK; }
|
||||
virtual Ref<Texture> get_run_icon() const { return get_logo(); }
|
||||
|
||||
String test_etc2() const; //generic test for etc2 since most platforms use it
|
||||
virtual bool can_export(const Ref<EditorExportPreset> &p_preset, String &r_error, bool &r_missing_templates) const = 0;
|
||||
|
||||
virtual List<String> get_binary_extensions(const Ref<EditorExportPreset> &p_preset) const = 0;
|
||||
|
|
|
@ -42,6 +42,8 @@
|
|||
#include "editor_settings.h"
|
||||
|
||||
EditorFileSystem *EditorFileSystem::singleton = NULL;
|
||||
//the name is the version, to keep compatibility with different versions of Godot
|
||||
#define CACHE_FILE_NAME "filesystem_cache5"
|
||||
|
||||
void EditorFileSystemDirectory::sort_files() {
|
||||
|
||||
|
@ -203,14 +205,30 @@ void EditorFileSystem::_scan_filesystem() {
|
|||
|
||||
String project = ProjectSettings::get_singleton()->get_resource_path();
|
||||
|
||||
String fscache = EditorSettings::get_singleton()->get_project_settings_dir().plus_file("filesystem_cache4");
|
||||
String fscache = EditorSettings::get_singleton()->get_project_settings_dir().plus_file(CACHE_FILE_NAME);
|
||||
FileAccess *f = FileAccess::open(fscache, FileAccess::READ);
|
||||
|
||||
bool first = true;
|
||||
if (f) {
|
||||
//read the disk cache
|
||||
while (!f->eof_reached()) {
|
||||
|
||||
String l = f->get_line().strip_edges();
|
||||
if (first) {
|
||||
if (first_scan) {
|
||||
// only use this on first scan, afterwards it gets ignored
|
||||
// this is so on first reimport we synchronize versions, then
|
||||
// we dont care until editor restart. This is for usability mainly so
|
||||
// your workflow is not killed after changing a setting by forceful reimporting
|
||||
// everything there is.
|
||||
filesystem_settings_version_for_import = l.strip_edges();
|
||||
if (filesystem_settings_version_for_import != ResourceFormatImporter::get_singleton()->get_import_settings_hash()) {
|
||||
revalidate_import_files = true;
|
||||
}
|
||||
}
|
||||
first = false;
|
||||
continue;
|
||||
}
|
||||
if (l == String())
|
||||
continue;
|
||||
|
||||
|
@ -291,25 +309,22 @@ void EditorFileSystem::_scan_filesystem() {
|
|||
|
||||
memdelete(d);
|
||||
|
||||
f = FileAccess::open(fscache, FileAccess::WRITE);
|
||||
if (f == NULL) {
|
||||
ERR_PRINTS("Error writing fscache: " + fscache);
|
||||
} else {
|
||||
_save_filesystem_cache(new_filesystem, f);
|
||||
f->close();
|
||||
memdelete(f);
|
||||
if (!first_scan) {
|
||||
//on the first scan this is done from the main thread after re-importing
|
||||
_save_filesystem_cache();
|
||||
}
|
||||
|
||||
scanning = false;
|
||||
}
|
||||
|
||||
void EditorFileSystem::_save_filesystem_cache() {
|
||||
String fscache = EditorSettings::get_singleton()->get_project_settings_dir().plus_file("filesystem_cache4");
|
||||
String fscache = EditorSettings::get_singleton()->get_project_settings_dir().plus_file(CACHE_FILE_NAME);
|
||||
|
||||
FileAccess *f = FileAccess::open(fscache, FileAccess::WRITE);
|
||||
if (f == NULL) {
|
||||
ERR_PRINTS("Error writing fscache: " + fscache);
|
||||
} else {
|
||||
f->store_line(filesystem_settings_version_for_import);
|
||||
_save_filesystem_cache(filesystem, f);
|
||||
f->close();
|
||||
memdelete(f);
|
||||
|
@ -334,6 +349,11 @@ bool EditorFileSystem::_test_for_reimport(const String &p_path, bool p_only_impo
|
|||
return true;
|
||||
}
|
||||
|
||||
if (!ResourceFormatImporter::get_singleton()->are_import_settings_valid(p_path)) {
|
||||
//reimport settings are not valid, reimport
|
||||
return true;
|
||||
}
|
||||
|
||||
VariantParser::StreamFile stream;
|
||||
stream.f = f;
|
||||
|
||||
|
@ -562,6 +582,13 @@ bool EditorFileSystem::_update_scan_actions() {
|
|||
reimport_files(reimports);
|
||||
}
|
||||
|
||||
if (first_scan) {
|
||||
//only on first scan this is valid and updated, then settings changed.
|
||||
revalidate_import_files = false;
|
||||
filesystem_settings_version_for_import = ResourceFormatImporter::get_singleton()->get_import_settings_hash();
|
||||
_save_filesystem_cache();
|
||||
}
|
||||
|
||||
if (reloads.size()) {
|
||||
emit_signal("resources_reload", reloads);
|
||||
}
|
||||
|
@ -595,7 +622,7 @@ void EditorFileSystem::scan() {
|
|||
emit_signal("filesystem_changed");
|
||||
emit_signal("sources_changed", sources_changed.size() > 0);
|
||||
_queue_update_script_classes();
|
||||
|
||||
first_scan = false;
|
||||
} else {
|
||||
|
||||
ERR_FAIL_COND(thread);
|
||||
|
@ -737,11 +764,20 @@ void EditorFileSystem::_scan_new_dir(EditorFileSystemDirectory *p_dir, DirAccess
|
|||
fi->deps = fc->deps;
|
||||
fi->modified_time = fc->modification_time;
|
||||
fi->import_modified_time = fc->import_modification_time;
|
||||
|
||||
fi->import_valid = fc->import_valid;
|
||||
fi->script_class_name = fc->script_class_name;
|
||||
fi->script_class_extends = fc->script_class_extends;
|
||||
fi->script_class_icon_path = fc->script_class_icon_path;
|
||||
|
||||
if (revalidate_import_files && !ResourceFormatImporter::get_singleton()->are_import_settings_valid(path)) {
|
||||
ItemAction ia;
|
||||
ia.action = ItemAction::ACTION_FILE_TEST_REIMPORT;
|
||||
ia.dir = p_dir;
|
||||
ia.file = E->get();
|
||||
scan_actions.push_back(ia);
|
||||
}
|
||||
|
||||
if (fc->type == String()) {
|
||||
fi->type = ResourceLoader::get_resource_type(path);
|
||||
//there is also the chance that file type changed due to reimport, must probably check this somehow here (or kind of note it for next time in another file?)
|
||||
|
@ -1101,6 +1137,7 @@ void EditorFileSystem::_notification(int p_what) {
|
|||
emit_signal("filesystem_changed");
|
||||
emit_signal("sources_changed", sources_changed.size() > 0);
|
||||
_queue_update_script_classes();
|
||||
first_scan = false;
|
||||
}
|
||||
} else if (!scanning) {
|
||||
|
||||
|
@ -1117,6 +1154,7 @@ void EditorFileSystem::_notification(int p_what) {
|
|||
emit_signal("filesystem_changed");
|
||||
emit_signal("sources_changed", sources_changed.size() > 0);
|
||||
_queue_update_script_classes();
|
||||
first_scan = false;
|
||||
}
|
||||
}
|
||||
} break;
|
||||
|
@ -1569,8 +1607,8 @@ void EditorFileSystem::_reimport_file(const String &p_file) {
|
|||
|
||||
List<String> import_variants;
|
||||
List<String> gen_files;
|
||||
|
||||
Error err = importer->import(p_file, base_path, params, &import_variants, &gen_files);
|
||||
Variant metadata;
|
||||
Error err = importer->import(p_file, base_path, params, &import_variants, &gen_files, &metadata);
|
||||
|
||||
if (err != OK) {
|
||||
ERR_PRINTS("Error importing: " + p_file);
|
||||
|
@ -1615,6 +1653,10 @@ void EditorFileSystem::_reimport_file(const String &p_file) {
|
|||
f->store_line("valid=false");
|
||||
}
|
||||
|
||||
if (metadata != Variant()) {
|
||||
f->store_line("metadata=" + metadata.get_construct_string());
|
||||
}
|
||||
|
||||
f->store_line("");
|
||||
|
||||
f->store_line("[deps]\n");
|
||||
|
@ -1815,6 +1857,8 @@ EditorFileSystem::EditorFileSystem() {
|
|||
|
||||
scan_total = 0;
|
||||
update_script_classes_queued = false;
|
||||
first_scan = true;
|
||||
revalidate_import_files = false;
|
||||
}
|
||||
|
||||
EditorFileSystem::~EditorFileSystem() {
|
||||
|
|
|
@ -143,7 +143,10 @@ class EditorFileSystem : public Node {
|
|||
bool abort_scan;
|
||||
bool scanning;
|
||||
bool importing;
|
||||
bool first_scan;
|
||||
float scan_total;
|
||||
String filesystem_settings_version_for_import;
|
||||
bool revalidate_import_files;
|
||||
|
||||
void _scan_filesystem();
|
||||
|
||||
|
|
|
@ -130,7 +130,7 @@ bool EditorImportPlugin::get_option_visibility(const String &p_option, const Map
|
|||
return get_script_instance()->call("get_option_visibility", p_option, d);
|
||||
}
|
||||
|
||||
Error EditorImportPlugin::import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files) {
|
||||
Error EditorImportPlugin::import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files, Variant *r_metadata) {
|
||||
|
||||
ERR_FAIL_COND_V(!(get_script_instance() && get_script_instance()->has_method("import")), ERR_UNAVAILABLE);
|
||||
Dictionary options;
|
||||
|
|
|
@ -51,7 +51,7 @@ public:
|
|||
virtual int get_import_order() const;
|
||||
virtual void get_import_options(List<ImportOption> *r_options, int p_preset) const;
|
||||
virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const;
|
||||
virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files);
|
||||
virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files, Variant *r_metadata = NULL);
|
||||
};
|
||||
|
||||
#endif //EDITOR_IMPORT_PLUGIN_H
|
||||
|
|
|
@ -78,7 +78,7 @@ void ResourceImporterBitMap::get_import_options(List<ImportOption> *r_options, i
|
|||
r_options->push_back(ImportOption(PropertyInfo(Variant::REAL, "threshold", PROPERTY_HINT_RANGE, "0,1,0.01"), 0.5));
|
||||
}
|
||||
|
||||
Error ResourceImporterBitMap::import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files) {
|
||||
Error ResourceImporterBitMap::import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files, Variant *r_metadata) {
|
||||
|
||||
int create_from = p_options["create_from"];
|
||||
float threshold = p_options["threshold"];
|
||||
|
|
|
@ -51,7 +51,7 @@ public:
|
|||
|
||||
virtual void get_import_options(List<ImportOption> *r_options, int p_preset = 0) const;
|
||||
virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const;
|
||||
virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = NULL);
|
||||
virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = NULL, Variant *r_metadata = NULL);
|
||||
|
||||
ResourceImporterBitMap();
|
||||
~ResourceImporterBitMap();
|
||||
|
|
|
@ -77,7 +77,7 @@ void ResourceImporterCSVTranslation::get_import_options(List<ImportOption> *r_op
|
|||
r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "delimiter", PROPERTY_HINT_ENUM, "Comma,Semicolon,Tab"), 0));
|
||||
}
|
||||
|
||||
Error ResourceImporterCSVTranslation::import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files) {
|
||||
Error ResourceImporterCSVTranslation::import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files, Variant *r_metadata) {
|
||||
|
||||
bool compress = p_options["compress"];
|
||||
|
||||
|
|
|
@ -48,7 +48,7 @@ public:
|
|||
virtual void get_import_options(List<ImportOption> *r_options, int p_preset = 0) const;
|
||||
virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const;
|
||||
|
||||
virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = NULL);
|
||||
virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = NULL, Variant *r_metadata = NULL);
|
||||
|
||||
ResourceImporterCSVTranslation();
|
||||
};
|
||||
|
|
|
@ -74,7 +74,7 @@ String ResourceImporterImage::get_preset_name(int p_idx) const {
|
|||
void ResourceImporterImage::get_import_options(List<ImportOption> *r_options, int p_preset) const {
|
||||
}
|
||||
|
||||
Error ResourceImporterImage::import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files) {
|
||||
Error ResourceImporterImage::import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files, Variant *r_metadata) {
|
||||
|
||||
FileAccess *f = FileAccess::open(p_source_file, FileAccess::READ);
|
||||
if (!f) {
|
||||
|
|
|
@ -49,7 +49,7 @@ public:
|
|||
virtual void get_import_options(List<ImportOption> *r_options, int p_preset = 0) const;
|
||||
virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const;
|
||||
|
||||
virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = NULL);
|
||||
virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = NULL, Variant *r_metadata = NULL);
|
||||
|
||||
ResourceImporterImage();
|
||||
};
|
||||
|
|
|
@ -191,7 +191,7 @@ void ResourceImporterLayeredTexture::_save_tex(const Vector<Ref<Image> > &p_imag
|
|||
memdelete(f);
|
||||
}
|
||||
|
||||
Error ResourceImporterLayeredTexture::import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files) {
|
||||
Error ResourceImporterLayeredTexture::import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files, Variant *r_metadata) {
|
||||
|
||||
int compress_mode = p_options["compress/mode"];
|
||||
int no_bptc_if_rgb = p_options["compress/no_bptc_if_rgb"];
|
||||
|
@ -252,6 +252,7 @@ Error ResourceImporterLayeredTexture::import(const String &p_source_file, const
|
|||
}
|
||||
|
||||
String extension = get_save_extension();
|
||||
Array formats_imported;
|
||||
|
||||
if (compress_mode == COMPRESS_VIDEO_RAM) {
|
||||
//must import in all formats, in order of priority (so platform choses the best supported one. IE, etc2 over etc).
|
||||
|
@ -270,6 +271,8 @@ Error ResourceImporterLayeredTexture::import(const String &p_source_file, const
|
|||
encode_bptc = false;
|
||||
}
|
||||
}
|
||||
|
||||
formats_imported.push_back("bptc");
|
||||
}
|
||||
|
||||
if (encode_bptc) {
|
||||
|
@ -284,23 +287,27 @@ Error ResourceImporterLayeredTexture::import(const String &p_source_file, const
|
|||
_save_tex(slices, p_save_path + ".s3tc." + extension, compress_mode, Image::COMPRESS_S3TC, mipmaps, tex_flags);
|
||||
r_platform_variants->push_back("s3tc");
|
||||
ok_on_pc = true;
|
||||
formats_imported.push_back("s3tc");
|
||||
}
|
||||
|
||||
if (ProjectSettings::get_singleton()->get("rendering/vram_compression/import_etc2")) {
|
||||
|
||||
_save_tex(slices, p_save_path + ".etc2." + extension, compress_mode, Image::COMPRESS_ETC2, mipmaps, tex_flags);
|
||||
r_platform_variants->push_back("etc2");
|
||||
formats_imported.push_back("etc2");
|
||||
}
|
||||
|
||||
if (ProjectSettings::get_singleton()->get("rendering/vram_compression/import_etc")) {
|
||||
_save_tex(slices, p_save_path + ".etc." + extension, compress_mode, Image::COMPRESS_ETC, mipmaps, tex_flags);
|
||||
r_platform_variants->push_back("etc");
|
||||
formats_imported.push_back("etc");
|
||||
}
|
||||
|
||||
if (ProjectSettings::get_singleton()->get("rendering/vram_compression/import_pvrtc")) {
|
||||
|
||||
_save_tex(slices, p_save_path + ".pvrtc." + extension, compress_mode, Image::COMPRESS_PVRTC4, mipmaps, tex_flags);
|
||||
r_platform_variants->push_back("pvrtc");
|
||||
formats_imported.push_back("pvrtc");
|
||||
}
|
||||
|
||||
if (!ok_on_pc) {
|
||||
|
@ -311,9 +318,79 @@ Error ResourceImporterLayeredTexture::import(const String &p_source_file, const
|
|||
_save_tex(slices, p_save_path + "." + extension, compress_mode, Image::COMPRESS_S3TC /*this is ignored */, mipmaps, tex_flags);
|
||||
}
|
||||
|
||||
if (r_metadata) {
|
||||
Dictionary metadata;
|
||||
metadata["vram_texture"] = compress_mode == COMPRESS_VIDEO_RAM;
|
||||
if (formats_imported.size()) {
|
||||
metadata["imported_formats"] = formats_imported;
|
||||
}
|
||||
*r_metadata = metadata;
|
||||
}
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
const char *ResourceImporterLayeredTexture::compression_formats[] = {
|
||||
"bptc",
|
||||
"s3tc",
|
||||
"etc",
|
||||
"etc2",
|
||||
"pvrtc",
|
||||
NULL
|
||||
};
|
||||
String ResourceImporterLayeredTexture::get_import_settings_string() const {
|
||||
|
||||
String s;
|
||||
|
||||
int index = 0;
|
||||
while (compression_formats[index]) {
|
||||
String setting_path = "rendering/vram_compression/import_" + String(compression_formats[index]);
|
||||
bool test = ProjectSettings::get_singleton()->get(setting_path);
|
||||
if (test) {
|
||||
s += String(compression_formats[index]);
|
||||
}
|
||||
index++;
|
||||
}
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
bool ResourceImporterLayeredTexture::are_import_settings_valid(const String &p_path) const {
|
||||
|
||||
//will become invalid if formats are missing to import
|
||||
Dictionary metadata = ResourceFormatImporter::get_singleton()->get_resource_metadata(p_path);
|
||||
|
||||
if (!metadata.has("vram_texture")) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool vram = metadata["vram_texture"];
|
||||
if (!vram) {
|
||||
return true; //do not care about non vram
|
||||
}
|
||||
|
||||
Vector<String> formats_imported;
|
||||
if (metadata.has("imported_formats")) {
|
||||
formats_imported = metadata["imported_formats"];
|
||||
}
|
||||
|
||||
int index = 0;
|
||||
bool valid = true;
|
||||
while (compression_formats[index]) {
|
||||
String setting_path = "rendering/vram_compression/import_" + String(compression_formats[index]);
|
||||
bool test = ProjectSettings::get_singleton()->get(setting_path);
|
||||
if (test) {
|
||||
if (formats_imported.find(compression_formats[index]) == -1) {
|
||||
valid = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
index++;
|
||||
}
|
||||
|
||||
return valid;
|
||||
}
|
||||
|
||||
ResourceImporterLayeredTexture *ResourceImporterLayeredTexture::singleton = NULL;
|
||||
|
||||
ResourceImporterLayeredTexture::ResourceImporterLayeredTexture() {
|
||||
|
|
|
@ -40,6 +40,7 @@ class ResourceImporterLayeredTexture : public ResourceImporter {
|
|||
GDCLASS(ResourceImporterLayeredTexture, ResourceImporter)
|
||||
|
||||
bool is_3d;
|
||||
static const char *compression_formats[];
|
||||
|
||||
protected:
|
||||
static void _texture_reimport_srgb(const Ref<StreamTexture> &p_tex);
|
||||
|
@ -76,10 +77,13 @@ public:
|
|||
|
||||
void _save_tex(const Vector<Ref<Image> > &p_images, const String &p_to_path, int p_compress_mode, Image::CompressMode p_vram_compression, bool p_mipmaps, int p_texture_flags);
|
||||
|
||||
virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = NULL);
|
||||
virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = NULL, Variant *r_metadata = NULL);
|
||||
|
||||
void update_imports();
|
||||
|
||||
virtual bool are_import_settings_valid(const String &p_path) const;
|
||||
virtual String get_import_settings_string() const;
|
||||
|
||||
void set_3d(bool p_3d) { is_3d = p_3d; }
|
||||
ResourceImporterLayeredTexture();
|
||||
~ResourceImporterLayeredTexture();
|
||||
|
|
|
@ -499,7 +499,7 @@ bool ResourceImporterOBJ::get_option_visibility(const String &p_option, const Ma
|
|||
return true;
|
||||
}
|
||||
|
||||
Error ResourceImporterOBJ::import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files) {
|
||||
Error ResourceImporterOBJ::import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files, Variant *r_metadata) {
|
||||
|
||||
List<Ref<Mesh> > meshes;
|
||||
|
||||
|
|
|
@ -61,7 +61,7 @@ public:
|
|||
virtual void get_import_options(List<ImportOption> *r_options, int p_preset = 0) const;
|
||||
virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const;
|
||||
|
||||
virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = NULL);
|
||||
virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = NULL, Variant *r_metadata = NULL);
|
||||
|
||||
ResourceImporterOBJ();
|
||||
};
|
||||
|
|
|
@ -1183,7 +1183,7 @@ Ref<Animation> ResourceImporterScene::import_animation_from_other_importer(Edito
|
|||
return importer->import_animation(p_path, p_flags, p_bake_fps);
|
||||
}
|
||||
|
||||
Error ResourceImporterScene::import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files) {
|
||||
Error ResourceImporterScene::import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files, Variant *r_metadata) {
|
||||
|
||||
String src_path = p_source_file;
|
||||
|
||||
|
|
|
@ -153,7 +153,7 @@ public:
|
|||
void _filter_tracks(Node *scene, const String &p_text);
|
||||
void _optimize_animations(Node *scene, float p_max_lin_error, float p_max_ang_error, float p_max_angle);
|
||||
|
||||
virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = NULL);
|
||||
virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = NULL, Variant *r_metadata = NULL);
|
||||
|
||||
Node *import_scene_from_other_importer(EditorSceneImporter *p_exception, const String &p_path, uint32_t p_flags, int p_bake_fps);
|
||||
Ref<Animation> import_animation_from_other_importer(EditorSceneImporter *p_exception, const String &p_path, uint32_t p_flags, int p_bake_fps);
|
||||
|
|
|
@ -375,7 +375,7 @@ void ResourceImporterTexture::_save_stex(const Ref<Image> &p_image, const String
|
|||
memdelete(f);
|
||||
}
|
||||
|
||||
Error ResourceImporterTexture::import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files) {
|
||||
Error ResourceImporterTexture::import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files, Variant *r_metadata) {
|
||||
|
||||
int compress_mode = p_options["compress/mode"];
|
||||
float lossy = p_options["compress/lossy_quality"];
|
||||
|
@ -401,6 +401,8 @@ Error ResourceImporterTexture::import(const String &p_source_file, const String
|
|||
if (err != OK)
|
||||
return err;
|
||||
|
||||
Array formats_imported;
|
||||
|
||||
int tex_flags = 0;
|
||||
if (repeat > 0)
|
||||
tex_flags |= Texture::FLAG_REPEAT;
|
||||
|
@ -485,6 +487,8 @@ Error ResourceImporterTexture::import(const String &p_source_file, const String
|
|||
can_bptc = false;
|
||||
}
|
||||
}
|
||||
|
||||
formats_imported.push_back("bptc");
|
||||
}
|
||||
|
||||
if (!can_bptc && is_hdr && !force_rgbe) {
|
||||
|
@ -495,6 +499,7 @@ Error ResourceImporterTexture::import(const String &p_source_file, const String
|
|||
if (can_bptc || can_s3tc) {
|
||||
_save_stex(image, p_save_path + ".s3tc.stex", compress_mode, lossy, can_bptc ? Image::COMPRESS_BPTC : Image::COMPRESS_S3TC, mipmaps, tex_flags, stream, detect_3d, detect_srgb, force_rgbe, detect_normal, force_normal, false);
|
||||
r_platform_variants->push_back("s3tc");
|
||||
formats_imported.push_back("s3tc");
|
||||
ok_on_pc = true;
|
||||
}
|
||||
|
||||
|
@ -502,17 +507,20 @@ Error ResourceImporterTexture::import(const String &p_source_file, const String
|
|||
|
||||
_save_stex(image, p_save_path + ".etc2.stex", compress_mode, lossy, Image::COMPRESS_ETC2, mipmaps, tex_flags, stream, detect_3d, detect_srgb, force_rgbe, detect_normal, force_normal, false);
|
||||
r_platform_variants->push_back("etc2");
|
||||
formats_imported.push_back("etc2");
|
||||
}
|
||||
|
||||
if (ProjectSettings::get_singleton()->get("rendering/vram_compression/import_etc")) {
|
||||
_save_stex(image, p_save_path + ".etc.stex", compress_mode, lossy, Image::COMPRESS_ETC, mipmaps, tex_flags, stream, detect_3d, detect_srgb, force_rgbe, detect_normal, force_normal, true);
|
||||
r_platform_variants->push_back("etc");
|
||||
formats_imported.push_back("etc");
|
||||
}
|
||||
|
||||
if (ProjectSettings::get_singleton()->get("rendering/vram_compression/import_pvrtc")) {
|
||||
|
||||
_save_stex(image, p_save_path + ".pvrtc.stex", compress_mode, lossy, Image::COMPRESS_PVRTC4, mipmaps, tex_flags, stream, detect_3d, detect_srgb, force_rgbe, detect_normal, force_normal, true);
|
||||
r_platform_variants->push_back("pvrtc");
|
||||
formats_imported.push_back("pvrtc");
|
||||
}
|
||||
|
||||
if (!ok_on_pc) {
|
||||
|
@ -523,9 +531,78 @@ Error ResourceImporterTexture::import(const String &p_source_file, const String
|
|||
_save_stex(image, p_save_path + ".stex", compress_mode, lossy, Image::COMPRESS_S3TC /*this is ignored */, mipmaps, tex_flags, stream, detect_3d, detect_srgb, force_rgbe, detect_normal, force_normal, false);
|
||||
}
|
||||
|
||||
if (r_metadata) {
|
||||
Dictionary metadata;
|
||||
metadata["vram_texture"] = compress_mode == COMPRESS_VIDEO_RAM;
|
||||
if (formats_imported.size()) {
|
||||
metadata["imported_formats"] = formats_imported;
|
||||
}
|
||||
*r_metadata = metadata;
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
|
||||
const char *ResourceImporterTexture::compression_formats[] = {
|
||||
"bptc",
|
||||
"s3tc",
|
||||
"etc",
|
||||
"etc2",
|
||||
"pvrtc",
|
||||
NULL
|
||||
};
|
||||
String ResourceImporterTexture::get_import_settings_string() const {
|
||||
|
||||
String s;
|
||||
|
||||
int index = 0;
|
||||
while (compression_formats[index]) {
|
||||
String setting_path = "rendering/vram_compression/import_" + String(compression_formats[index]);
|
||||
bool test = ProjectSettings::get_singleton()->get(setting_path);
|
||||
if (test) {
|
||||
s += String(compression_formats[index]);
|
||||
}
|
||||
index++;
|
||||
}
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
bool ResourceImporterTexture::are_import_settings_valid(const String &p_path) const {
|
||||
|
||||
//will become invalid if formats are missing to import
|
||||
Dictionary metadata = ResourceFormatImporter::get_singleton()->get_resource_metadata(p_path);
|
||||
|
||||
if (!metadata.has("vram_texture")) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool vram = metadata["vram_texture"];
|
||||
if (!vram) {
|
||||
return true; //do not care about non vram
|
||||
}
|
||||
|
||||
Vector<String> formats_imported;
|
||||
if (metadata.has("imported_formats")) {
|
||||
formats_imported = metadata["imported_formats"];
|
||||
}
|
||||
|
||||
int index = 0;
|
||||
bool valid = true;
|
||||
while (compression_formats[index]) {
|
||||
String setting_path = "rendering/vram_compression/import_" + String(compression_formats[index]);
|
||||
bool test = ProjectSettings::get_singleton()->get(setting_path);
|
||||
if (test) {
|
||||
if (formats_imported.find(compression_formats[index]) == -1) {
|
||||
valid = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
index++;
|
||||
}
|
||||
|
||||
return valid;
|
||||
}
|
||||
|
||||
ResourceImporterTexture *ResourceImporterTexture::singleton = NULL;
|
||||
|
||||
ResourceImporterTexture::ResourceImporterTexture() {
|
||||
|
|
|
@ -54,6 +54,7 @@ protected:
|
|||
static void _texture_reimport_normal(const Ref<StreamTexture> &p_tex);
|
||||
|
||||
static ResourceImporterTexture *singleton;
|
||||
static const char *compression_formats[];
|
||||
|
||||
public:
|
||||
static ResourceImporterTexture *get_singleton() { return singleton; }
|
||||
|
@ -85,10 +86,13 @@ public:
|
|||
|
||||
void _save_stex(const Ref<Image> &p_image, const String &p_to_path, int p_compress_mode, float p_lossy_quality, Image::CompressMode p_vram_compression, bool p_mipmaps, int p_texture_flags, bool p_streamable, bool p_detect_3d, bool p_detect_srgb, bool p_force_rgbe, bool p_detect_normal, bool p_force_normal, bool p_force_po2_for_compressed);
|
||||
|
||||
virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = NULL);
|
||||
virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = NULL, Variant *r_metadata = NULL);
|
||||
|
||||
void update_imports();
|
||||
|
||||
virtual bool are_import_settings_valid(const String &p_path) const;
|
||||
virtual String get_import_settings_string() const;
|
||||
|
||||
ResourceImporterTexture();
|
||||
~ResourceImporterTexture();
|
||||
};
|
||||
|
|
|
@ -82,7 +82,7 @@ void ResourceImporterWAV::get_import_options(List<ImportOption> *r_options, int
|
|||
r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "compress/mode", PROPERTY_HINT_ENUM, "Disabled,RAM (Ima-ADPCM)"), 0));
|
||||
}
|
||||
|
||||
Error ResourceImporterWAV::import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files) {
|
||||
Error ResourceImporterWAV::import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files, Variant *r_metadata) {
|
||||
|
||||
/* STEP 1, READ WAVE FILE */
|
||||
|
||||
|
|
|
@ -161,7 +161,7 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = NULL);
|
||||
virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = NULL, Variant *r_metadata = NULL);
|
||||
|
||||
ResourceImporterWAV();
|
||||
};
|
||||
|
|
|
@ -76,7 +76,7 @@ void ResourceImporterOGGVorbis::get_import_options(List<ImportOption> *r_options
|
|||
r_options->push_back(ImportOption(PropertyInfo(Variant::REAL, "loop_offset"), 0));
|
||||
}
|
||||
|
||||
Error ResourceImporterOGGVorbis::import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files) {
|
||||
Error ResourceImporterOGGVorbis::import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files, Variant *r_metadata) {
|
||||
|
||||
bool loop = p_options["loop"];
|
||||
float loop_offset = p_options["loop_offset"];
|
||||
|
|
|
@ -49,7 +49,7 @@ public:
|
|||
virtual void get_import_options(List<ImportOption> *r_options, int p_preset = 0) const;
|
||||
virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const;
|
||||
|
||||
virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = NULL);
|
||||
virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = NULL, Variant *r_metadata = NULL);
|
||||
|
||||
ResourceImporterOGGVorbis();
|
||||
};
|
||||
|
|
|
@ -1453,6 +1453,12 @@ public:
|
|||
err += TTR("Invalid package name:") + " " + pn_err + "\n";
|
||||
}
|
||||
|
||||
String etc_error = test_etc2();
|
||||
if (etc_error != String()) {
|
||||
valid = false;
|
||||
err += etc_error;
|
||||
}
|
||||
|
||||
r_error = err;
|
||||
return valid;
|
||||
}
|
||||
|
|
|
@ -1150,6 +1150,12 @@ bool EditorExportPlatformIOS::can_export(const Ref<EditorExportPreset> &p_preset
|
|||
}
|
||||
}
|
||||
|
||||
String etc_error = test_etc2();
|
||||
if (etc_error != String()) {
|
||||
valid = false;
|
||||
err += etc_error;
|
||||
}
|
||||
|
||||
if (!err.empty())
|
||||
r_error = err;
|
||||
|
||||
|
|
|
@ -167,6 +167,12 @@ bool EditorExportPlatformJavaScript::can_export(const Ref<EditorExportPreset> &p
|
|||
}
|
||||
}
|
||||
|
||||
String etc_error = test_etc2();
|
||||
if (etc_error != String()) {
|
||||
valid = false;
|
||||
err += etc_error;
|
||||
}
|
||||
|
||||
if (!err.empty())
|
||||
r_error = err;
|
||||
|
||||
|
|
|
@ -2368,11 +2368,11 @@ VisualServer::VisualServer() {
|
|||
//ERR_FAIL_COND(singleton);
|
||||
singleton = this;
|
||||
|
||||
GLOBAL_DEF("rendering/vram_compression/import_bptc", false);
|
||||
GLOBAL_DEF("rendering/vram_compression/import_s3tc", true);
|
||||
GLOBAL_DEF("rendering/vram_compression/import_etc", false);
|
||||
GLOBAL_DEF("rendering/vram_compression/import_etc2", true);
|
||||
GLOBAL_DEF("rendering/vram_compression/import_pvrtc", false);
|
||||
GLOBAL_DEF_RST("rendering/vram_compression/import_bptc", false);
|
||||
GLOBAL_DEF_RST("rendering/vram_compression/import_s3tc", true);
|
||||
GLOBAL_DEF_RST("rendering/vram_compression/import_etc", false);
|
||||
GLOBAL_DEF_RST("rendering/vram_compression/import_etc2", true);
|
||||
GLOBAL_DEF_RST("rendering/vram_compression/import_pvrtc", false);
|
||||
|
||||
GLOBAL_DEF("rendering/quality/directional_shadow/size", 4096);
|
||||
GLOBAL_DEF("rendering/quality/directional_shadow/size.mobile", 2048);
|
||||
|
|
Loading…
Reference in New Issue