Browse Source

Use a different strategy for path remaps, try loading from a remap file instead.
This ensures multiple PCK exports still work.

Juan Linietsky 7 years ago
parent
commit
b3a1bf3245
2 changed files with 62 additions and 1 deletions
  1. 44 0
      core/io/resource_loader.cpp
  2. 18 1
      editor/editor_export.cpp

+ 44 - 0
core/io/resource_loader.cpp

@@ -35,6 +35,7 @@
 #include "print_string.h"
 #include "project_settings.h"
 #include "translation.h"
+#include "variant_parser.h"
 ResourceFormatLoader *ResourceLoader::loader[MAX_LOADERS];
 
 int ResourceLoader::loader_count = 0;
@@ -454,6 +455,49 @@ String ResourceLoader::_path_remap(const String &p_path, bool *r_translation_rem
 	if (path_remaps.has(new_path)) {
 		new_path = path_remaps[new_path];
 	}
+
+	if (new_path == p_path) { //did not remap
+		//try file remap
+		Error err;
+		FileAccess *f = FileAccess::open(p_path + ".remap", FileAccess::READ, &err);
+
+		if (f) {
+
+			VariantParser::StreamFile stream;
+			stream.f = f;
+
+			String assign;
+			Variant value;
+			VariantParser::Tag next_tag;
+
+			int lines = 0;
+			String error_text;
+			while (true) {
+
+				assign = Variant();
+				next_tag.fields.clear();
+				next_tag.name = String();
+
+				err = VariantParser::parse_tag_assign_eof(&stream, lines, error_text, next_tag, assign, value, NULL, true);
+				if (err == ERR_FILE_EOF) {
+					break;
+				} else if (err != OK) {
+					ERR_PRINTS("Parse error: " + p_path + ".remap:" + itos(lines) + " error: " + error_text);
+					break;
+				}
+
+				if (assign == "path") {
+					new_path = value;
+					break;
+				} else if (next_tag.name != "remap") {
+					break;
+				}
+			}
+
+			memdelete(f);
+		}
+	}
+
 	return new_path;
 }
 

+ 18 - 1
editor/editor_export.cpp

@@ -740,7 +740,24 @@ Error EditorExportPlatform::export_project_files(const Ref<EditorExportPreset> &
 
 	ProjectSettings::CustomMap custom_map;
 	if (path_remaps.size()) {
-		custom_map["path_remap/remapped_paths"] = path_remaps;
+		if (1) { //new remap mode, use always as it's friendlier with multiple .pck exports
+			for (int i = 0; i < path_remaps.size(); i += 2) {
+				String from = path_remaps[i];
+				String to = path_remaps[i + 1];
+				String remap_file = "[remap]\n\npath=\"" + to.c_escape() + "\"\n";
+				CharString utf8 = remap_file.utf8();
+				Vector<uint8_t> new_file;
+				new_file.resize(utf8.length());
+				for (int j = 0; j < utf8.length(); j++) {
+					new_file[j] = utf8[j];
+				}
+
+				p_func(p_udata, from + ".remap", new_file, idx, total);
+			}
+		} else {
+			//old remap mode, will still work, but it's unused because it's not multiple pck export friendly
+			custom_map["path_remap/remapped_paths"] = path_remaps;
+		}
 	}
 
 	// Store icon and splash images directly, they need to bypass the import system and be loaded as images