diff options
Diffstat (limited to 'core/io')
-rw-r--r-- | core/io/dir_access.cpp | 14 | ||||
-rw-r--r-- | core/io/dir_access.h | 2 | ||||
-rw-r--r-- | core/io/file_access_compressed.cpp | 18 | ||||
-rw-r--r-- | core/io/logger.cpp | 10 | ||||
-rw-r--r-- | core/io/marshalls.cpp | 41 | ||||
-rw-r--r-- | core/io/marshalls.h | 2 | ||||
-rw-r--r-- | core/io/pck_packer.cpp | 5 | ||||
-rw-r--r-- | core/io/resource.cpp | 20 | ||||
-rw-r--r-- | core/io/resource_format_binary.cpp | 42 | ||||
-rw-r--r-- | core/io/resource_format_binary.h | 2 | ||||
-rw-r--r-- | core/io/resource_loader.cpp | 24 | ||||
-rw-r--r-- | core/io/resource_saver.h | 3 | ||||
-rw-r--r-- | core/io/resource_uid.cpp | 23 | ||||
-rw-r--r-- | core/io/resource_uid.h | 5 |
14 files changed, 105 insertions, 106 deletions
diff --git a/core/io/dir_access.cpp b/core/io/dir_access.cpp index 86d8dea3d9..73efdeb38e 100644 --- a/core/io/dir_access.cpp +++ b/core/io/dir_access.cpp @@ -250,6 +250,14 @@ DirAccess *DirAccess::create(AccessType p_access) { DirAccess *da = create_func[p_access] ? create_func[p_access]() : nullptr; if (da) { da->_access_type = p_access; + + // for ACCESS_RESOURCES and ACCESS_FILESYSTEM, current_dir already defaults to where game was started + // in case current directory is force changed elsewhere for ACCESS_RESOURCES + if (p_access == ACCESS_RESOURCES) { + da->change_dir("res://"); + } else if (p_access == ACCESS_USERDATA) { + da->change_dir("user://"); + } } return da; @@ -414,8 +422,6 @@ Error DirAccess::copy_dir(String p_from, String p_to, int p_chmod_flags, bool p_ } bool DirAccess::exists(String p_dir) { - DirAccess *da = DirAccess::create_for_path(p_dir); - bool valid = da->change_dir(p_dir) == OK; - memdelete(da); - return valid; + DirAccessRef da = DirAccess::create_for_path(p_dir); + return da->change_dir(p_dir) == OK; } diff --git a/core/io/dir_access.h b/core/io/dir_access.h index 8154f5366c..d63453e947 100644 --- a/core/io/dir_access.h +++ b/core/io/dir_access.h @@ -134,7 +134,7 @@ struct DirAccessRef { operator bool() const { return f != nullptr; } - DirAccess *f; + DirAccess *f = nullptr; DirAccessRef(DirAccess *fa) { f = fa; } ~DirAccessRef() { diff --git a/core/io/file_access_compressed.cpp b/core/io/file_access_compressed.cpp index 526952b14f..85faf04315 100644 --- a/core/io/file_access_compressed.cpp +++ b/core/io/file_access_compressed.cpp @@ -88,11 +88,11 @@ Error FileAccessCompressed::open_after_magic(FileAccess *p_base) { read_block_count = bc; read_block_size = read_blocks.size() == 1 ? read_total : block_size; - Compression::decompress(buffer.ptrw(), read_block_size, comp_buffer.ptr(), read_blocks[0].csize, cmode); + int ret = Compression::decompress(buffer.ptrw(), read_block_size, comp_buffer.ptr(), read_blocks[0].csize, cmode); read_block = 0; read_pos = 0; - return OK; + return ret == -1 ? ERR_FILE_CORRUPT : OK; } Error FileAccessCompressed::_open(const String &p_path, int p_mode_flags) { @@ -125,10 +125,11 @@ Error FileAccessCompressed::_open(const String &p_path, int p_mode_flags) { char rmagic[5]; f->get_buffer((uint8_t *)rmagic, 4); rmagic[4] = 0; - if (magic != rmagic || open_after_magic(f) != OK) { + err = ERR_FILE_UNRECOGNIZED; + if (magic != rmagic || (err = open_after_magic(f)) != OK) { memdelete(f); f = nullptr; - return ERR_FILE_UNRECOGNIZED; + return err; } } @@ -210,7 +211,8 @@ void FileAccessCompressed::seek(uint64_t p_position) { read_block = block_idx; f->seek(read_blocks[read_block].offset); f->get_buffer(comp_buffer.ptrw(), read_blocks[read_block].csize); - Compression::decompress(buffer.ptrw(), read_blocks.size() == 1 ? read_total : block_size, comp_buffer.ptr(), read_blocks[read_block].csize, cmode); + int ret = Compression::decompress(buffer.ptrw(), read_blocks.size() == 1 ? read_total : block_size, comp_buffer.ptr(), read_blocks[read_block].csize, cmode); + ERR_FAIL_COND_MSG(ret == -1, "Compressed file is corrupt."); read_block_size = read_block == read_block_count - 1 ? read_total % block_size : block_size; } @@ -273,7 +275,8 @@ uint8_t FileAccessCompressed::get_8() const { if (read_block < read_block_count) { //read another block of compressed data f->get_buffer(comp_buffer.ptrw(), read_blocks[read_block].csize); - Compression::decompress(buffer.ptrw(), read_blocks.size() == 1 ? read_total : block_size, comp_buffer.ptr(), read_blocks[read_block].csize, cmode); + int total = Compression::decompress(buffer.ptrw(), read_blocks.size() == 1 ? read_total : block_size, comp_buffer.ptr(), read_blocks[read_block].csize, cmode); + ERR_FAIL_COND_V_MSG(total == -1, 0, "Compressed file is corrupt."); read_block_size = read_block == read_block_count - 1 ? read_total % block_size : block_size; read_pos = 0; @@ -305,7 +308,8 @@ uint64_t FileAccessCompressed::get_buffer(uint8_t *p_dst, uint64_t p_length) con if (read_block < read_block_count) { //read another block of compressed data f->get_buffer(comp_buffer.ptrw(), read_blocks[read_block].csize); - Compression::decompress(buffer.ptrw(), read_blocks.size() == 1 ? read_total : block_size, comp_buffer.ptr(), read_blocks[read_block].csize, cmode); + int ret = Compression::decompress(buffer.ptrw(), read_blocks.size() == 1 ? read_total : block_size, comp_buffer.ptr(), read_blocks[read_block].csize, cmode); + ERR_FAIL_COND_V_MSG(ret == -1, -1, "Compressed file is corrupt."); read_block_size = read_block == read_block_count - 1 ? read_total % block_size : block_size; read_pos = 0; diff --git a/core/io/logger.cpp b/core/io/logger.cpp index cb6369ae3d..2b6f230434 100644 --- a/core/io/logger.cpp +++ b/core/io/logger.cpp @@ -128,7 +128,7 @@ void RotatedFileLogger::clear_old_backups() { String basename = base_path.get_file().get_basename(); String extension = base_path.get_extension(); - DirAccess *da = DirAccess::open(base_path.get_base_dir()); + DirAccessRef da = DirAccess::open(base_path.get_base_dir()); if (!da) { return; } @@ -152,8 +152,6 @@ void RotatedFileLogger::clear_old_backups() { da->remove(E->get()); } } - - memdelete(da); } void RotatedFileLogger::rotate_file() { @@ -167,18 +165,16 @@ void RotatedFileLogger::rotate_file() { backup_name += "." + base_path.get_extension(); } - DirAccess *da = DirAccess::open(base_path.get_base_dir()); + DirAccessRef da = DirAccess::open(base_path.get_base_dir()); if (da) { da->copy(base_path, backup_name); - memdelete(da); } clear_old_backups(); } } else { - DirAccess *da = DirAccess::create(DirAccess::ACCESS_USERDATA); + DirAccessRef da = DirAccess::create(DirAccess::ACCESS_USERDATA); if (da) { da->make_dir_recursive(base_path.get_base_dir()); - memdelete(da); } } diff --git a/core/io/marshalls.cpp b/core/io/marshalls.cpp index 555d4f6df4..d0bc05566e 100644 --- a/core/io/marshalls.cpp +++ b/core/io/marshalls.cpp @@ -94,7 +94,8 @@ static Error _decode_string(const uint8_t *&buf, int &len, int *r_len, String &r return OK; } -Error decode_variant(Variant &r_variant, const uint8_t *p_buffer, int p_len, int *r_len, bool p_allow_objects) { +Error decode_variant(Variant &r_variant, const uint8_t *p_buffer, int p_len, int *r_len, bool p_allow_objects, int p_depth) { + ERR_FAIL_COND_V_MSG(p_depth > Variant::MAX_RECURSION_DEPTH, ERR_OUT_OF_MEMORY, "Variant is too deep. Bailing."); const uint8_t *buf = p_buffer; int len = p_len; @@ -585,7 +586,7 @@ Error decode_variant(Variant &r_variant, const uint8_t *p_buffer, int p_len, int Variant value; int used; - err = decode_variant(value, buf, len, &used, p_allow_objects); + err = decode_variant(value, buf, len, &used, p_allow_objects, p_depth + 1); if (err) { return err; } @@ -635,7 +636,7 @@ Error decode_variant(Variant &r_variant, const uint8_t *p_buffer, int p_len, int Variant key, value; int used; - Error err = decode_variant(key, buf, len, &used, p_allow_objects); + Error err = decode_variant(key, buf, len, &used, p_allow_objects, p_depth + 1); ERR_FAIL_COND_V_MSG(err != OK, err, "Error when trying to decode Variant."); buf += used; @@ -644,7 +645,7 @@ Error decode_variant(Variant &r_variant, const uint8_t *p_buffer, int p_len, int (*r_len) += used; } - err = decode_variant(value, buf, len, &used, p_allow_objects); + err = decode_variant(value, buf, len, &used, p_allow_objects, p_depth + 1); ERR_FAIL_COND_V_MSG(err != OK, err, "Error when trying to decode Variant."); buf += used; @@ -677,7 +678,7 @@ Error decode_variant(Variant &r_variant, const uint8_t *p_buffer, int p_len, int for (int i = 0; i < count; i++) { int used = 0; Variant v; - Error err = decode_variant(v, buf, len, &used, p_allow_objects); + Error err = decode_variant(v, buf, len, &used, p_allow_objects, p_depth + 1); ERR_FAIL_COND_V_MSG(err != OK, err, "Error when trying to decode Variant."); buf += used; len -= used; @@ -1030,7 +1031,7 @@ static void _encode_string(const String &p_string, uint8_t *&buf, int &r_len) { } Error encode_variant(const Variant &p_variant, uint8_t *r_buffer, int &r_len, bool p_full_objects, int p_depth) { - ERR_FAIL_COND_V_MSG(p_depth > Variant::MAX_RECURSION_DEPTH, ERR_OUT_OF_MEMORY, "Potential inifite recursion detected. Bailing."); + ERR_FAIL_COND_V_MSG(p_depth > Variant::MAX_RECURSION_DEPTH, ERR_OUT_OF_MEMORY, "Potential infinite recursion detected. Bailing."); uint8_t *buf = r_buffer; r_len = 0; @@ -1067,6 +1068,21 @@ Error encode_variant(const Variant &p_variant, uint8_t *r_buffer, int &r_len, bo flags |= ENCODE_FLAG_OBJECT_AS_ID; } } break; +#ifdef REAL_T_IS_DOUBLE + case Variant::VECTOR2: + case Variant::VECTOR3: + case Variant::PACKED_VECTOR2_ARRAY: + case Variant::PACKED_VECTOR3_ARRAY: + case Variant::TRANSFORM2D: + case Variant::TRANSFORM3D: + case Variant::QUATERNION: + case Variant::PLANE: + case Variant::BASIS: + case Variant::RECT2: + case Variant::AABB: { + flags |= ENCODE_FLAG_64; + } break; +#endif // REAL_T_IS_DOUBLE default: { } // nothing to do at this stage } @@ -1416,19 +1432,6 @@ Error encode_variant(const Variant &p_variant, uint8_t *r_buffer, int &r_len, bo d.get_key_list(&keys); for (const Variant &E : keys) { - /* - CharString utf8 = E->->utf8(); - - if (buf) { - encode_uint32(utf8.length()+1,buf); - buf+=4; - memcpy(buf,utf8.get_data(),utf8.length()+1); - } - - r_len+=4+utf8.length()+1; - while (r_len%4) - r_len++; //pad - */ int len; Error err = encode_variant(E, buf, len, p_full_objects, p_depth + 1); ERR_FAIL_COND_V(err, err); diff --git a/core/io/marshalls.h b/core/io/marshalls.h index 4d7b98b749..fef3a1c2c1 100644 --- a/core/io/marshalls.h +++ b/core/io/marshalls.h @@ -212,7 +212,7 @@ public: EncodedObjectAsID() {} }; -Error decode_variant(Variant &r_variant, const uint8_t *p_buffer, int p_len, int *r_len = nullptr, bool p_allow_objects = false); +Error decode_variant(Variant &r_variant, const uint8_t *p_buffer, int p_len, int *r_len = nullptr, bool p_allow_objects = false, int p_depth = 0); Error encode_variant(const Variant &p_variant, uint8_t *r_buffer, int &r_len, bool p_full_objects = false, int p_depth = 0); #endif // MARSHALLS_H diff --git a/core/io/pck_packer.cpp b/core/io/pck_packer.cpp index 272ace3438..b3bf0cff2d 100644 --- a/core/io/pck_packer.cpp +++ b/core/io/pck_packer.cpp @@ -257,10 +257,7 @@ Error PCKPacker::flush(bool p_verbose) { count += 1; const int file_num = files.size(); if (p_verbose && (file_num > 0)) { - if (count % 100 == 0) { - printf("%i/%i (%.2f)\r", count, file_num, float(count) / file_num * 100); - fflush(stdout); - } + print_line(vformat("[%d/%d - %d%%] PCKPacker flush: %s -> %s", count, file_num, float(count) / file_num * 100, files[i].src_path, files[i].path)); } } diff --git a/core/io/resource.cpp b/core/io/resource.cpp index 66d5c54b53..f90a6e9304 100644 --- a/core/io/resource.cpp +++ b/core/io/resource.cpp @@ -290,6 +290,21 @@ void Resource::_take_over_path(const String &p_path) { } RID Resource::get_rid() const { + if (get_script_instance()) { + Callable::CallError ce; + RID ret = get_script_instance()->callp(SNAME("_get_rid"), nullptr, 0, ce); + if (ce.error == Callable::CallError::CALL_OK && ret.is_valid()) { + return ret; + } + } + if (_get_extension() && _get_extension()->get_rid) { + RID ret; + ret.from_uint64(_get_extension()->get_rid(_get_extension_instance())); + if (ret.is_valid()) { + return ret; + } + } + return RID(); } @@ -428,6 +443,11 @@ void Resource::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::BOOL, "resource_local_to_scene"), "set_local_to_scene", "is_local_to_scene"); ADD_PROPERTY(PropertyInfo(Variant::STRING, "resource_path", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR), "set_path", "get_path"); ADD_PROPERTY(PropertyInfo(Variant::STRING_NAME, "resource_name"), "set_name", "get_name"); + + MethodInfo get_rid_bind("_get_rid"); + get_rid_bind.return_val.type = Variant::RID; + + ::ClassDB::add_virtual_method(get_class_static(), get_rid_bind, true, Vector<String>(), true); } Resource::Resource() : diff --git a/core/io/resource_format_binary.cpp b/core/io/resource_format_binary.cpp index 8588bab0be..b65993e3dd 100644 --- a/core/io/resource_format_binary.cpp +++ b/core/io/resource_format_binary.cpp @@ -678,11 +678,13 @@ Error ResourceLoaderBinary::load() { internal_resources.write[i].path = path; // Update path. } - if (cache_mode == ResourceFormatLoader::CACHE_MODE_REUSE) { - if (ResourceCache::has(path)) { + if (cache_mode == ResourceFormatLoader::CACHE_MODE_REUSE && ResourceCache::has(path)) { + RES cached = ResourceCache::get(path); + if (cached.is_valid()) { //already loaded, don't do anything stage++; error = OK; + internal_index_cache[path] = cached; continue; } } @@ -899,6 +901,7 @@ void ResourceLoaderBinary::open(FileAccess *p_f, bool p_no_resources, bool p_kee if (flags & ResourceFormatSaverBinaryInstance::FORMAT_FLAG_UIDS) { using_uids = true; } + f->real_is_double = (flags & ResourceFormatSaverBinaryInstance::FORMAT_FLAG_REAL_T_IS_DOUBLE) != 0; if (using_uids) { uid = f->get_64(); @@ -1029,7 +1032,6 @@ RES ResourceFormatLoaderBinary::load(const String &p_path, const String &p_origi String path = !p_original_path.is_empty() ? p_original_path : p_path; loader.local_path = ProjectSettings::get_singleton()->localize_path(path); loader.res_path = loader.local_path; - //loader.set_local_path( Globals::get_singleton()->localize_path(p_path) ); loader.open(f); err = loader.load(); @@ -1083,17 +1085,14 @@ void ResourceFormatLoaderBinary::get_dependencies(const String &p_path, List<Str ResourceLoaderBinary loader; loader.local_path = ProjectSettings::get_singleton()->localize_path(p_path); loader.res_path = loader.local_path; - //loader.set_local_path( Globals::get_singleton()->localize_path(p_path) ); loader.get_dependencies(f, p_dependencies, p_add_types); } Error ResourceFormatLoaderBinary::rename_dependencies(const String &p_path, const Map<String, String> &p_map) { - //Error error=OK; - FileAccess *f = FileAccess::open(p_path, FileAccess::READ); ERR_FAIL_COND_V_MSG(!f, ERR_CANT_OPEN, "Cannot open file '" + p_path + "'."); - FileAccess *fw = nullptr; //=FileAccess::open(p_path+".depren"); + FileAccess *fw = nullptr; String local_path = p_path.get_base_dir(); @@ -1155,10 +1154,12 @@ Error ResourceFormatLoaderBinary::rename_dependencies(const String &p_path, cons if (ver_format < FORMAT_VERSION_CAN_RENAME_DEPS) { memdelete(f); memdelete(fw); - DirAccess *da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM); - da->remove(p_path + ".depren"); - memdelete(da); - //use the old approach + { + DirAccessRef da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM); + da->remove(p_path + ".depren"); + } + + // Use the old approach. WARN_PRINT("This file is old, so it can't refactor dependencies, opening and resaving '" + p_path + "'."); @@ -1171,7 +1172,6 @@ Error ResourceFormatLoaderBinary::rename_dependencies(const String &p_path, cons loader.local_path = ProjectSettings::get_singleton()->localize_path(p_path); loader.res_path = loader.local_path; loader.remaps = p_map; - //loader.set_local_path( Globals::get_singleton()->localize_path(p_path) ); loader.open(f); err = loader.load(); @@ -1301,10 +1301,9 @@ Error ResourceFormatLoaderBinary::rename_dependencies(const String &p_path, cons return ERR_CANT_CREATE; } - DirAccess *da = DirAccess::create(DirAccess::ACCESS_RESOURCES); + DirAccessRef da = DirAccess::create(DirAccess::ACCESS_RESOURCES); da->remove(p_path); da->rename(p_path + ".depren", p_path); - memdelete(da); return OK; } @@ -1317,7 +1316,6 @@ String ResourceFormatLoaderBinary::get_resource_type(const String &p_path) const ResourceLoaderBinary loader; loader.local_path = ProjectSettings::get_singleton()->localize_path(p_path); loader.res_path = loader.local_path; - //loader.set_local_path( Globals::get_singleton()->localize_path(p_path) ); String r = loader.recognize(f); return ClassDB::get_compatibility_remapped_class(r); } @@ -1336,7 +1334,6 @@ ResourceUID::ID ResourceFormatLoaderBinary::get_resource_uid(const String &p_pat ResourceLoaderBinary loader; loader.local_path = ProjectSettings::get_singleton()->localize_path(p_path); loader.res_path = loader.local_path; - //loader.set_local_path( Globals::get_singleton()->localize_path(p_path) ); loader.open(f, true); if (loader.error != OK) { return ResourceUID::INVALID_ID; //could not read @@ -1605,11 +1602,6 @@ void ResourceFormatSaverBinaryInstance::write_variant(FileAccess *f, const Varia d.get_key_list(&keys); for (const Variant &E : keys) { - /* - if (!_check_type(dict[E])) - continue; - */ - write_variant(f, E, resource_map, external_resources, string_map); write_variant(f, d[E], resource_map, external_resources, string_map); } @@ -1900,7 +1892,13 @@ Error ResourceFormatSaverBinaryInstance::save(const String &p_path, const RES &p save_unicode_string(f, p_resource->get_class()); f->store_64(0); //offset to import metadata - f->store_32(FORMAT_FLAG_NAMED_SCENE_IDS | FORMAT_FLAG_UIDS); + { + uint32_t format_flags = FORMAT_FLAG_NAMED_SCENE_IDS | FORMAT_FLAG_UIDS; +#ifdef REAL_T_IS_DOUBLE + format_flags |= FORMAT_FLAG_REAL_T_IS_DOUBLE; +#endif + f->store_32(format_flags); + } ResourceUID::ID uid = ResourceSaver::get_resource_id_for_path(p_path, true); f->store_64(uid); for (int i = 0; i < ResourceFormatSaverBinaryInstance::RESERVED_FIELDS; i++) { diff --git a/core/io/resource_format_binary.h b/core/io/resource_format_binary.h index ecc3e95f6b..c80c9b0ac9 100644 --- a/core/io/resource_format_binary.h +++ b/core/io/resource_format_binary.h @@ -164,6 +164,8 @@ public: enum { FORMAT_FLAG_NAMED_SCENE_IDS = 1, FORMAT_FLAG_UIDS = 2, + FORMAT_FLAG_REAL_T_IS_DOUBLE = 4, + // Amount of reserved 32-bit fields in resource header RESERVED_FIELDS = 11 }; diff --git a/core/io/resource_loader.cpp b/core/io/resource_loader.cpp index 21bf566b1b..2419c76dd3 100644 --- a/core/io/resource_loader.cpp +++ b/core/io/resource_loader.cpp @@ -672,10 +672,6 @@ int ResourceLoader::get_import_order(const String &p_path) { if (!loader[i]->recognize_path(local_path)) { continue; } - /* - if (p_type_hint!="" && !loader[i]->handles_type(p_type_hint)) - continue; - */ return loader[i]->get_import_order(p_path); } @@ -690,10 +686,6 @@ String ResourceLoader::get_import_group_file(const String &p_path) { if (!loader[i]->recognize_path(local_path)) { continue; } - /* - if (p_type_hint!="" && !loader[i]->handles_type(p_type_hint)) - continue; - */ return loader[i]->get_import_group_file(p_path); } @@ -708,10 +700,6 @@ bool ResourceLoader::is_import_valid(const String &p_path) { if (!loader[i]->recognize_path(local_path)) { continue; } - /* - if (p_type_hint!="" && !loader[i]->handles_type(p_type_hint)) - continue; - */ return loader[i]->is_import_valid(p_path); } @@ -726,10 +714,6 @@ bool ResourceLoader::is_imported(const String &p_path) { if (!loader[i]->recognize_path(local_path)) { continue; } - /* - if (p_type_hint!="" && !loader[i]->handles_type(p_type_hint)) - continue; - */ return loader[i]->is_imported(p_path); } @@ -744,10 +728,6 @@ void ResourceLoader::get_dependencies(const String &p_path, List<String> *p_depe if (!loader[i]->recognize_path(local_path)) { continue; } - /* - if (p_type_hint!="" && !loader[i]->handles_type(p_type_hint)) - continue; - */ loader[i]->get_dependencies(local_path, p_dependencies, p_add_types); } @@ -760,10 +740,6 @@ Error ResourceLoader::rename_dependencies(const String &p_path, const Map<String if (!loader[i]->recognize_path(local_path)) { continue; } - /* - if (p_type_hint!="" && !loader[i]->handles_type(p_type_hint)) - continue; - */ return loader[i]->rename_dependencies(local_path, p_map); } diff --git a/core/io/resource_saver.h b/core/io/resource_saver.h index 2919a4cec0..ebc3be91a1 100644 --- a/core/io/resource_saver.h +++ b/core/io/resource_saver.h @@ -71,6 +71,7 @@ class ResourceSaver { public: enum SaverFlags { + FLAG_NONE = 0, FLAG_RELATIVE_PATHS = 1, FLAG_BUNDLE_RESOURCES = 2, FLAG_CHANGE_PATH = 4, @@ -80,7 +81,7 @@ public: FLAG_REPLACE_SUBRESOURCE_PATHS = 64, }; - static Error save(const String &p_path, const RES &p_resource, uint32_t p_flags = 0); + static Error save(const String &p_path, const RES &p_resource, uint32_t p_flags = (uint32_t)FLAG_NONE); static void get_recognized_extensions(const RES &p_resource, List<String> *p_extensions); static void add_resource_format_saver(Ref<ResourceFormatSaver> p_format_saver, bool p_at_front = false); static void remove_resource_format_saver(Ref<ResourceFormatSaver> p_format_saver); diff --git a/core/io/resource_uid.cpp b/core/io/resource_uid.cpp index 776756e64e..d0335bed3a 100644 --- a/core/io/resource_uid.cpp +++ b/core/io/resource_uid.cpp @@ -31,7 +31,7 @@ #include "resource_uid.h" #include "core/config/project_settings.h" -#include "core/crypto/crypto.h" +#include "core/crypto/crypto_core.h" #include "core/io/dir_access.h" #include "core/io/file_access.h" @@ -82,20 +82,14 @@ ResourceUID::ID ResourceUID::text_to_id(const String &p_text) const { return ID(uid & 0x7FFFFFFFFFFFFFFF); } -ResourceUID::ID ResourceUID::create_id() const { - mutex.lock(); - if (crypto.is_null()) { - crypto = Ref<Crypto>(Crypto::create()); - } - mutex.unlock(); +ResourceUID::ID ResourceUID::create_id() { while (true) { - PackedByteArray bytes = crypto->generate_random_bytes(8); - ERR_FAIL_COND_V(bytes.size() != 8, INVALID_ID); - const uint64_t *ptr64 = (const uint64_t *)bytes.ptr(); - ID id = int64_t((*ptr64) & 0x7FFFFFFFFFFFFFFF); - mutex.lock(); + ID id = INVALID_ID; + MutexLock lock(mutex); + Error err = ((CryptoCore::RandomGenerator *)crypto)->get_random_bytes((uint8_t *)&id, sizeof(id)); + ERR_FAIL_COND_V(err != OK, INVALID_ID); + id &= 0x7FFFFFFFFFFFFFFF; bool exists = unique_ids.has(id); - mutex.unlock(); if (!exists) { return id; } @@ -261,6 +255,9 @@ ResourceUID *ResourceUID::singleton = nullptr; ResourceUID::ResourceUID() { ERR_FAIL_COND(singleton != nullptr); singleton = this; + crypto = memnew(CryptoCore::RandomGenerator); + ((CryptoCore::RandomGenerator *)crypto)->init(); } ResourceUID::~ResourceUID() { + memdelete((CryptoCore::RandomGenerator *)crypto); } diff --git a/core/io/resource_uid.h b/core/io/resource_uid.h index 9f2ab5245b..1ea44b9d06 100644 --- a/core/io/resource_uid.h +++ b/core/io/resource_uid.h @@ -35,7 +35,6 @@ #include "core/string/string_name.h" #include "core/templates/ordered_hash_map.h" -class Crypto; class ResourceUID : public Object { GDCLASS(ResourceUID, Object) public: @@ -47,7 +46,7 @@ public: static String get_cache_file(); private: - mutable Ref<Crypto> crypto; + void *crypto; // CryptoCore::RandomGenerator (avoid including crypto_core.h) Mutex mutex; struct Cache { CharString cs; @@ -67,7 +66,7 @@ public: String id_to_text(ID p_id) const; ID text_to_id(const String &p_text) const; - ID create_id() const; + ID create_id(); bool has_id(ID p_id) const; void add_id(ID p_id, const String &p_path); void set_id(ID p_id, const String &p_path); |