Browse Source

Add a button in the export dialog to fix missing texture formats

Aaron Franke 2 years ago
parent
commit
ada360affe

+ 0 - 17
editor/export/editor_export.cpp

@@ -32,7 +32,6 @@
 
 #include "core/config/project_settings.h"
 #include "core/io/config_file.h"
-#include "editor/import/resource_importer_texture_settings.h"
 
 EditorExport *EditorExport::singleton = nullptr;
 
@@ -138,22 +137,6 @@ void EditorExport::add_export_preset(const Ref<EditorExportPreset> &p_preset, in
 	}
 }
 
-String EditorExportPlatform::test_etc2() const {
-	if (!ResourceImporterTextureSettings::should_import_etc2_astc()) {
-		return TTR("Target platform requires 'ETC2/ASTC' texture compression. Enable 'Import ETC2 ASTC' in Project Settings.") + "\n";
-	}
-
-	return String();
-}
-
-String EditorExportPlatform::test_bc() const {
-	if (!ResourceImporterTextureSettings::should_import_s3tc_bptc()) {
-		return TTR("Target platform requires 'S3TC/BPTC' texture compression. Enable 'Import S3TC BPTC' in Project Settings.") + "\n";
-	}
-
-	return String();
-}
-
 int EditorExport::get_export_preset_count() const {
 	return export_presets.size();
 }

+ 0 - 2
editor/export/editor_export_platform.h

@@ -237,8 +237,6 @@ public:
 	virtual Error run(const Ref<EditorExportPreset> &p_preset, int p_device, int p_debug_flags) { return OK; }
 	virtual Ref<Texture2D> get_run_icon() const { return get_logo(); }
 
-	String test_etc2() const;
-	String test_bc() const;
 	bool can_export(const Ref<EditorExportPreset> &p_preset, String &r_error, bool &r_missing_templates, bool p_debug = false) const;
 	virtual bool has_valid_export_configuration(const Ref<EditorExportPreset> &p_preset, String &r_error, bool &r_missing_templates, bool p_debug = false) const = 0;
 	virtual bool has_valid_project_configuration(const Ref<EditorExportPreset> &p_preset, String &r_error) const = 0;

+ 64 - 8
editor/export/project_export.cpp

@@ -39,6 +39,7 @@
 #include "editor/editor_settings.h"
 #include "editor/export/editor_export.h"
 #include "editor/gui/editor_file_dialog.h"
+#include "editor/import/resource_importer_texture_settings.h"
 #include "scene/gui/check_box.h"
 #include "scene/gui/check_button.h"
 #include "scene/gui/item_list.h"
@@ -51,6 +52,44 @@
 #include "scene/gui/texture_rect.h"
 #include "scene/gui/tree.h"
 
+void ProjectExportTextureFormatError::_on_fix_texture_format_pressed() {
+	ProjectSettings::get_singleton()->set_setting(setting_identifier, true);
+	ProjectSettings::get_singleton()->save();
+	EditorFileSystem::get_singleton()->scan_changes();
+	emit_signal("texture_format_enabled");
+}
+
+void ProjectExportTextureFormatError::_bind_methods() {
+	ADD_SIGNAL(MethodInfo("texture_format_enabled"));
+}
+
+void ProjectExportTextureFormatError::_notification(int p_what) {
+	switch (p_what) {
+		case NOTIFICATION_ENTER_TREE:
+		case NOTIFICATION_THEME_CHANGED: {
+			texture_format_error_label->add_theme_color_override("font_color", get_theme_color(SNAME("error_color"), SNAME("Editor")));
+		} break;
+	}
+}
+
+void ProjectExportTextureFormatError::show_for_texture_format(const String &p_friendly_name, const String &p_setting_identifier) {
+	texture_format_error_label->set_text(vformat(TTR("Target platform requires '%s' texture compression. Enable 'Import %s' to fix."), p_friendly_name, p_friendly_name.replace("/", " ")));
+	setting_identifier = p_setting_identifier;
+	show();
+}
+
+ProjectExportTextureFormatError::ProjectExportTextureFormatError() {
+	// Set up the label.
+	texture_format_error_label = memnew(Label);
+	add_child(texture_format_error_label);
+	// Set up the fix button.
+	fix_texture_format_button = memnew(LinkButton);
+	fix_texture_format_button->set_v_size_flags(Control::SIZE_SHRINK_CENTER);
+	fix_texture_format_button->set_text(TTR("Fix Import"));
+	add_child(fix_texture_format_button);
+	fix_texture_format_button->connect("pressed", callable_mp(this, &ProjectExportTextureFormatError::_on_fix_texture_format_pressed));
+}
+
 void ProjectExportDialog::_theme_changed() {
 	duplicate_preset->set_icon(presets->get_theme_icon(SNAME("Duplicate"), SNAME("EditorIcons")));
 	delete_preset->set_icon(presets->get_theme_icon(SNAME("Remove"), SNAME("EditorIcons")));
@@ -300,6 +339,14 @@ void ProjectExportDialog::_edit_preset(int p_index) {
 	_update_export_all();
 	child_controls_changed();
 
+	if ((feature_set.has("s3tc") || feature_set.has("bptc")) && !ResourceImporterTextureSettings::should_import_s3tc_bptc()) {
+		export_texture_format_error->show_for_texture_format("S3TC/BPTC", "rendering/textures/vram_compression/import_s3tc_bptc");
+	} else if ((feature_set.has("etc2") || feature_set.has("astc")) && !ResourceImporterTextureSettings::should_import_etc2_astc()) {
+		export_texture_format_error->show_for_texture_format("ETC2/ASTC", "rendering/textures/vram_compression/import_etc2_astc");
+	} else {
+		export_texture_format_error->hide();
+	}
+
 	String enc_in_filters_str = current->get_enc_in_filter();
 	String enc_ex_filters_str = current->get_enc_ex_filter();
 	if (!updating_enc_filters) {
@@ -343,29 +390,29 @@ void ProjectExportDialog::_update_feature_list() {
 	Ref<EditorExportPreset> current = get_current_preset();
 	ERR_FAIL_COND(current.is_null());
 
-	RBSet<String> fset;
-	List<String> features;
+	List<String> features_list;
 
-	current->get_platform()->get_platform_features(&features);
-	current->get_platform()->get_preset_features(current, &features);
+	current->get_platform()->get_platform_features(&features_list);
+	current->get_platform()->get_preset_features(current, &features_list);
 
 	String custom = current->get_custom_features();
 	Vector<String> custom_list = custom.split(",");
 	for (int i = 0; i < custom_list.size(); i++) {
 		String f = custom_list[i].strip_edges();
 		if (!f.is_empty()) {
-			features.push_back(f);
+			features_list.push_back(f);
 		}
 	}
 
-	for (const String &E : features) {
-		fset.insert(E);
+	feature_set.clear();
+	for (const String &E : features_list) {
+		feature_set.insert(E);
 	}
 
 	custom_feature_display->clear();
 	String text;
 	bool first = true;
-	for (const String &E : fset) {
+	for (const String &E : feature_set) {
 		if (!first) {
 			text += ", ";
 		} else {
@@ -1356,6 +1403,13 @@ ProjectExportDialog::ProjectExportDialog() {
 	add_child(export_pck_zip);
 	export_pck_zip->connect("file_selected", callable_mp(this, &ProjectExportDialog::_export_pck_zip_selected));
 
+	// Export warnings and errors bottom section.
+
+	export_texture_format_error = memnew(ProjectExportTextureFormatError);
+	main_vb->add_child(export_texture_format_error);
+	export_texture_format_error->hide();
+	export_texture_format_error->connect("texture_format_enabled", callable_mp(this, &ProjectExportDialog::_update_current_preset));
+
 	export_error = memnew(Label);
 	main_vb->add_child(export_error);
 	export_error->hide();
@@ -1390,6 +1444,8 @@ ProjectExportDialog::ProjectExportDialog() {
 	export_templates_error->add_child(download_templates);
 	download_templates->connect("pressed", callable_mp(this, &ProjectExportDialog::_open_export_template_manager));
 
+	// Export project file dialog.
+
 	export_project = memnew(EditorFileDialog);
 	export_project->set_access(EditorFileDialog::ACCESS_FILESYSTEM);
 	add_child(export_project);

+ 20 - 0
editor/export/project_export.h

@@ -41,6 +41,7 @@ class EditorFileSystemDirectory;
 class EditorInspector;
 class EditorPropertyPath;
 class ItemList;
+class LinkButton;
 class MenuButton;
 class OptionButton;
 class PopupMenu;
@@ -49,6 +50,23 @@ class TabContainer;
 class Tree;
 class TreeItem;
 
+class ProjectExportTextureFormatError : public HBoxContainer {
+	GDCLASS(ProjectExportTextureFormatError, HBoxContainer);
+
+	Label *texture_format_error_label = nullptr;
+	LinkButton *fix_texture_format_button = nullptr;
+	String setting_identifier;
+	void _on_fix_texture_format_pressed();
+
+protected:
+	static void _bind_methods();
+	void _notification(int p_what);
+
+public:
+	void show_for_texture_format(const String &p_friendly_name, const String &p_setting_identifier);
+	ProjectExportTextureFormatError();
+};
+
 class ProjectExportDialog : public ConfirmationDialog {
 	GDCLASS(ProjectExportDialog, ConfirmationDialog);
 
@@ -86,12 +104,14 @@ private:
 	Button *export_all_button = nullptr;
 	AcceptDialog *export_all_dialog = nullptr;
 
+	RBSet<String> feature_set;
 	LineEdit *custom_features = nullptr;
 	RichTextLabel *custom_feature_display = nullptr;
 
 	LineEdit *script_key = nullptr;
 	Label *script_key_error = nullptr;
 
+	ProjectExportTextureFormatError *export_texture_format_error = nullptr;
 	Label *export_error = nullptr;
 	Label *export_warning = nullptr;
 	HBoxContainer *export_templates_error = nullptr;

+ 2 - 3
platform/android/export/export_plugin.cpp

@@ -47,6 +47,7 @@
 #include "editor/editor_paths.h"
 #include "editor/editor_scale.h"
 #include "editor/editor_settings.h"
+#include "editor/import/resource_importer_texture_settings.h"
 #include "main/splash.gen.h"
 #include "scene/resources/image_texture.h"
 
@@ -2384,10 +2385,8 @@ bool EditorExportPlatformAndroid::has_valid_project_configuration(const Ref<Edit
 		}
 	}
 
-	String etc_error = test_etc2();
-	if (!etc_error.is_empty()) {
+	if (!ResourceImporterTextureSettings::should_import_etc2_astc()) {
 		valid = false;
-		err += etc_error;
 	}
 
 	String min_sdk_str = p_preset->get("gradle_build/min_sdk");

+ 2 - 3
platform/ios/export/export_plugin.cpp

@@ -39,6 +39,7 @@
 #include "editor/editor_paths.h"
 #include "editor/editor_scale.h"
 #include "editor/export/editor_export.h"
+#include "editor/import/resource_importer_texture_settings.h"
 #include "editor/plugins/script_editor_plugin.h"
 
 #include "modules/modules_enabled.gen.h" // For mono and svg.
@@ -1984,10 +1985,8 @@ bool EditorExportPlatformIOS::has_valid_project_configuration(const Ref<EditorEx
 		}
 	}
 
-	const String etc_error = test_etc2();
-	if (!etc_error.is_empty()) {
+	if (!ResourceImporterTextureSettings::should_import_etc2_astc()) {
 		valid = false;
-		err += etc_error;
 	}
 
 	if (!err.is_empty()) {

+ 3 - 6
platform/macos/export/export_plugin.cpp

@@ -41,6 +41,7 @@
 #include "editor/editor_node.h"
 #include "editor/editor_paths.h"
 #include "editor/editor_scale.h"
+#include "editor/import/resource_importer_texture_settings.h"
 #include "scene/resources/image_texture.h"
 
 #include "modules/modules_enabled.gen.h" // For svg and regex.
@@ -2124,16 +2125,12 @@ bool EditorExportPlatformMacOS::has_valid_export_configuration(const Ref<EditorE
 	// Check the texture formats, which vary depending on the target architecture.
 	String architecture = p_preset->get("binary_format/architecture");
 	if (architecture == "universal" || architecture == "x86_64") {
-		const String bc_error = test_bc();
-		if (!bc_error.is_empty()) {
+		if (!ResourceImporterTextureSettings::should_import_s3tc_bptc()) {
 			valid = false;
-			err += bc_error;
 		}
 	} else if (architecture == "arm64") {
-		const String etc_error = test_etc2();
-		if (!etc_error.is_empty()) {
+		if (!ResourceImporterTextureSettings::should_import_etc2_astc()) {
 			valid = false;
-			err += etc_error;
 		}
 	} else {
 		ERR_PRINT("Invalid architecture");

+ 2 - 3
platform/web/export/export_plugin.cpp

@@ -37,6 +37,7 @@
 #include "editor/editor_scale.h"
 #include "editor/editor_settings.h"
 #include "editor/export/editor_export.h"
+#include "editor/import/resource_importer_texture_settings.h"
 #include "scene/resources/image_texture.h"
 
 #include "modules/modules_enabled.gen.h" // For mono and svg.
@@ -406,10 +407,8 @@ bool EditorExportPlatformWeb::has_valid_project_configuration(const Ref<EditorEx
 	// Validate the project configuration.
 
 	if (p_preset->get("vram_texture_compression/for_mobile")) {
-		String etc_error = test_etc2();
-		if (!etc_error.is_empty()) {
+		if (!ResourceImporterTextureSettings::should_import_etc2_astc()) {
 			valid = false;
-			err += etc_error;
 		}
 	}