summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/core_bind.cpp2
-rw-r--r--core/core_bind.h8
-rw-r--r--core/io/resource.h2
-rw-r--r--core/io/resource_format_binary.cpp31
-rw-r--r--core/io/resource_format_binary.h1
-rw-r--r--core/io/resource_loader.cpp14
-rw-r--r--core/io/resource_loader.h8
7 files changed, 47 insertions, 19 deletions
diff --git a/core/core_bind.cpp b/core/core_bind.cpp
index f5c69b9b98..8ccf7d1f51 100644
--- a/core/core_bind.cpp
+++ b/core/core_bind.cpp
@@ -145,6 +145,8 @@ void ResourceLoader::_bind_methods() {
BIND_ENUM_CONSTANT(CACHE_MODE_IGNORE);
BIND_ENUM_CONSTANT(CACHE_MODE_REUSE);
BIND_ENUM_CONSTANT(CACHE_MODE_REPLACE);
+ BIND_ENUM_CONSTANT(CACHE_MODE_IGNORE_DEEP);
+ BIND_ENUM_CONSTANT(CACHE_MODE_REPLACE_DEEP);
}
////// ResourceSaver //////
diff --git a/core/core_bind.h b/core/core_bind.h
index f884426881..3440531124 100644
--- a/core/core_bind.h
+++ b/core/core_bind.h
@@ -63,9 +63,11 @@ public:
};
enum CacheMode {
- CACHE_MODE_IGNORE, // Resource and subresources do not use path cache, no path is set into resource.
- CACHE_MODE_REUSE, // Resource and subresources use patch cache, reuse existing loaded resources instead of loading from disk when available.
- CACHE_MODE_REPLACE, // Resource and subresource use path cache, but replace existing loaded resources when available with information from disk.
+ CACHE_MODE_IGNORE,
+ CACHE_MODE_REUSE,
+ CACHE_MODE_REPLACE,
+ CACHE_MODE_IGNORE_DEEP,
+ CACHE_MODE_REPLACE_DEEP,
};
static ResourceLoader *get_singleton() { return singleton; }
diff --git a/core/io/resource.h b/core/io/resource.h
index b885b773ac..f0f686af57 100644
--- a/core/io/resource.h
+++ b/core/io/resource.h
@@ -106,7 +106,7 @@ public:
virtual void set_path(const String &p_path, bool p_take_over = false);
String get_path() const;
- void set_path_cache(const String &p_path); // Set raw path without involving resource cache.
+ virtual void set_path_cache(const String &p_path); // Set raw path without involving resource cache.
_FORCE_INLINE_ bool is_built_in() const { return path_cache.is_empty() || path_cache.contains("::") || path_cache.begins_with("local://"); }
static String generate_scene_unique_id();
diff --git a/core/io/resource_format_binary.cpp b/core/io/resource_format_binary.cpp
index 20c494516b..17cffb878e 100644
--- a/core/io/resource_format_binary.cpp
+++ b/core/io/resource_format_binary.cpp
@@ -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;
diff --git a/core/io/resource_format_binary.h b/core/io/resource_format_binary.h
index e64485d404..e01c5fa467 100644
--- a/core/io/resource_format_binary.h
+++ b/core/io/resource_format_binary.h
@@ -85,6 +85,7 @@ class ResourceLoaderBinary {
Error error = OK;
ResourceFormatLoader::CacheMode cache_mode = ResourceFormatLoader::CACHE_MODE_REUSE;
+ ResourceFormatLoader::CacheMode cache_mode_for_external = ResourceFormatLoader::CACHE_MODE_REUSE;
friend class ResourceFormatLoaderBinary;
diff --git a/core/io/resource_loader.cpp b/core/io/resource_loader.cpp
index a3fc7bc370..ff563a35b2 100644
--- a/core/io/resource_loader.cpp
+++ b/core/io/resource_loader.cpp
@@ -188,6 +188,8 @@ void ResourceFormatLoader::_bind_methods() {
BIND_ENUM_CONSTANT(CACHE_MODE_IGNORE);
BIND_ENUM_CONSTANT(CACHE_MODE_REUSE);
BIND_ENUM_CONSTANT(CACHE_MODE_REPLACE);
+ BIND_ENUM_CONSTANT(CACHE_MODE_IGNORE_DEEP);
+ BIND_ENUM_CONSTANT(CACHE_MODE_REPLACE_DEEP);
GDVIRTUAL_BIND(_get_recognized_extensions);
GDVIRTUAL_BIND(_recognize_path, "path", "type");
@@ -339,9 +341,11 @@ void ResourceLoader::_thread_load_function(void *p_userdata) {
load_task.cond_var = nullptr;
}
+ bool ignoring = load_task.cache_mode == ResourceFormatLoader::CACHE_MODE_IGNORE || load_task.cache_mode == ResourceFormatLoader::CACHE_MODE_IGNORE_DEEP;
+ bool replacing = load_task.cache_mode == ResourceFormatLoader::CACHE_MODE_REPLACE || load_task.cache_mode == ResourceFormatLoader::CACHE_MODE_REPLACE_DEEP;
if (load_task.resource.is_valid()) {
- if (load_task.cache_mode != ResourceFormatLoader::CACHE_MODE_IGNORE) {
- if (load_task.cache_mode == ResourceFormatLoader::CACHE_MODE_REPLACE) {
+ if (!ignoring) {
+ if (replacing) {
Ref<Resource> old_res = ResourceCache::get_ref(load_task.local_path);
if (old_res.is_valid() && old_res != load_task.resource) {
// If resource is already loaded, only replace its data, to avoid existing invalidating instances.
@@ -349,8 +353,8 @@ void ResourceLoader::_thread_load_function(void *p_userdata) {
load_task.resource = old_res;
}
}
- load_task.resource->set_path(load_task.local_path, load_task.cache_mode == ResourceFormatLoader::CACHE_MODE_REPLACE);
- } else if (!load_task.local_path.is_resource_file()) {
+ load_task.resource->set_path(load_task.local_path, replacing);
+ } else {
load_task.resource->set_path_cache(load_task.local_path);
}
@@ -370,7 +374,7 @@ void ResourceLoader::_thread_load_function(void *p_userdata) {
if (_loaded_callback) {
_loaded_callback(load_task.resource, load_task.local_path);
}
- } else if (load_task.cache_mode != ResourceFormatLoader::CACHE_MODE_IGNORE) {
+ } else if (!ignoring) {
Ref<Resource> existing = ResourceCache::get_ref(load_task.local_path);
if (existing.is_valid()) {
load_task.resource = existing;
diff --git a/core/io/resource_loader.h b/core/io/resource_loader.h
index 1f79b83f11..5caf699d32 100644
--- a/core/io/resource_loader.h
+++ b/core/io/resource_loader.h
@@ -47,9 +47,11 @@ class ResourceFormatLoader : public RefCounted {
public:
enum CacheMode {
- CACHE_MODE_IGNORE, // Resource and subresources do not use path cache, no path is set into resource.
- CACHE_MODE_REUSE, // Resource and subresources use patch cache, reuse existing loaded resources instead of loading from disk when available.
- CACHE_MODE_REPLACE, // Resource and subresource use path cache, but replace existing loaded resources when available with information from disk.
+ CACHE_MODE_IGNORE,
+ CACHE_MODE_REUSE,
+ CACHE_MODE_REPLACE,
+ CACHE_MODE_IGNORE_DEEP,
+ CACHE_MODE_REPLACE_DEEP,
};
protected: