|
@@ -40,6 +40,7 @@
|
|
|
// Version 2: changed names for Basis, AABB, Vectors, etc.
|
|
|
// Version 3: new string ID for ext/subresources, breaks forward compat.
|
|
|
// Version 4: PackedByteArray is now stored as base64 encoded.
|
|
|
+#define FORMAT_VERSION_COMPAT 3
|
|
|
#define FORMAT_VERSION 4
|
|
|
|
|
|
#define BINARY_FORMAT_VERSION 4
|
|
@@ -845,7 +846,7 @@ void ResourceLoaderText::set_translation_remapped(bool p_remapped) {
|
|
|
}
|
|
|
|
|
|
ResourceLoaderText::ResourceLoaderText() :
|
|
|
- stream(false) {}
|
|
|
+ stream(false), format_version(FORMAT_VERSION) {}
|
|
|
|
|
|
void ResourceLoaderText::get_dependencies(Ref<FileAccess> p_f, List<String> *p_dependencies, bool p_add_types) {
|
|
|
open(p_f);
|
|
@@ -954,13 +955,13 @@ Error ResourceLoaderText::rename_dependencies(Ref<FileAccess> p_f, const String
|
|
|
}
|
|
|
|
|
|
if (is_scene) {
|
|
|
- fw->store_line("[gd_scene load_steps=" + itos(resources_total) + " format=" + itos(FORMAT_VERSION) + uid_text + "]\n");
|
|
|
+ fw->store_line("[gd_scene load_steps=" + itos(resources_total) + " format=" + itos(format_version) + uid_text + "]\n");
|
|
|
} else {
|
|
|
String script_res_text;
|
|
|
if (!script_class.is_empty()) {
|
|
|
script_res_text = "script_class=\"" + script_class + "\" ";
|
|
|
}
|
|
|
- fw->store_line("[gd_resource type=\"" + res_type + "\" " + script_res_text + "load_steps=" + itos(resources_total) + " format=" + itos(FORMAT_VERSION) + uid_text + "]\n");
|
|
|
+ fw->store_line("[gd_resource type=\"" + res_type + "\" " + script_res_text + "load_steps=" + itos(resources_total) + " format=" + itos(format_version) + uid_text + "]\n");
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1063,13 +1064,15 @@ void ResourceLoaderText::open(Ref<FileAccess> p_f, bool p_skip_first_tag) {
|
|
|
}
|
|
|
|
|
|
if (tag.fields.has("format")) {
|
|
|
- int fmt = tag.fields["format"];
|
|
|
- if (fmt > FORMAT_VERSION) {
|
|
|
+ format_version = tag.fields["format"];
|
|
|
+ if (format_version > FORMAT_VERSION) {
|
|
|
error_text = "Saved with newer format version";
|
|
|
_printerr();
|
|
|
error = ERR_FILE_UNRECOGNIZED;
|
|
|
return;
|
|
|
}
|
|
|
+ } else {
|
|
|
+ format_version = FORMAT_VERSION;
|
|
|
}
|
|
|
|
|
|
if (tag.name == "gd_scene") {
|
|
@@ -1970,6 +1973,12 @@ void ResourceFormatSaverTextInstance::_find_resources(const Variant &p_variant,
|
|
|
_find_resources(v);
|
|
|
}
|
|
|
} break;
|
|
|
+ case Variant::PACKED_BYTE_ARRAY: {
|
|
|
+ // Balance between compatibility and performance.
|
|
|
+ if (use_compat && p_variant.operator PackedByteArray().size() > 64) {
|
|
|
+ use_compat = false;
|
|
|
+ }
|
|
|
+ } break;
|
|
|
default: {
|
|
|
}
|
|
|
}
|
|
@@ -2005,6 +2014,7 @@ Error ResourceFormatSaverTextInstance::save(const String &p_path, const Ref<Reso
|
|
|
}
|
|
|
|
|
|
// Save resources.
|
|
|
+ use_compat = true; // _find_resources() changes this.
|
|
|
_find_resources(p_resource, true);
|
|
|
|
|
|
if (packed_scene.is_valid()) {
|
|
@@ -2037,7 +2047,7 @@ Error ResourceFormatSaverTextInstance::save(const String &p_path, const Ref<Reso
|
|
|
if (load_steps > 1) {
|
|
|
title += "load_steps=" + itos(load_steps) + " ";
|
|
|
}
|
|
|
- title += "format=" + itos(FORMAT_VERSION) + "";
|
|
|
+ title += "format=" + itos(use_compat ? FORMAT_VERSION_COMPAT : FORMAT_VERSION) + "";
|
|
|
|
|
|
ResourceUID::ID uid = ResourceSaver::get_resource_id_for_path(local_path, true);
|
|
|
|
|
@@ -2223,7 +2233,7 @@ Error ResourceFormatSaverTextInstance::save(const String &p_path, const Ref<Reso
|
|
|
}
|
|
|
|
|
|
String vars;
|
|
|
- VariantWriter::write_to_string(value, vars, _write_resources, this);
|
|
|
+ VariantWriter::write_to_string(value, vars, _write_resources, this, use_compat);
|
|
|
f->store_string(name.property_name_encode() + " = " + vars + "\n");
|
|
|
}
|
|
|
}
|
|
@@ -2287,14 +2297,14 @@ Error ResourceFormatSaverTextInstance::save(const String &p_path, const Ref<Reso
|
|
|
if (!instance_placeholder.is_empty()) {
|
|
|
String vars;
|
|
|
f->store_string(" instance_placeholder=");
|
|
|
- VariantWriter::write_to_string(instance_placeholder, vars, _write_resources, this);
|
|
|
+ VariantWriter::write_to_string(instance_placeholder, vars, _write_resources, this, use_compat);
|
|
|
f->store_string(vars);
|
|
|
}
|
|
|
|
|
|
if (instance.is_valid()) {
|
|
|
String vars;
|
|
|
f->store_string(" instance=");
|
|
|
- VariantWriter::write_to_string(instance, vars, _write_resources, this);
|
|
|
+ VariantWriter::write_to_string(instance, vars, _write_resources, this, use_compat);
|
|
|
f->store_string(vars);
|
|
|
}
|
|
|
|
|
@@ -2302,7 +2312,7 @@ Error ResourceFormatSaverTextInstance::save(const String &p_path, const Ref<Reso
|
|
|
|
|
|
for (int j = 0; j < state->get_node_property_count(i); j++) {
|
|
|
String vars;
|
|
|
- VariantWriter::write_to_string(state->get_node_property_value(i, j), vars, _write_resources, this);
|
|
|
+ VariantWriter::write_to_string(state->get_node_property_value(i, j), vars, _write_resources, this, use_compat);
|
|
|
|
|
|
f->store_string(String(state->get_node_property_name(i, j)).property_name_encode() + " = " + vars + "\n");
|
|
|
}
|
|
@@ -2336,7 +2346,7 @@ Error ResourceFormatSaverTextInstance::save(const String &p_path, const Ref<Reso
|
|
|
f->store_string(connstr);
|
|
|
if (binds.size()) {
|
|
|
String vars;
|
|
|
- VariantWriter::write_to_string(binds, vars, _write_resources, this);
|
|
|
+ VariantWriter::write_to_string(binds, vars, _write_resources, this, use_compat);
|
|
|
f->store_string(" binds= " + vars);
|
|
|
}
|
|
|
|
|
@@ -2368,14 +2378,14 @@ Error ResourceLoaderText::set_uid(Ref<FileAccess> p_f, ResourceUID::ID p_uid) {
|
|
|
|
|
|
fw = FileAccess::open(local_path + ".uidren", FileAccess::WRITE);
|
|
|
if (is_scene) {
|
|
|
- fw->store_string("[gd_scene load_steps=" + itos(resources_total) + " format=" + itos(FORMAT_VERSION) + " uid=\"" + ResourceUID::get_singleton()->id_to_text(p_uid) + "\"]");
|
|
|
+ fw->store_string("[gd_scene load_steps=" + itos(resources_total) + " format=" + itos(format_version) + " uid=\"" + ResourceUID::get_singleton()->id_to_text(p_uid) + "\"]");
|
|
|
} else {
|
|
|
String script_res_text;
|
|
|
if (!script_class.is_empty()) {
|
|
|
script_res_text = "script_class=\"" + script_class + "\" ";
|
|
|
}
|
|
|
|
|
|
- fw->store_string("[gd_resource type=\"" + res_type + "\" " + script_res_text + "load_steps=" + itos(resources_total) + " format=" + itos(FORMAT_VERSION) + " uid=\"" + ResourceUID::get_singleton()->id_to_text(p_uid) + "\"]");
|
|
|
+ fw->store_string("[gd_resource type=\"" + res_type + "\" " + script_res_text + "load_steps=" + itos(resources_total) + " format=" + itos(format_version) + " uid=\"" + ResourceUID::get_singleton()->id_to_text(p_uid) + "\"]");
|
|
|
}
|
|
|
|
|
|
uint8_t c = f->get_8();
|