You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-04 12:00:25 +00:00
Enhance cache modes in resource loading
- Unify documentation, hoping to clear misconcepctions about about propagation of the cache mode across dependant loads. - Clarify in docs that `CACHE_MODE_REPLACE` now also works on the main resource (from #87008). - Add two recursive modes, counterparts of `CACHE_MODE_REPLACE` and `CACHE_MODE_IGNORE`, since it seems some need them (see #59669, #82830). - Let resources, even loaded with one of the ignore-cache modes, get a path, which is useful for tools.
This commit is contained in:
@@ -430,7 +430,7 @@ Error ResourceLoaderBinary::parse_variant(Variant &r_v) {
|
||||
path = remaps[path];
|
||||
}
|
||||
|
||||
Ref<Resource> res = ResourceLoader::load(path, exttype);
|
||||
Ref<Resource> res = ResourceLoader::load(path, exttype, cache_mode_for_external);
|
||||
|
||||
if (res.is_null()) {
|
||||
WARN_PRINT(String("Couldn't load resource: " + path).utf8().get_data());
|
||||
@@ -683,7 +683,7 @@ Error ResourceLoaderBinary::load() {
|
||||
}
|
||||
|
||||
external_resources.write[i].path = path; //remap happens here, not on load because on load it can actually be used for filesystem dock resource remap
|
||||
external_resources.write[i].load_token = ResourceLoader::_load_start(path, external_resources[i].type, use_sub_threads ? ResourceLoader::LOAD_THREAD_DISTRIBUTE : ResourceLoader::LOAD_THREAD_FROM_CURRENT, ResourceFormatLoader::CACHE_MODE_REUSE);
|
||||
external_resources.write[i].load_token = ResourceLoader::_load_start(path, external_resources[i].type, use_sub_threads ? ResourceLoader::LOAD_THREAD_DISTRIBUTE : ResourceLoader::LOAD_THREAD_FROM_CURRENT, cache_mode_for_external);
|
||||
if (!external_resources[i].load_token.is_valid()) {
|
||||
if (!ResourceLoader::get_abort_on_missing_resources()) {
|
||||
ResourceLoader::notify_dependency_error(local_path, path, external_resources[i].type);
|
||||
@@ -772,10 +772,12 @@ Error ResourceLoaderBinary::load() {
|
||||
}
|
||||
|
||||
res = Ref<Resource>(r);
|
||||
if (!path.is_empty() && cache_mode != ResourceFormatLoader::CACHE_MODE_IGNORE) {
|
||||
r->set_path(path, cache_mode == ResourceFormatLoader::CACHE_MODE_REPLACE); //if got here because the resource with same path has different type, replace it
|
||||
} else if (!path.is_resource_file()) {
|
||||
r->set_path_cache(path);
|
||||
if (!path.is_empty()) {
|
||||
if (cache_mode != ResourceFormatLoader::CACHE_MODE_IGNORE) {
|
||||
r->set_path(path, cache_mode == ResourceFormatLoader::CACHE_MODE_REPLACE); // If got here because the resource with same path has different type, replace it.
|
||||
} else {
|
||||
r->set_path_cache(path);
|
||||
}
|
||||
}
|
||||
r->set_scene_unique_id(id);
|
||||
}
|
||||
@@ -1187,7 +1189,22 @@ Ref<Resource> ResourceFormatLoaderBinary::load(const String &p_path, const Strin
|
||||
ERR_FAIL_COND_V_MSG(err != OK, Ref<Resource>(), "Cannot open file '" + p_path + "'.");
|
||||
|
||||
ResourceLoaderBinary loader;
|
||||
loader.cache_mode = p_cache_mode;
|
||||
switch (p_cache_mode) {
|
||||
case CACHE_MODE_IGNORE:
|
||||
case CACHE_MODE_REUSE:
|
||||
case CACHE_MODE_REPLACE:
|
||||
loader.cache_mode = p_cache_mode;
|
||||
loader.cache_mode_for_external = CACHE_MODE_REUSE;
|
||||
break;
|
||||
case CACHE_MODE_IGNORE_DEEP:
|
||||
loader.cache_mode = CACHE_MODE_IGNORE;
|
||||
loader.cache_mode_for_external = p_cache_mode;
|
||||
break;
|
||||
case CACHE_MODE_REPLACE_DEEP:
|
||||
loader.cache_mode = CACHE_MODE_REPLACE;
|
||||
loader.cache_mode_for_external = p_cache_mode;
|
||||
break;
|
||||
}
|
||||
loader.use_sub_threads = p_use_sub_threads;
|
||||
loader.progress = r_progress;
|
||||
String path = !p_original_path.is_empty() ? p_original_path : p_path;
|
||||
|
||||
Reference in New Issue
Block a user