mirror of
				https://github.com/godotengine/godot.git
				synced 2025-11-03 23:21:15 +00:00 
			
		
		
		
	Merge pull request #68324 from AThousandShips/group_import_uid
Fix group reimport bug
This commit is contained in:
		
						commit
						f3e6750a7e
					
				
					 1 changed files with 48 additions and 9 deletions
				
			
		| 
						 | 
					@ -1642,6 +1642,7 @@ Error EditorFileSystem::_reimport_group(const String &p_group_file, const Vector
 | 
				
			||||||
	String importer_name;
 | 
						String importer_name;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	HashMap<String, HashMap<StringName, Variant>> source_file_options;
 | 
						HashMap<String, HashMap<StringName, Variant>> source_file_options;
 | 
				
			||||||
 | 
						HashMap<String, ResourceUID::ID> uids;
 | 
				
			||||||
	HashMap<String, String> base_paths;
 | 
						HashMap<String, String> base_paths;
 | 
				
			||||||
	for (int i = 0; i < p_files.size(); i++) {
 | 
						for (int i = 0; i < p_files.size(); i++) {
 | 
				
			||||||
		Ref<ConfigFile> config;
 | 
							Ref<ConfigFile> config;
 | 
				
			||||||
| 
						 | 
					@ -1657,6 +1658,15 @@ Error EditorFileSystem::_reimport_group(const String &p_group_file, const Vector
 | 
				
			||||||
			ERR_FAIL_V(ERR_FILE_CORRUPT);
 | 
								ERR_FAIL_V(ERR_FILE_CORRUPT);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							ResourceUID::ID uid = ResourceUID::INVALID_ID;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (config->has_section_key("remap", "uid")) {
 | 
				
			||||||
 | 
								String uidt = config->get_value("remap", "uid");
 | 
				
			||||||
 | 
								uid = ResourceUID::get_singleton()->text_to_id(uidt);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							uids[p_files[i]] = uid;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		source_file_options[p_files[i]] = HashMap<StringName, Variant>();
 | 
							source_file_options[p_files[i]] = HashMap<StringName, Variant>();
 | 
				
			||||||
		importer_name = file_importer_name;
 | 
							importer_name = file_importer_name;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1701,6 +1711,7 @@ Error EditorFileSystem::_reimport_group(const String &p_group_file, const Vector
 | 
				
			||||||
		const String &file = E.key;
 | 
							const String &file = E.key;
 | 
				
			||||||
		String base_path = ResourceFormatImporter::get_singleton()->get_import_base_path(file);
 | 
							String base_path = ResourceFormatImporter::get_singleton()->get_import_base_path(file);
 | 
				
			||||||
		Vector<String> dest_paths;
 | 
							Vector<String> dest_paths;
 | 
				
			||||||
 | 
							ResourceUID::ID uid = uids[file];
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			Ref<FileAccess> f = FileAccess::open(file + ".import", FileAccess::WRITE);
 | 
								Ref<FileAccess> f = FileAccess::open(file + ".import", FileAccess::WRITE);
 | 
				
			||||||
			ERR_FAIL_COND_V_MSG(f.is_null(), ERR_FILE_CANT_OPEN, "Cannot open import file '" + file + ".import'.");
 | 
								ERR_FAIL_COND_V_MSG(f.is_null(), ERR_FILE_CANT_OPEN, "Cannot open import file '" + file + ".import'.");
 | 
				
			||||||
| 
						 | 
					@ -1717,6 +1728,12 @@ Error EditorFileSystem::_reimport_group(const String &p_group_file, const Vector
 | 
				
			||||||
				f->store_line("type=\"" + importer->get_resource_type() + "\"");
 | 
									f->store_line("type=\"" + importer->get_resource_type() + "\"");
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (uid == ResourceUID::INVALID_ID) {
 | 
				
			||||||
 | 
									uid = ResourceUID::get_singleton()->create_id();
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								f->store_line("uid=\"" + ResourceUID::get_singleton()->id_to_text(uid) + "\""); // Store in readable format.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (err == OK) {
 | 
								if (err == OK) {
 | 
				
			||||||
				String path = base_path + "." + importer->get_save_extension();
 | 
									String path = base_path + "." + importer->get_save_extension();
 | 
				
			||||||
				f->store_line("path=\"" + path + "\"");
 | 
									f->store_line("path=\"" + path + "\"");
 | 
				
			||||||
| 
						 | 
					@ -1782,12 +1799,19 @@ Error EditorFileSystem::_reimport_group(const String &p_group_file, const Vector
 | 
				
			||||||
		fs->files[cpos]->modified_time = FileAccess::get_modified_time(file);
 | 
							fs->files[cpos]->modified_time = FileAccess::get_modified_time(file);
 | 
				
			||||||
		fs->files[cpos]->import_modified_time = FileAccess::get_modified_time(file + ".import");
 | 
							fs->files[cpos]->import_modified_time = FileAccess::get_modified_time(file + ".import");
 | 
				
			||||||
		fs->files[cpos]->deps = _get_dependencies(file);
 | 
							fs->files[cpos]->deps = _get_dependencies(file);
 | 
				
			||||||
 | 
							fs->files[cpos]->uid = uid;
 | 
				
			||||||
		fs->files[cpos]->type = importer->get_resource_type();
 | 
							fs->files[cpos]->type = importer->get_resource_type();
 | 
				
			||||||
		if (fs->files[cpos]->type == "" && textfile_extensions.has(file.get_extension())) {
 | 
							if (fs->files[cpos]->type == "" && textfile_extensions.has(file.get_extension())) {
 | 
				
			||||||
			fs->files[cpos]->type = "TextFile";
 | 
								fs->files[cpos]->type = "TextFile";
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		fs->files[cpos]->import_valid = err == OK;
 | 
							fs->files[cpos]->import_valid = err == OK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (ResourceUID::get_singleton()->has_id(uid)) {
 | 
				
			||||||
 | 
								ResourceUID::get_singleton()->set_id(uid, file);
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								ResourceUID::get_singleton()->add_id(uid, file);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		//if file is currently up, maybe the source it was loaded from changed, so import math must be updated for it
 | 
							//if file is currently up, maybe the source it was loaded from changed, so import math must be updated for it
 | 
				
			||||||
		//to reload properly
 | 
							//to reload properly
 | 
				
			||||||
		Ref<Resource> r = ResourceCache::get_ref(file);
 | 
							Ref<Resource> r = ResourceCache::get_ref(file);
 | 
				
			||||||
| 
						 | 
					@ -2074,6 +2098,8 @@ void EditorFileSystem::reimport_files(const Vector<String> &p_files) {
 | 
				
			||||||
	importing = true;
 | 
						importing = true;
 | 
				
			||||||
	EditorProgress pr("reimport", TTR("(Re)Importing Assets"), p_files.size());
 | 
						EditorProgress pr("reimport", TTR("(Re)Importing Assets"), p_files.size());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Vector<String> reloads;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Vector<ImportFile> reimport_files;
 | 
						Vector<ImportFile> reimport_files;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	HashSet<String> groups_to_reimport;
 | 
						HashSet<String> groups_to_reimport;
 | 
				
			||||||
| 
						 | 
					@ -2089,22 +2115,26 @@ void EditorFileSystem::reimport_files(const Vector<String> &p_files) {
 | 
				
			||||||
		String group_file = ResourceFormatImporter::get_singleton()->get_import_group_file(file);
 | 
							String group_file = ResourceFormatImporter::get_singleton()->get_import_group_file(file);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (group_file_cache.has(file)) {
 | 
							if (group_file_cache.has(file)) {
 | 
				
			||||||
			//maybe the file itself is a group!
 | 
								// Maybe the file itself is a group!
 | 
				
			||||||
			groups_to_reimport.insert(file);
 | 
								groups_to_reimport.insert(file);
 | 
				
			||||||
			//groups do not belong to groups
 | 
								// Groups do not belong to groups.
 | 
				
			||||||
 | 
								group_file = String();
 | 
				
			||||||
 | 
							} else if (groups_to_reimport.has(file)) {
 | 
				
			||||||
 | 
								// Groups do not belong to groups.
 | 
				
			||||||
			group_file = String();
 | 
								group_file = String();
 | 
				
			||||||
		} else if (!group_file.is_empty()) {
 | 
							} else if (!group_file.is_empty()) {
 | 
				
			||||||
			//it's a group file, add group to import and skip this file
 | 
								// It's a group file, add group to import and skip this file.
 | 
				
			||||||
			groups_to_reimport.insert(group_file);
 | 
								groups_to_reimport.insert(group_file);
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			//it's a regular file
 | 
								// It's a regular file.
 | 
				
			||||||
			ImportFile ifile;
 | 
								ImportFile ifile;
 | 
				
			||||||
			ifile.path = file;
 | 
								ifile.path = file;
 | 
				
			||||||
			ResourceFormatImporter::get_singleton()->get_import_order_threads_and_importer(file, ifile.order, ifile.threaded, ifile.importer);
 | 
								ResourceFormatImporter::get_singleton()->get_import_order_threads_and_importer(file, ifile.order, ifile.threaded, ifile.importer);
 | 
				
			||||||
 | 
								reloads.push_back(file);
 | 
				
			||||||
			reimport_files.push_back(ifile);
 | 
								reimport_files.push_back(ifile);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		//group may have changed, so also update group reference
 | 
							// Group may have changed, so also update group reference.
 | 
				
			||||||
		EditorFileSystemDirectory *fs = nullptr;
 | 
							EditorFileSystemDirectory *fs = nullptr;
 | 
				
			||||||
		int cpos = -1;
 | 
							int cpos = -1;
 | 
				
			||||||
		if (_find_file(file, &fs, cpos)) {
 | 
							if (_find_file(file, &fs, cpos)) {
 | 
				
			||||||
| 
						 | 
					@ -2118,10 +2148,14 @@ void EditorFileSystem::reimport_files(const Vector<String> &p_files) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	int from = 0;
 | 
						int from = 0;
 | 
				
			||||||
	for (int i = 0; i < reimport_files.size(); i++) {
 | 
						for (int i = 0; i < reimport_files.size(); i++) {
 | 
				
			||||||
 | 
							if (groups_to_reimport.has(reimport_files[i].path)) {
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (use_multiple_threads && reimport_files[i].threaded) {
 | 
							if (use_multiple_threads && reimport_files[i].threaded) {
 | 
				
			||||||
			if (i + 1 == reimport_files.size() || reimport_files[i + 1].importer != reimport_files[from].importer) {
 | 
								if (i + 1 == reimport_files.size() || reimport_files[i + 1].importer != reimport_files[from].importer) {
 | 
				
			||||||
				if (from - i == 0) {
 | 
									if (from - i == 0) {
 | 
				
			||||||
					//single file, do not use threads
 | 
										// Single file, do not use threads.
 | 
				
			||||||
					pr.step(reimport_files[i].path.get_file(), i);
 | 
										pr.step(reimport_files[i].path.get_file(), i);
 | 
				
			||||||
					_reimport_file(reimport_files[i].path);
 | 
										_reimport_file(reimport_files[i].path);
 | 
				
			||||||
				} else {
 | 
									} else {
 | 
				
			||||||
| 
						 | 
					@ -2159,20 +2193,25 @@ void EditorFileSystem::reimport_files(const Vector<String> &p_files) {
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	//reimport groups
 | 
						// Reimport groups.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						from = reimport_files.size();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (groups_to_reimport.size()) {
 | 
						if (groups_to_reimport.size()) {
 | 
				
			||||||
		HashMap<String, Vector<String>> group_files;
 | 
							HashMap<String, Vector<String>> group_files;
 | 
				
			||||||
		_find_group_files(filesystem, group_files, groups_to_reimport);
 | 
							_find_group_files(filesystem, group_files, groups_to_reimport);
 | 
				
			||||||
		for (const KeyValue<String, Vector<String>> &E : group_files) {
 | 
							for (const KeyValue<String, Vector<String>> &E : group_files) {
 | 
				
			||||||
 | 
								pr.step(E.key.get_file(), from++);
 | 
				
			||||||
			Error err = _reimport_group(E.key, E.value);
 | 
								Error err = _reimport_group(E.key, E.value);
 | 
				
			||||||
 | 
								reloads.push_back(E.key);
 | 
				
			||||||
 | 
								reloads.append_array(E.value);
 | 
				
			||||||
			if (err == OK) {
 | 
								if (err == OK) {
 | 
				
			||||||
				_reimport_file(E.key);
 | 
									_reimport_file(E.key);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ResourceUID::get_singleton()->update_cache(); //after reimporting, update the cache
 | 
						ResourceUID::get_singleton()->update_cache(); // After reimporting, update the cache.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	_save_filesystem_cache();
 | 
						_save_filesystem_cache();
 | 
				
			||||||
	importing = false;
 | 
						importing = false;
 | 
				
			||||||
| 
						 | 
					@ -2180,7 +2219,7 @@ void EditorFileSystem::reimport_files(const Vector<String> &p_files) {
 | 
				
			||||||
		emit_signal(SNAME("filesystem_changed"));
 | 
							emit_signal(SNAME("filesystem_changed"));
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	emit_signal(SNAME("resources_reimported"), p_files);
 | 
						emit_signal(SNAME("resources_reimported"), reloads);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Error EditorFileSystem::_resource_import(const String &p_path) {
 | 
					Error EditorFileSystem::_resource_import(const String &p_path) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue