2
0
Эх сурвалжийг харах

-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

Juan Linietsky 6 жил өмнө
parent
commit
f669ebeeaf
30 өөрчлөгдсөн 338 нэмэгдсэн , 39 устгасан
  1. 47 0
      core/io/resource_importer.cpp
  2. 15 2
      core/io/resource_importer.h
  3. 11 0
      editor/editor_export.cpp
  4. 1 0
      editor/editor_export.h
  5. 56 12
      editor/editor_file_system.cpp
  6. 3 0
      editor/editor_file_system.h
  7. 1 1
      editor/import/editor_import_plugin.cpp
  8. 1 1
      editor/import/editor_import_plugin.h
  9. 1 1
      editor/import/resource_importer_bitmask.cpp
  10. 1 1
      editor/import/resource_importer_bitmask.h
  11. 1 1
      editor/import/resource_importer_csv_translation.cpp
  12. 1 1
      editor/import/resource_importer_csv_translation.h
  13. 1 1
      editor/import/resource_importer_image.cpp
  14. 1 1
      editor/import/resource_importer_image.h
  15. 78 1
      editor/import/resource_importer_layered_texture.cpp
  16. 5 1
      editor/import/resource_importer_layered_texture.h
  17. 1 1
      editor/import/resource_importer_obj.cpp
  18. 1 1
      editor/import/resource_importer_obj.h
  19. 1 1
      editor/import/resource_importer_scene.cpp
  20. 1 1
      editor/import/resource_importer_scene.h
  21. 78 1
      editor/import/resource_importer_texture.cpp
  22. 5 1
      editor/import/resource_importer_texture.h
  23. 1 1
      editor/import/resource_importer_wav.cpp
  24. 1 1
      editor/import/resource_importer_wav.h
  25. 1 1
      modules/stb_vorbis/resource_importer_ogg_vorbis.cpp
  26. 1 1
      modules/stb_vorbis/resource_importer_ogg_vorbis.h
  27. 6 0
      platform/android/export/export.cpp
  28. 6 0
      platform/iphone/export/export.cpp
  29. 6 0
      platform/javascript/export/export.cpp
  30. 5 5
      servers/visual_server.cpp

+ 47 - 0
core/io/resource_importer.cpp

@@ -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() {

+ 15 - 2
core/io/resource_importer.h

@@ -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

+ 11 - 0
editor/editor_export.cpp

@@ -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();

+ 1 - 0
editor/editor_export.h

@@ -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;

+ 56 - 12
editor/editor_file_system.cpp

@@ -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() {

+ 3 - 0
editor/editor_file_system.h

@@ -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();
 

+ 1 - 1
editor/import/editor_import_plugin.cpp

@@ -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;

+ 1 - 1
editor/import/editor_import_plugin.h

@@ -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

+ 1 - 1
editor/import/resource_importer_bitmask.cpp

@@ -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"];

+ 1 - 1
editor/import/resource_importer_bitmask.h

@@ -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();

+ 1 - 1
editor/import/resource_importer_csv_translation.cpp

@@ -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"];
 

+ 1 - 1
editor/import/resource_importer_csv_translation.h

@@ -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();
 };

+ 1 - 1
editor/import/resource_importer_image.cpp

@@ -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) {

+ 1 - 1
editor/import/resource_importer_image.h

@@ -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();
 };

+ 78 - 1
editor/import/resource_importer_layered_texture.cpp

@@ -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() {

+ 5 - 1
editor/import/resource_importer_layered_texture.h

@@ -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();

+ 1 - 1
editor/import/resource_importer_obj.cpp

@@ -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;
 

+ 1 - 1
editor/import/resource_importer_obj.h

@@ -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();
 };

+ 1 - 1
editor/import/resource_importer_scene.cpp

@@ -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;
 

+ 1 - 1
editor/import/resource_importer_scene.h

@@ -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);

+ 78 - 1
editor/import/resource_importer_texture.cpp

@@ -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() {

+ 5 - 1
editor/import/resource_importer_texture.h

@@ -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();
 };

+ 1 - 1
editor/import/resource_importer_wav.cpp

@@ -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 */
 

+ 1 - 1
editor/import/resource_importer_wav.h

@@ -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();
 };

+ 1 - 1
modules/stb_vorbis/resource_importer_ogg_vorbis.cpp

@@ -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"];

+ 1 - 1
modules/stb_vorbis/resource_importer_ogg_vorbis.h

@@ -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();
 };

+ 6 - 0
platform/android/export/export.cpp

@@ -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;
 	}

+ 6 - 0
platform/iphone/export/export.cpp

@@ -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;
 

+ 6 - 0
platform/javascript/export/export.cpp

@@ -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;
 

+ 5 - 5
servers/visual_server.cpp

@@ -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);