-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
30 changed files with 338 additions and 39 deletions
|
@ -32,6 +32,9 @@
|
||||||
|
|
||||||
#include "core/os/os.h"
|
#include "core/os/os.h"
|
||||||
#include "core/variant_parser.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 {
|
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;
|
r_path_and_type.type = value;
|
||||||
} else if (assign == "importer") {
|
} else if (assign == "importer") {
|
||||||
r_path_and_type.importer = value;
|
r_path_and_type.importer = value;
|
||||||
|
} else if (assign == "metadata") {
|
||||||
|
r_path_and_type.metadata = value;
|
||||||
} else if (assign == "valid") {
|
} else if (assign == "valid") {
|
||||||
if (r_valid) {
|
if (r_valid) {
|
||||||
*r_valid = value;
|
*r_valid = value;
|
||||||
|
@ -304,6 +309,19 @@ String ResourceFormatImporter::get_resource_type(const String &p_path) const {
|
||||||
return pat.type;
|
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) {
|
void ResourceFormatImporter::get_dependencies(const String &p_path, List<String> *p_dependencies, bool p_add_types) {
|
||||||
|
|
||||||
PathAndType pat;
|
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();
|
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::singleton = NULL;
|
||||||
|
|
||||||
ResourceFormatImporter::ResourceFormatImporter() {
|
ResourceFormatImporter::ResourceFormatImporter() {
|
||||||
|
|
|
@ -43,12 +43,18 @@ class ResourceFormatImporter : public ResourceFormatLoader {
|
||||||
String path;
|
String path;
|
||||||
String type;
|
String type;
|
||||||
String importer;
|
String importer;
|
||||||
|
Variant metadata;
|
||||||
};
|
};
|
||||||
|
|
||||||
Error _get_path_and_type(const String &p_path, PathAndType &r_path_and_type, bool *r_valid = NULL) const;
|
Error _get_path_and_type(const String &p_path, PathAndType &r_path_and_type, bool *r_valid = NULL) const;
|
||||||
|
|
||||||
static ResourceFormatImporter *singleton;
|
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;
|
Vector<Ref<ResourceImporter> > importers;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -59,6 +65,7 @@ public:
|
||||||
virtual bool recognize_path(const String &p_path, const String &p_for_type = String()) const;
|
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 bool handles_type(const String &p_type) const;
|
||||||
virtual String get_resource_type(const String &p_path) 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 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);
|
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;
|
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 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); }
|
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_name(const String &p_name) const;
|
||||||
Ref<ResourceImporter> get_importer_by_extension(const String &p_extension) 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);
|
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;
|
String get_import_base_path(const String &p_for_file) const;
|
||||||
ResourceFormatImporter();
|
ResourceFormatImporter();
|
||||||
};
|
};
|
||||||
|
@ -107,7 +117,10 @@ public:
|
||||||
virtual void get_import_options(List<ImportOption> *r_options, int p_preset = 0) const = 0;
|
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 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
|
#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);
|
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 {
|
int EditorExport::get_export_preset_count() const {
|
||||||
|
|
||||||
return export_presets.size();
|
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 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(); }
|
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 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;
|
virtual List<String> get_binary_extensions(const Ref<EditorExportPreset> &p_preset) const = 0;
|
||||||
|
|
|
@ -42,6 +42,8 @@
|
||||||
#include "editor_settings.h"
|
#include "editor_settings.h"
|
||||||
|
|
||||||
EditorFileSystem *EditorFileSystem::singleton = NULL;
|
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() {
|
void EditorFileSystemDirectory::sort_files() {
|
||||||
|
|
||||||
|
@ -203,14 +205,30 @@ void EditorFileSystem::_scan_filesystem() {
|
||||||
|
|
||||||
String project = ProjectSettings::get_singleton()->get_resource_path();
|
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);
|
FileAccess *f = FileAccess::open(fscache, FileAccess::READ);
|
||||||
|
|
||||||
|
bool first = true;
|
||||||
if (f) {
|
if (f) {
|
||||||
//read the disk cache
|
//read the disk cache
|
||||||
while (!f->eof_reached()) {
|
while (!f->eof_reached()) {
|
||||||
|
|
||||||
String l = f->get_line().strip_edges();
|
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())
|
if (l == String())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -291,25 +309,22 @@ void EditorFileSystem::_scan_filesystem() {
|
||||||
|
|
||||||
memdelete(d);
|
memdelete(d);
|
||||||
|
|
||||||
f = FileAccess::open(fscache, FileAccess::WRITE);
|
if (!first_scan) {
|
||||||
if (f == NULL) {
|
//on the first scan this is done from the main thread after re-importing
|
||||||
ERR_PRINTS("Error writing fscache: " + fscache);
|
_save_filesystem_cache();
|
||||||
} else {
|
|
||||||
_save_filesystem_cache(new_filesystem, f);
|
|
||||||
f->close();
|
|
||||||
memdelete(f);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
scanning = false;
|
scanning = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void EditorFileSystem::_save_filesystem_cache() {
|
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);
|
FileAccess *f = FileAccess::open(fscache, FileAccess::WRITE);
|
||||||
if (f == NULL) {
|
if (f == NULL) {
|
||||||
ERR_PRINTS("Error writing fscache: " + fscache);
|
ERR_PRINTS("Error writing fscache: " + fscache);
|
||||||
} else {
|
} else {
|
||||||
|
f->store_line(filesystem_settings_version_for_import);
|
||||||
_save_filesystem_cache(filesystem, f);
|
_save_filesystem_cache(filesystem, f);
|
||||||
f->close();
|
f->close();
|
||||||
memdelete(f);
|
memdelete(f);
|
||||||
|
@ -334,6 +349,11 @@ bool EditorFileSystem::_test_for_reimport(const String &p_path, bool p_only_impo
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!ResourceFormatImporter::get_singleton()->are_import_settings_valid(p_path)) {
|
||||||
|
//reimport settings are not valid, reimport
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
VariantParser::StreamFile stream;
|
VariantParser::StreamFile stream;
|
||||||
stream.f = f;
|
stream.f = f;
|
||||||
|
|
||||||
|
@ -562,6 +582,13 @@ bool EditorFileSystem::_update_scan_actions() {
|
||||||
reimport_files(reimports);
|
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()) {
|
if (reloads.size()) {
|
||||||
emit_signal("resources_reload", reloads);
|
emit_signal("resources_reload", reloads);
|
||||||
}
|
}
|
||||||
|
@ -595,7 +622,7 @@ void EditorFileSystem::scan() {
|
||||||
emit_signal("filesystem_changed");
|
emit_signal("filesystem_changed");
|
||||||
emit_signal("sources_changed", sources_changed.size() > 0);
|
emit_signal("sources_changed", sources_changed.size() > 0);
|
||||||
_queue_update_script_classes();
|
_queue_update_script_classes();
|
||||||
|
first_scan = false;
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
ERR_FAIL_COND(thread);
|
ERR_FAIL_COND(thread);
|
||||||
|
@ -737,11 +764,20 @@ void EditorFileSystem::_scan_new_dir(EditorFileSystemDirectory *p_dir, DirAccess
|
||||||
fi->deps = fc->deps;
|
fi->deps = fc->deps;
|
||||||
fi->modified_time = fc->modification_time;
|
fi->modified_time = fc->modification_time;
|
||||||
fi->import_modified_time = fc->import_modification_time;
|
fi->import_modified_time = fc->import_modification_time;
|
||||||
|
|
||||||
fi->import_valid = fc->import_valid;
|
fi->import_valid = fc->import_valid;
|
||||||
fi->script_class_name = fc->script_class_name;
|
fi->script_class_name = fc->script_class_name;
|
||||||
fi->script_class_extends = fc->script_class_extends;
|
fi->script_class_extends = fc->script_class_extends;
|
||||||
fi->script_class_icon_path = fc->script_class_icon_path;
|
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()) {
|
if (fc->type == String()) {
|
||||||
fi->type = ResourceLoader::get_resource_type(path);
|
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?)
|
//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("filesystem_changed");
|
||||||
emit_signal("sources_changed", sources_changed.size() > 0);
|
emit_signal("sources_changed", sources_changed.size() > 0);
|
||||||
_queue_update_script_classes();
|
_queue_update_script_classes();
|
||||||
|
first_scan = false;
|
||||||
}
|
}
|
||||||
} else if (!scanning) {
|
} else if (!scanning) {
|
||||||
|
|
||||||
|
@ -1117,6 +1154,7 @@ void EditorFileSystem::_notification(int p_what) {
|
||||||
emit_signal("filesystem_changed");
|
emit_signal("filesystem_changed");
|
||||||
emit_signal("sources_changed", sources_changed.size() > 0);
|
emit_signal("sources_changed", sources_changed.size() > 0);
|
||||||
_queue_update_script_classes();
|
_queue_update_script_classes();
|
||||||
|
first_scan = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
|
@ -1569,8 +1607,8 @@ void EditorFileSystem::_reimport_file(const String &p_file) {
|
||||||
|
|
||||||
List<String> import_variants;
|
List<String> import_variants;
|
||||||
List<String> gen_files;
|
List<String> gen_files;
|
||||||
|
Variant metadata;
|
||||||
Error err = importer->import(p_file, base_path, params, &import_variants, &gen_files);
|
Error err = importer->import(p_file, base_path, params, &import_variants, &gen_files, &metadata);
|
||||||
|
|
||||||
if (err != OK) {
|
if (err != OK) {
|
||||||
ERR_PRINTS("Error importing: " + p_file);
|
ERR_PRINTS("Error importing: " + p_file);
|
||||||
|
@ -1615,6 +1653,10 @@ void EditorFileSystem::_reimport_file(const String &p_file) {
|
||||||
f->store_line("valid=false");
|
f->store_line("valid=false");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (metadata != Variant()) {
|
||||||
|
f->store_line("metadata=" + metadata.get_construct_string());
|
||||||
|
}
|
||||||
|
|
||||||
f->store_line("");
|
f->store_line("");
|
||||||
|
|
||||||
f->store_line("[deps]\n");
|
f->store_line("[deps]\n");
|
||||||
|
@ -1815,6 +1857,8 @@ EditorFileSystem::EditorFileSystem() {
|
||||||
|
|
||||||
scan_total = 0;
|
scan_total = 0;
|
||||||
update_script_classes_queued = false;
|
update_script_classes_queued = false;
|
||||||
|
first_scan = true;
|
||||||
|
revalidate_import_files = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
EditorFileSystem::~EditorFileSystem() {
|
EditorFileSystem::~EditorFileSystem() {
|
||||||
|
|
|
@ -143,7 +143,10 @@ class EditorFileSystem : public Node {
|
||||||
bool abort_scan;
|
bool abort_scan;
|
||||||
bool scanning;
|
bool scanning;
|
||||||
bool importing;
|
bool importing;
|
||||||
|
bool first_scan;
|
||||||
float scan_total;
|
float scan_total;
|
||||||
|
String filesystem_settings_version_for_import;
|
||||||
|
bool revalidate_import_files;
|
||||||
|
|
||||||
void _scan_filesystem();
|
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);
|
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);
|
ERR_FAIL_COND_V(!(get_script_instance() && get_script_instance()->has_method("import")), ERR_UNAVAILABLE);
|
||||||
Dictionary options;
|
Dictionary options;
|
||||||
|
|
|
@ -51,7 +51,7 @@ public:
|
||||||
virtual int get_import_order() const;
|
virtual int get_import_order() const;
|
||||||
virtual void get_import_options(List<ImportOption> *r_options, int p_preset) 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 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
|
#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));
|
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"];
|
int create_from = p_options["create_from"];
|
||||||
float threshold = p_options["threshold"];
|
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 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 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();
|
||||||
~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));
|
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"];
|
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 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 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();
|
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 {
|
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);
|
FileAccess *f = FileAccess::open(p_source_file, FileAccess::READ);
|
||||||
if (!f) {
|
if (!f) {
|
||||||
|
|
|
@ -49,7 +49,7 @@ public:
|
||||||
virtual void get_import_options(List<ImportOption> *r_options, int p_preset = 0) const;
|
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 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();
|
ResourceImporterImage();
|
||||||
};
|
};
|
||||||
|
|
|
@ -191,7 +191,7 @@ void ResourceImporterLayeredTexture::_save_tex(const Vector<Ref<Image> > &p_imag
|
||||||
memdelete(f);
|
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 compress_mode = p_options["compress/mode"];
|
||||||
int no_bptc_if_rgb = p_options["compress/no_bptc_if_rgb"];
|
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();
|
String extension = get_save_extension();
|
||||||
|
Array formats_imported;
|
||||||
|
|
||||||
if (compress_mode == COMPRESS_VIDEO_RAM) {
|
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).
|
//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;
|
encode_bptc = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
formats_imported.push_back("bptc");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (encode_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);
|
_save_tex(slices, p_save_path + ".s3tc." + extension, compress_mode, Image::COMPRESS_S3TC, mipmaps, tex_flags);
|
||||||
r_platform_variants->push_back("s3tc");
|
r_platform_variants->push_back("s3tc");
|
||||||
ok_on_pc = true;
|
ok_on_pc = true;
|
||||||
|
formats_imported.push_back("s3tc");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ProjectSettings::get_singleton()->get("rendering/vram_compression/import_etc2")) {
|
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);
|
_save_tex(slices, p_save_path + ".etc2." + extension, compress_mode, Image::COMPRESS_ETC2, mipmaps, tex_flags);
|
||||||
r_platform_variants->push_back("etc2");
|
r_platform_variants->push_back("etc2");
|
||||||
|
formats_imported.push_back("etc2");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ProjectSettings::get_singleton()->get("rendering/vram_compression/import_etc")) {
|
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);
|
_save_tex(slices, p_save_path + ".etc." + extension, compress_mode, Image::COMPRESS_ETC, mipmaps, tex_flags);
|
||||||
r_platform_variants->push_back("etc");
|
r_platform_variants->push_back("etc");
|
||||||
|
formats_imported.push_back("etc");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ProjectSettings::get_singleton()->get("rendering/vram_compression/import_pvrtc")) {
|
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);
|
_save_tex(slices, p_save_path + ".pvrtc." + extension, compress_mode, Image::COMPRESS_PVRTC4, mipmaps, tex_flags);
|
||||||
r_platform_variants->push_back("pvrtc");
|
r_platform_variants->push_back("pvrtc");
|
||||||
|
formats_imported.push_back("pvrtc");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ok_on_pc) {
|
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);
|
_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;
|
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::singleton = NULL;
|
||||||
|
|
||||||
ResourceImporterLayeredTexture::ResourceImporterLayeredTexture() {
|
ResourceImporterLayeredTexture::ResourceImporterLayeredTexture() {
|
||||||
|
|
|
@ -40,6 +40,7 @@ class ResourceImporterLayeredTexture : public ResourceImporter {
|
||||||
GDCLASS(ResourceImporterLayeredTexture, ResourceImporter)
|
GDCLASS(ResourceImporterLayeredTexture, ResourceImporter)
|
||||||
|
|
||||||
bool is_3d;
|
bool is_3d;
|
||||||
|
static const char *compression_formats[];
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
static void _texture_reimport_srgb(const Ref<StreamTexture> &p_tex);
|
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);
|
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();
|
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; }
|
void set_3d(bool p_3d) { is_3d = p_3d; }
|
||||||
ResourceImporterLayeredTexture();
|
ResourceImporterLayeredTexture();
|
||||||
~ResourceImporterLayeredTexture();
|
~ResourceImporterLayeredTexture();
|
||||||
|
|
|
@ -499,7 +499,7 @@ bool ResourceImporterOBJ::get_option_visibility(const String &p_option, const Ma
|
||||||
return true;
|
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;
|
List<Ref<Mesh> > meshes;
|
||||||
|
|
||||||
|
|
|
@ -61,7 +61,7 @@ public:
|
||||||
virtual void get_import_options(List<ImportOption> *r_options, int p_preset = 0) const;
|
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 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();
|
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);
|
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;
|
String src_path = p_source_file;
|
||||||
|
|
||||||
|
|
|
@ -153,7 +153,7 @@ public:
|
||||||
void _filter_tracks(Node *scene, const String &p_text);
|
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);
|
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);
|
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);
|
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);
|
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"];
|
int compress_mode = p_options["compress/mode"];
|
||||||
float lossy = p_options["compress/lossy_quality"];
|
float lossy = p_options["compress/lossy_quality"];
|
||||||
|
@ -401,6 +401,8 @@ Error ResourceImporterTexture::import(const String &p_source_file, const String
|
||||||
if (err != OK)
|
if (err != OK)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
Array formats_imported;
|
||||||
|
|
||||||
int tex_flags = 0;
|
int tex_flags = 0;
|
||||||
if (repeat > 0)
|
if (repeat > 0)
|
||||||
tex_flags |= Texture::FLAG_REPEAT;
|
tex_flags |= Texture::FLAG_REPEAT;
|
||||||
|
@ -485,6 +487,8 @@ Error ResourceImporterTexture::import(const String &p_source_file, const String
|
||||||
can_bptc = false;
|
can_bptc = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
formats_imported.push_back("bptc");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!can_bptc && is_hdr && !force_rgbe) {
|
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) {
|
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);
|
_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");
|
r_platform_variants->push_back("s3tc");
|
||||||
|
formats_imported.push_back("s3tc");
|
||||||
ok_on_pc = true;
|
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);
|
_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");
|
r_platform_variants->push_back("etc2");
|
||||||
|
formats_imported.push_back("etc2");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ProjectSettings::get_singleton()->get("rendering/vram_compression/import_etc")) {
|
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);
|
_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");
|
r_platform_variants->push_back("etc");
|
||||||
|
formats_imported.push_back("etc");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ProjectSettings::get_singleton()->get("rendering/vram_compression/import_pvrtc")) {
|
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);
|
_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");
|
r_platform_variants->push_back("pvrtc");
|
||||||
|
formats_imported.push_back("pvrtc");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ok_on_pc) {
|
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);
|
_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;
|
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::singleton = NULL;
|
||||||
|
|
||||||
ResourceImporterTexture::ResourceImporterTexture() {
|
ResourceImporterTexture::ResourceImporterTexture() {
|
||||||
|
|
|
@ -54,6 +54,7 @@ protected:
|
||||||
static void _texture_reimport_normal(const Ref<StreamTexture> &p_tex);
|
static void _texture_reimport_normal(const Ref<StreamTexture> &p_tex);
|
||||||
|
|
||||||
static ResourceImporterTexture *singleton;
|
static ResourceImporterTexture *singleton;
|
||||||
|
static const char *compression_formats[];
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static ResourceImporterTexture *get_singleton() { return singleton; }
|
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);
|
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();
|
void update_imports();
|
||||||
|
|
||||||
|
virtual bool are_import_settings_valid(const String &p_path) const;
|
||||||
|
virtual String get_import_settings_string() const;
|
||||||
|
|
||||||
ResourceImporterTexture();
|
ResourceImporterTexture();
|
||||||
~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));
|
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 */
|
/* 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();
|
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));
|
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"];
|
bool loop = p_options["loop"];
|
||||||
float loop_offset = p_options["loop_offset"];
|
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 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 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();
|
ResourceImporterOGGVorbis();
|
||||||
};
|
};
|
||||||
|
|
|
@ -1453,6 +1453,12 @@ public:
|
||||||
err += TTR("Invalid package name:") + " " + pn_err + "\n";
|
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;
|
r_error = err;
|
||||||
return valid;
|
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())
|
if (!err.empty())
|
||||||
r_error = err;
|
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())
|
if (!err.empty())
|
||||||
r_error = err;
|
r_error = err;
|
||||||
|
|
||||||
|
|
|
@ -2368,11 +2368,11 @@ VisualServer::VisualServer() {
|
||||||
//ERR_FAIL_COND(singleton);
|
//ERR_FAIL_COND(singleton);
|
||||||
singleton = this;
|
singleton = this;
|
||||||
|
|
||||||
GLOBAL_DEF("rendering/vram_compression/import_bptc", false);
|
GLOBAL_DEF_RST("rendering/vram_compression/import_bptc", false);
|
||||||
GLOBAL_DEF("rendering/vram_compression/import_s3tc", true);
|
GLOBAL_DEF_RST("rendering/vram_compression/import_s3tc", true);
|
||||||
GLOBAL_DEF("rendering/vram_compression/import_etc", false);
|
GLOBAL_DEF_RST("rendering/vram_compression/import_etc", false);
|
||||||
GLOBAL_DEF("rendering/vram_compression/import_etc2", true);
|
GLOBAL_DEF_RST("rendering/vram_compression/import_etc2", true);
|
||||||
GLOBAL_DEF("rendering/vram_compression/import_pvrtc", false);
|
GLOBAL_DEF_RST("rendering/vram_compression/import_pvrtc", false);
|
||||||
|
|
||||||
GLOBAL_DEF("rendering/quality/directional_shadow/size", 4096);
|
GLOBAL_DEF("rendering/quality/directional_shadow/size", 4096);
|
||||||
GLOBAL_DEF("rendering/quality/directional_shadow/size.mobile", 2048);
|
GLOBAL_DEF("rendering/quality/directional_shadow/size.mobile", 2048);
|
||||||
|
|
Loading…
Reference in a new issue