mirror of
https://github.com/godotengine/godot.git
synced 2026-05-12 22:35:35 +00:00
Removed interactive loader, added proper thread loading.
This commit is contained in:
+24
-3
@@ -64,8 +64,21 @@ static const unsigned int MONTH_DAYS_TABLE[2][12] = {
|
||||
|
||||
_ResourceLoader *_ResourceLoader::singleton = NULL;
|
||||
|
||||
Ref<ResourceInteractiveLoader> _ResourceLoader::load_interactive(const String &p_path, const String &p_type_hint) {
|
||||
return ResourceLoader::load_interactive(p_path, p_type_hint);
|
||||
Error _ResourceLoader::load_threaded_request(const String &p_path, const String &p_type_hint, bool p_use_sub_threads) {
|
||||
|
||||
return ResourceLoader::load_threaded_request(p_path, p_type_hint, p_use_sub_threads);
|
||||
}
|
||||
_ResourceLoader::ThreadLoadStatus _ResourceLoader::load_threaded_get_status(const String &p_path, Array r_progress) {
|
||||
float progress = 0;
|
||||
ResourceLoader::ThreadLoadStatus tls = ResourceLoader::load_threaded_get_status(p_path, &progress);
|
||||
r_progress.resize(1);
|
||||
r_progress[0] = progress;
|
||||
return (ThreadLoadStatus)tls;
|
||||
}
|
||||
RES _ResourceLoader::load_threaded_get(const String &p_path) {
|
||||
Error error;
|
||||
RES res = ResourceLoader::load_threaded_get(p_path, &error);
|
||||
return res;
|
||||
}
|
||||
|
||||
RES _ResourceLoader::load(const String &p_path, const String &p_type_hint, bool p_no_cache) {
|
||||
@@ -120,13 +133,21 @@ bool _ResourceLoader::exists(const String &p_path, const String &p_type_hint) {
|
||||
|
||||
void _ResourceLoader::_bind_methods() {
|
||||
|
||||
ClassDB::bind_method(D_METHOD("load_interactive", "path", "type_hint"), &_ResourceLoader::load_interactive, DEFVAL(""));
|
||||
ClassDB::bind_method(D_METHOD("load_threaded_request", "path", "type_hint", "use_sub_threads"), &_ResourceLoader::load_threaded_request, DEFVAL(""), DEFVAL(false));
|
||||
ClassDB::bind_method(D_METHOD("load_threaded_get_status", "path", "r_progress"), &_ResourceLoader::load_threaded_get_status, DEFVAL(Array()));
|
||||
ClassDB::bind_method(D_METHOD("load_threaded_get", "path"), &_ResourceLoader::load_threaded_get);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("load", "path", "type_hint", "no_cache"), &_ResourceLoader::load, DEFVAL(""), DEFVAL(false));
|
||||
ClassDB::bind_method(D_METHOD("get_recognized_extensions_for_type", "type"), &_ResourceLoader::get_recognized_extensions_for_type);
|
||||
ClassDB::bind_method(D_METHOD("set_abort_on_missing_resources", "abort"), &_ResourceLoader::set_abort_on_missing_resources);
|
||||
ClassDB::bind_method(D_METHOD("get_dependencies", "path"), &_ResourceLoader::get_dependencies);
|
||||
ClassDB::bind_method(D_METHOD("has_cached", "path"), &_ResourceLoader::has_cached);
|
||||
ClassDB::bind_method(D_METHOD("exists", "path", "type_hint"), &_ResourceLoader::exists, DEFVAL(""));
|
||||
|
||||
BIND_ENUM_CONSTANT(THREAD_LOAD_INVALID_RESOURCE);
|
||||
BIND_ENUM_CONSTANT(THREAD_LOAD_IN_PROGRESS);
|
||||
BIND_ENUM_CONSTANT(THREAD_LOAD_FAILED);
|
||||
BIND_ENUM_CONSTANT(THREAD_LOAD_LOADED);
|
||||
}
|
||||
|
||||
_ResourceLoader::_ResourceLoader() {
|
||||
|
||||
+14
-1
@@ -49,8 +49,19 @@ protected:
|
||||
static _ResourceLoader *singleton;
|
||||
|
||||
public:
|
||||
enum ThreadLoadStatus {
|
||||
THREAD_LOAD_INVALID_RESOURCE,
|
||||
THREAD_LOAD_IN_PROGRESS,
|
||||
THREAD_LOAD_FAILED,
|
||||
THREAD_LOAD_LOADED
|
||||
};
|
||||
|
||||
static _ResourceLoader *get_singleton() { return singleton; }
|
||||
Ref<ResourceInteractiveLoader> load_interactive(const String &p_path, const String &p_type_hint = "");
|
||||
|
||||
Error load_threaded_request(const String &p_path, const String &p_type_hint = "", bool p_use_sub_threads = false);
|
||||
ThreadLoadStatus load_threaded_get_status(const String &p_path, Array r_progress = Array());
|
||||
RES load_threaded_get(const String &p_path);
|
||||
|
||||
RES load(const String &p_path, const String &p_type_hint = "", bool p_no_cache = false);
|
||||
Vector<String> get_recognized_extensions_for_type(const String &p_type);
|
||||
void set_abort_on_missing_resources(bool p_abort);
|
||||
@@ -61,6 +72,8 @@ public:
|
||||
_ResourceLoader();
|
||||
};
|
||||
|
||||
VARIANT_ENUM_CAST(_ResourceLoader::ThreadLoadStatus);
|
||||
|
||||
class _ResourceSaver : public Object {
|
||||
GDCLASS(_ResourceSaver, Object);
|
||||
|
||||
|
||||
@@ -99,7 +99,7 @@ Crypto::Crypto() {
|
||||
|
||||
/// Resource loader/saver
|
||||
|
||||
RES ResourceFormatLoaderCrypto::load(const String &p_path, const String &p_original_path, Error *r_error) {
|
||||
RES ResourceFormatLoaderCrypto::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress) {
|
||||
|
||||
String el = p_path.get_extension().to_lower();
|
||||
if (el == "crt") {
|
||||
|
||||
@@ -87,7 +87,7 @@ class ResourceFormatLoaderCrypto : public ResourceFormatLoader {
|
||||
GDCLASS(ResourceFormatLoaderCrypto, ResourceFormatLoader);
|
||||
|
||||
public:
|
||||
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
|
||||
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL, bool p_use_sub_threads = false, float *r_progress = nullptr);
|
||||
virtual void get_recognized_extensions(List<String> *p_extensions) const;
|
||||
virtual bool handles_type(const String &p_type) const;
|
||||
virtual String get_resource_type(const String &p_path) const;
|
||||
|
||||
@@ -129,7 +129,7 @@ void ImageLoader::cleanup() {
|
||||
|
||||
/////////////////
|
||||
|
||||
RES ResourceFormatLoaderImage::load(const String &p_path, const String &p_original_path, Error *r_error) {
|
||||
RES ResourceFormatLoaderImage::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress) {
|
||||
|
||||
FileAccess *f = FileAccess::open(p_path, FileAccess::READ);
|
||||
if (!f) {
|
||||
|
||||
@@ -73,7 +73,7 @@ public:
|
||||
|
||||
class ResourceFormatLoaderImage : public ResourceFormatLoader {
|
||||
public:
|
||||
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
|
||||
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL, bool p_use_sub_threads = false, float *r_progress = nullptr);
|
||||
virtual void get_recognized_extensions(List<String> *p_extensions) const;
|
||||
virtual bool handles_type(const String &p_type) const;
|
||||
virtual String get_resource_type(const String &p_path) const;
|
||||
|
||||
+175
-152
@@ -93,7 +93,7 @@ enum {
|
||||
|
||||
};
|
||||
|
||||
void ResourceInteractiveLoaderBinary::_advance_padding(uint32_t p_len) {
|
||||
void ResourceLoaderBinary::_advance_padding(uint32_t p_len) {
|
||||
|
||||
uint32_t extra = 4 - (p_len % 4);
|
||||
if (extra < 4) {
|
||||
@@ -102,7 +102,7 @@ void ResourceInteractiveLoaderBinary::_advance_padding(uint32_t p_len) {
|
||||
}
|
||||
}
|
||||
|
||||
StringName ResourceInteractiveLoaderBinary::_get_string() {
|
||||
StringName ResourceLoaderBinary::_get_string() {
|
||||
|
||||
uint32_t id = f->get_32();
|
||||
if (id & 0x80000000) {
|
||||
@@ -121,7 +121,7 @@ StringName ResourceInteractiveLoaderBinary::_get_string() {
|
||||
return string_map[id];
|
||||
}
|
||||
|
||||
Error ResourceInteractiveLoaderBinary::parse_variant(Variant &r_v) {
|
||||
Error ResourceLoaderBinary::parse_variant(Variant &r_v) {
|
||||
|
||||
uint32_t type = f->get_32();
|
||||
print_bl("find property of type: " + itos(type));
|
||||
@@ -377,20 +377,26 @@ Error ResourceInteractiveLoaderBinary::parse_variant(Variant &r_v) {
|
||||
r_v = Variant();
|
||||
} else {
|
||||
|
||||
String exttype = external_resources[erindex].type;
|
||||
String path = external_resources[erindex].path;
|
||||
if (external_resources[erindex].cache.is_null()) {
|
||||
//cache not here yet, wait for it?
|
||||
if (use_sub_threads) {
|
||||
Error err;
|
||||
external_resources.write[erindex].cache = ResourceLoader::load_threaded_get(external_resources[erindex].path, &err);
|
||||
|
||||
if (path.find("://") == -1 && path.is_rel_path()) {
|
||||
// path is relative to file being loaded, so convert to a resource path
|
||||
path = ProjectSettings::get_singleton()->localize_path(res_path.get_base_dir().plus_file(path));
|
||||
if (err != OK || external_resources[erindex].cache.is_null()) {
|
||||
if (!ResourceLoader::get_abort_on_missing_resources()) {
|
||||
|
||||
ResourceLoader::notify_dependency_error(local_path, external_resources[erindex].path, external_resources[erindex].type);
|
||||
} else {
|
||||
|
||||
error = ERR_FILE_MISSING_DEPENDENCIES;
|
||||
ERR_FAIL_V_MSG(error, "Can't load dependency: " + external_resources[erindex].path + ".");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
RES res = ResourceLoader::load(path, exttype);
|
||||
|
||||
if (res.is_null()) {
|
||||
WARN_PRINT(String("Couldn't load resource: " + path).utf8().get_data());
|
||||
}
|
||||
r_v = res;
|
||||
r_v = external_resources[erindex].cache;
|
||||
}
|
||||
|
||||
} break;
|
||||
@@ -638,160 +644,168 @@ Error ResourceInteractiveLoaderBinary::parse_variant(Variant &r_v) {
|
||||
return OK; //never reach anyway
|
||||
}
|
||||
|
||||
void ResourceInteractiveLoaderBinary::set_local_path(const String &p_local_path) {
|
||||
void ResourceLoaderBinary::set_local_path(const String &p_local_path) {
|
||||
|
||||
res_path = p_local_path;
|
||||
}
|
||||
|
||||
Ref<Resource> ResourceInteractiveLoaderBinary::get_resource() {
|
||||
Ref<Resource> ResourceLoaderBinary::get_resource() {
|
||||
|
||||
return resource;
|
||||
}
|
||||
Error ResourceInteractiveLoaderBinary::poll() {
|
||||
Error ResourceLoaderBinary::load() {
|
||||
|
||||
if (error != OK)
|
||||
return error;
|
||||
|
||||
int s = stage;
|
||||
int stage = 0;
|
||||
|
||||
if (s < external_resources.size()) {
|
||||
for (int i = 0; i < external_resources.size(); i++) {
|
||||
|
||||
String path = external_resources[s].path;
|
||||
String path = external_resources[i].path;
|
||||
|
||||
if (remaps.has(path)) {
|
||||
path = remaps[path];
|
||||
}
|
||||
RES res = ResourceLoader::load(path, external_resources[s].type);
|
||||
if (res.is_null()) {
|
||||
|
||||
if (!ResourceLoader::get_abort_on_missing_resources()) {
|
||||
if (path.find("://") == -1 && path.is_rel_path()) {
|
||||
// path is relative to file being loaded, so convert to a resource path
|
||||
path = ProjectSettings::get_singleton()->localize_path(path.get_base_dir().plus_file(external_resources[i].path));
|
||||
}
|
||||
|
||||
ResourceLoader::notify_dependency_error(local_path, path, external_resources[s].type);
|
||||
} else {
|
||||
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
|
||||
|
||||
error = ERR_FILE_MISSING_DEPENDENCIES;
|
||||
ERR_FAIL_V_MSG(error, "Can't load dependency: " + path + ".");
|
||||
if (!use_sub_threads) {
|
||||
external_resources.write[i].cache = ResourceLoader::load(path, external_resources[i].type);
|
||||
|
||||
if (external_resources[i].cache.is_null()) {
|
||||
if (!ResourceLoader::get_abort_on_missing_resources()) {
|
||||
|
||||
ResourceLoader::notify_dependency_error(local_path, path, external_resources[i].type);
|
||||
} else {
|
||||
|
||||
error = ERR_FILE_MISSING_DEPENDENCIES;
|
||||
ERR_FAIL_V_MSG(error, "Can't load dependency: " + path + ".");
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
resource_cache.push_back(res);
|
||||
Error err = ResourceLoader::load_threaded_request(path, external_resources[i].type, use_sub_threads, local_path);
|
||||
if (err != OK) {
|
||||
if (!ResourceLoader::get_abort_on_missing_resources()) {
|
||||
|
||||
ResourceLoader::notify_dependency_error(local_path, path, external_resources[i].type);
|
||||
} else {
|
||||
|
||||
error = ERR_FILE_MISSING_DEPENDENCIES;
|
||||
ERR_FAIL_V_MSG(error, "Can't load dependency: " + path + ".");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
stage++;
|
||||
return error;
|
||||
}
|
||||
|
||||
s -= external_resources.size();
|
||||
for (int i = 0; i < internal_resources.size(); i++) {
|
||||
|
||||
if (s >= internal_resources.size()) {
|
||||
bool main = i == (internal_resources.size() - 1);
|
||||
|
||||
error = ERR_BUG;
|
||||
ERR_FAIL_COND_V(s >= internal_resources.size(), error);
|
||||
}
|
||||
//maybe it is loaded already
|
||||
String path;
|
||||
int subindex = 0;
|
||||
|
||||
bool main = s == (internal_resources.size() - 1);
|
||||
if (!main) {
|
||||
|
||||
//maybe it is loaded already
|
||||
String path;
|
||||
int subindex = 0;
|
||||
path = internal_resources[i].path;
|
||||
if (path.begins_with("local://")) {
|
||||
path = path.replace_first("local://", "");
|
||||
subindex = path.to_int();
|
||||
path = res_path + "::" + path;
|
||||
}
|
||||
|
||||
if (!main) {
|
||||
if (ResourceCache::has(path)) {
|
||||
//already loaded, don't do anything
|
||||
stage++;
|
||||
error = OK;
|
||||
continue;
|
||||
}
|
||||
} else {
|
||||
|
||||
path = internal_resources[s].path;
|
||||
if (path.begins_with("local://")) {
|
||||
path = path.replace_first("local://", "");
|
||||
subindex = path.to_int();
|
||||
path = res_path + "::" + path;
|
||||
if (!ResourceCache::has(res_path))
|
||||
path = res_path;
|
||||
}
|
||||
|
||||
if (ResourceCache::has(path)) {
|
||||
//already loaded, don't do anything
|
||||
stage++;
|
||||
error = OK;
|
||||
return error;
|
||||
}
|
||||
} else {
|
||||
uint64_t offset = internal_resources[i].offset;
|
||||
|
||||
if (!ResourceCache::has(res_path))
|
||||
path = res_path;
|
||||
}
|
||||
f->seek(offset);
|
||||
|
||||
uint64_t offset = internal_resources[s].offset;
|
||||
String t = get_unicode_string();
|
||||
|
||||
f->seek(offset);
|
||||
|
||||
String t = get_unicode_string();
|
||||
|
||||
Object *obj = ClassDB::instance(t);
|
||||
if (!obj) {
|
||||
error = ERR_FILE_CORRUPT;
|
||||
ERR_FAIL_V_MSG(ERR_FILE_CORRUPT, local_path + ":Resource of unrecognized type in file: " + t + ".");
|
||||
}
|
||||
|
||||
Resource *r = Object::cast_to<Resource>(obj);
|
||||
if (!r) {
|
||||
String obj_class = obj->get_class();
|
||||
error = ERR_FILE_CORRUPT;
|
||||
memdelete(obj); //bye
|
||||
ERR_FAIL_V_MSG(ERR_FILE_CORRUPT, local_path + ":Resource type in resource field not a resource, type is: " + obj_class + ".");
|
||||
}
|
||||
|
||||
RES res = RES(r);
|
||||
|
||||
r->set_path(path);
|
||||
r->set_subindex(subindex);
|
||||
|
||||
int pc = f->get_32();
|
||||
|
||||
//set properties
|
||||
|
||||
for (int i = 0; i < pc; i++) {
|
||||
|
||||
StringName name = _get_string();
|
||||
|
||||
if (name == StringName()) {
|
||||
Object *obj = ClassDB::instance(t);
|
||||
if (!obj) {
|
||||
error = ERR_FILE_CORRUPT;
|
||||
ERR_FAIL_V(ERR_FILE_CORRUPT);
|
||||
ERR_FAIL_V_MSG(ERR_FILE_CORRUPT, local_path + ":Resource of unrecognized type in file: " + t + ".");
|
||||
}
|
||||
|
||||
Variant value;
|
||||
Resource *r = Object::cast_to<Resource>(obj);
|
||||
if (!r) {
|
||||
String obj_class = obj->get_class();
|
||||
error = ERR_FILE_CORRUPT;
|
||||
memdelete(obj); //bye
|
||||
ERR_FAIL_V_MSG(ERR_FILE_CORRUPT, local_path + ":Resource type in resource field not a resource, type is: " + obj_class + ".");
|
||||
}
|
||||
|
||||
error = parse_variant(value);
|
||||
if (error)
|
||||
return error;
|
||||
RES res = RES(r);
|
||||
|
||||
res->set(name, value);
|
||||
}
|
||||
r->set_path(path);
|
||||
r->set_subindex(subindex);
|
||||
|
||||
int pc = f->get_32();
|
||||
|
||||
//set properties
|
||||
|
||||
for (int j = 0; j < pc; j++) {
|
||||
|
||||
StringName name = _get_string();
|
||||
|
||||
if (name == StringName()) {
|
||||
error = ERR_FILE_CORRUPT;
|
||||
ERR_FAIL_V(ERR_FILE_CORRUPT);
|
||||
}
|
||||
|
||||
Variant value;
|
||||
|
||||
error = parse_variant(value);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
res->set(name, value);
|
||||
}
|
||||
#ifdef TOOLS_ENABLED
|
||||
res->set_edited(false);
|
||||
res->set_edited(false);
|
||||
#endif
|
||||
stage++;
|
||||
stage++;
|
||||
|
||||
resource_cache.push_back(res);
|
||||
if (progress) {
|
||||
*progress = (i + 1) / float(internal_resources.size());
|
||||
}
|
||||
|
||||
if (main) {
|
||||
resource_cache.push_back(res);
|
||||
|
||||
f->close();
|
||||
resource = res;
|
||||
resource->set_as_translation_remapped(translation_remapped);
|
||||
error = ERR_FILE_EOF;
|
||||
if (main) {
|
||||
|
||||
} else {
|
||||
error = OK;
|
||||
f->close();
|
||||
resource = res;
|
||||
resource->set_as_translation_remapped(translation_remapped);
|
||||
error = OK;
|
||||
return OK;
|
||||
}
|
||||
}
|
||||
|
||||
return OK;
|
||||
}
|
||||
int ResourceInteractiveLoaderBinary::get_stage() const {
|
||||
|
||||
return stage;
|
||||
}
|
||||
int ResourceInteractiveLoaderBinary::get_stage_count() const {
|
||||
|
||||
return external_resources.size() + internal_resources.size();
|
||||
return ERR_FILE_EOF;
|
||||
}
|
||||
|
||||
void ResourceInteractiveLoaderBinary::set_translation_remapped(bool p_remapped) {
|
||||
void ResourceLoaderBinary::set_translation_remapped(bool p_remapped) {
|
||||
|
||||
translation_remapped = p_remapped;
|
||||
}
|
||||
@@ -814,7 +828,7 @@ static String get_ustring(FileAccess *f) {
|
||||
return s;
|
||||
}
|
||||
|
||||
String ResourceInteractiveLoaderBinary::get_unicode_string() {
|
||||
String ResourceLoaderBinary::get_unicode_string() {
|
||||
|
||||
int len = f->get_32();
|
||||
if (len > str_buf.size()) {
|
||||
@@ -828,7 +842,7 @@ String ResourceInteractiveLoaderBinary::get_unicode_string() {
|
||||
return s;
|
||||
}
|
||||
|
||||
void ResourceInteractiveLoaderBinary::get_dependencies(FileAccess *p_f, List<String> *p_dependencies, bool p_add_types) {
|
||||
void ResourceLoaderBinary::get_dependencies(FileAccess *p_f, List<String> *p_dependencies, bool p_add_types) {
|
||||
|
||||
open(p_f);
|
||||
if (error)
|
||||
@@ -846,7 +860,7 @@ void ResourceInteractiveLoaderBinary::get_dependencies(FileAccess *p_f, List<Str
|
||||
}
|
||||
}
|
||||
|
||||
void ResourceInteractiveLoaderBinary::open(FileAccess *p_f) {
|
||||
void ResourceLoaderBinary::open(FileAccess *p_f) {
|
||||
|
||||
error = OK;
|
||||
|
||||
@@ -947,7 +961,7 @@ void ResourceInteractiveLoaderBinary::open(FileAccess *p_f) {
|
||||
}
|
||||
}
|
||||
|
||||
String ResourceInteractiveLoaderBinary::recognize(FileAccess *p_f) {
|
||||
String ResourceLoaderBinary::recognize(FileAccess *p_f) {
|
||||
|
||||
error = OK;
|
||||
|
||||
@@ -992,20 +1006,22 @@ String ResourceInteractiveLoaderBinary::recognize(FileAccess *p_f) {
|
||||
return type;
|
||||
}
|
||||
|
||||
ResourceInteractiveLoaderBinary::ResourceInteractiveLoaderBinary() :
|
||||
ResourceLoaderBinary::ResourceLoaderBinary() :
|
||||
translation_remapped(false),
|
||||
f(NULL),
|
||||
error(OK),
|
||||
stage(0) {
|
||||
error(OK) {
|
||||
|
||||
progress = nullptr;
|
||||
use_sub_threads = false;
|
||||
}
|
||||
|
||||
ResourceInteractiveLoaderBinary::~ResourceInteractiveLoaderBinary() {
|
||||
ResourceLoaderBinary::~ResourceLoaderBinary() {
|
||||
|
||||
if (f)
|
||||
memdelete(f);
|
||||
}
|
||||
|
||||
Ref<ResourceInteractiveLoader> ResourceFormatLoaderBinary::load_interactive(const String &p_path, const String &p_original_path, Error *r_error) {
|
||||
RES ResourceFormatLoaderBinary::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress) {
|
||||
|
||||
if (r_error)
|
||||
*r_error = ERR_FILE_CANT_OPEN;
|
||||
@@ -1013,16 +1029,27 @@ Ref<ResourceInteractiveLoader> ResourceFormatLoaderBinary::load_interactive(cons
|
||||
Error err;
|
||||
FileAccess *f = FileAccess::open(p_path, FileAccess::READ, &err);
|
||||
|
||||
ERR_FAIL_COND_V_MSG(err != OK, Ref<ResourceInteractiveLoader>(), "Cannot open file '" + p_path + "'.");
|
||||
ERR_FAIL_COND_V_MSG(err != OK, RES(), "Cannot open file '" + p_path + "'.");
|
||||
|
||||
Ref<ResourceInteractiveLoaderBinary> ria = memnew(ResourceInteractiveLoaderBinary);
|
||||
ResourceLoaderBinary loader;
|
||||
loader.use_sub_threads = p_use_sub_threads;
|
||||
loader.progress = r_progress;
|
||||
String path = p_original_path != "" ? p_original_path : p_path;
|
||||
ria->local_path = ProjectSettings::get_singleton()->localize_path(path);
|
||||
ria->res_path = ria->local_path;
|
||||
//ria->set_local_path( Globals::get_singleton()->localize_path(p_path) );
|
||||
ria->open(f);
|
||||
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);
|
||||
|
||||
return ria;
|
||||
err = loader.load();
|
||||
|
||||
if (r_error) {
|
||||
*r_error = err;
|
||||
}
|
||||
|
||||
if (err) {
|
||||
return RES();
|
||||
}
|
||||
return loader.resource;
|
||||
}
|
||||
|
||||
void ResourceFormatLoaderBinary::get_recognized_extensions_for_type(const String &p_type, List<String> *p_extensions) const {
|
||||
@@ -1064,11 +1091,11 @@ void ResourceFormatLoaderBinary::get_dependencies(const String &p_path, List<Str
|
||||
FileAccess *f = FileAccess::open(p_path, FileAccess::READ);
|
||||
ERR_FAIL_COND_MSG(!f, "Cannot open file '" + p_path + "'.");
|
||||
|
||||
Ref<ResourceInteractiveLoaderBinary> ria = memnew(ResourceInteractiveLoaderBinary);
|
||||
ria->local_path = ProjectSettings::get_singleton()->localize_path(p_path);
|
||||
ria->res_path = ria->local_path;
|
||||
//ria->set_local_path( Globals::get_singleton()->localize_path(p_path) );
|
||||
ria->get_dependencies(f, p_dependencies, p_add_types);
|
||||
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) {
|
||||
@@ -1153,21 +1180,17 @@ Error ResourceFormatLoaderBinary::rename_dependencies(const String &p_path, cons
|
||||
|
||||
ERR_FAIL_COND_V_MSG(err != OK, ERR_FILE_CANT_OPEN, "Cannot open file '" + p_path + "'.");
|
||||
|
||||
Ref<ResourceInteractiveLoaderBinary> ria = memnew(ResourceInteractiveLoaderBinary);
|
||||
ria->local_path = ProjectSettings::get_singleton()->localize_path(p_path);
|
||||
ria->res_path = ria->local_path;
|
||||
ria->remaps = p_map;
|
||||
//ria->set_local_path( Globals::get_singleton()->localize_path(p_path) );
|
||||
ria->open(f);
|
||||
ResourceLoaderBinary loader;
|
||||
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 = ria->poll();
|
||||
|
||||
while (err == OK) {
|
||||
err = ria->poll();
|
||||
}
|
||||
err = loader.load();
|
||||
|
||||
ERR_FAIL_COND_V(err != ERR_FILE_EOF, ERR_FILE_CORRUPT);
|
||||
RES res = ria->get_resource();
|
||||
RES res = loader.get_resource();
|
||||
ERR_FAIL_COND_V(!res.is_valid(), ERR_FILE_CORRUPT);
|
||||
|
||||
return ResourceFormatSaverBinary::singleton->save(p_path, res);
|
||||
@@ -1283,11 +1306,11 @@ String ResourceFormatLoaderBinary::get_resource_type(const String &p_path) const
|
||||
return ""; //could not rwead
|
||||
}
|
||||
|
||||
Ref<ResourceInteractiveLoaderBinary> ria = memnew(ResourceInteractiveLoaderBinary);
|
||||
ria->local_path = ProjectSettings::get_singleton()->localize_path(p_path);
|
||||
ria->res_path = ria->local_path;
|
||||
//ria->set_local_path( Globals::get_singleton()->localize_path(p_path) );
|
||||
String r = ria->recognize(f);
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
#include "core/io/resource_saver.h"
|
||||
#include "core/os/file_access.h"
|
||||
|
||||
class ResourceInteractiveLoaderBinary : public ResourceInteractiveLoader {
|
||||
class ResourceLoaderBinary {
|
||||
|
||||
bool translation_remapped;
|
||||
String local_path;
|
||||
@@ -58,8 +58,11 @@ class ResourceInteractiveLoaderBinary : public ResourceInteractiveLoader {
|
||||
struct ExtResource {
|
||||
String path;
|
||||
String type;
|
||||
RES cache;
|
||||
};
|
||||
|
||||
bool use_sub_threads;
|
||||
float *progress;
|
||||
Vector<ExtResource> external_resources;
|
||||
|
||||
struct IntResource {
|
||||
@@ -75,32 +78,30 @@ class ResourceInteractiveLoaderBinary : public ResourceInteractiveLoader {
|
||||
Map<String, String> remaps;
|
||||
Error error;
|
||||
|
||||
int stage;
|
||||
|
||||
friend class ResourceFormatLoaderBinary;
|
||||
|
||||
Error parse_variant(Variant &r_v);
|
||||
|
||||
Map<String, RES> dependency_cache;
|
||||
|
||||
public:
|
||||
virtual void set_local_path(const String &p_local_path);
|
||||
virtual Ref<Resource> get_resource();
|
||||
virtual Error poll();
|
||||
virtual int get_stage() const;
|
||||
virtual int get_stage_count() const;
|
||||
virtual void set_translation_remapped(bool p_remapped);
|
||||
void set_local_path(const String &p_local_path);
|
||||
Ref<Resource> get_resource();
|
||||
Error load();
|
||||
void set_translation_remapped(bool p_remapped);
|
||||
|
||||
void set_remaps(const Map<String, String> &p_remaps) { remaps = p_remaps; }
|
||||
void open(FileAccess *p_f);
|
||||
String recognize(FileAccess *p_f);
|
||||
void get_dependencies(FileAccess *p_f, List<String> *p_dependencies, bool p_add_types);
|
||||
|
||||
ResourceInteractiveLoaderBinary();
|
||||
~ResourceInteractiveLoaderBinary();
|
||||
ResourceLoaderBinary();
|
||||
~ResourceLoaderBinary();
|
||||
};
|
||||
|
||||
class ResourceFormatLoaderBinary : public ResourceFormatLoader {
|
||||
public:
|
||||
virtual Ref<ResourceInteractiveLoader> load_interactive(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
|
||||
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL, bool p_use_sub_threads = false, float *r_progress = nullptr);
|
||||
virtual void get_recognized_extensions_for_type(const String &p_type, List<String> *p_extensions) const;
|
||||
virtual void get_recognized_extensions(List<String> *p_extensions) const;
|
||||
virtual bool handles_type(const String &p_type) const;
|
||||
|
||||
@@ -117,7 +117,7 @@ Error ResourceFormatImporter::_get_path_and_type(const String &p_path, PathAndTy
|
||||
return OK;
|
||||
}
|
||||
|
||||
RES ResourceFormatImporter::load(const String &p_path, const String &p_original_path, Error *r_error) {
|
||||
RES ResourceFormatImporter::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress) {
|
||||
|
||||
PathAndType pat;
|
||||
Error err = _get_path_and_type(p_path, pat);
|
||||
@@ -130,7 +130,7 @@ RES ResourceFormatImporter::load(const String &p_path, const String &p_original_
|
||||
return RES();
|
||||
}
|
||||
|
||||
RES res = ResourceLoader::_load(pat.path, p_path, pat.type, false, r_error);
|
||||
RES res = ResourceLoader::_load(pat.path, p_path, pat.type, false, r_error, p_use_sub_threads, r_progress);
|
||||
|
||||
#ifdef TOOLS_ENABLED
|
||||
if (res.is_valid()) {
|
||||
|
||||
@@ -58,7 +58,7 @@ class ResourceFormatImporter : public ResourceFormatLoader {
|
||||
|
||||
public:
|
||||
static ResourceFormatImporter *get_singleton() { return singleton; }
|
||||
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
|
||||
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL, bool p_use_sub_threads = false, float *r_progress = nullptr);
|
||||
virtual void get_recognized_extensions(List<String> *p_extensions) const;
|
||||
virtual void get_recognized_extensions_for_type(const String &p_type, List<String> *p_extensions) const;
|
||||
virtual bool recognize_path(const String &p_path, const String &p_for_type = String()) const;
|
||||
|
||||
+375
-227
File diff suppressed because it is too large
Load Diff
+42
-43
@@ -31,32 +31,10 @@
|
||||
#ifndef RESOURCE_LOADER_H
|
||||
#define RESOURCE_LOADER_H
|
||||
|
||||
#include "core/os/semaphore.h"
|
||||
#include "core/os/thread.h"
|
||||
#include "core/resource.h"
|
||||
|
||||
class ResourceInteractiveLoader : public Reference {
|
||||
|
||||
GDCLASS(ResourceInteractiveLoader, Reference);
|
||||
friend class ResourceLoader;
|
||||
String path_loading;
|
||||
Thread::ID path_loading_thread;
|
||||
|
||||
protected:
|
||||
static void _bind_methods();
|
||||
|
||||
public:
|
||||
virtual void set_local_path(const String &p_local_path) = 0;
|
||||
virtual Ref<Resource> get_resource() = 0;
|
||||
virtual Error poll() = 0;
|
||||
virtual int get_stage() const = 0;
|
||||
virtual int get_stage_count() const = 0;
|
||||
virtual void set_translation_remapped(bool p_remapped) = 0;
|
||||
virtual Error wait();
|
||||
|
||||
ResourceInteractiveLoader() {}
|
||||
~ResourceInteractiveLoader();
|
||||
};
|
||||
|
||||
class ResourceFormatLoader : public Reference {
|
||||
|
||||
GDCLASS(ResourceFormatLoader, Reference);
|
||||
@@ -65,8 +43,7 @@ protected:
|
||||
static void _bind_methods();
|
||||
|
||||
public:
|
||||
virtual Ref<ResourceInteractiveLoader> load_interactive(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
|
||||
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
|
||||
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL, bool p_use_sub_threads = false, float *r_progress = nullptr);
|
||||
virtual bool exists(const String &p_path) const;
|
||||
virtual void get_recognized_extensions(List<String> *p_extensions) const;
|
||||
virtual void get_recognized_extensions_for_type(const String &p_type, List<String> *p_extensions) const;
|
||||
@@ -95,6 +72,15 @@ class ResourceLoader {
|
||||
MAX_LOADERS = 64
|
||||
};
|
||||
|
||||
public:
|
||||
enum ThreadLoadStatus {
|
||||
THREAD_LOAD_INVALID_RESOURCE,
|
||||
THREAD_LOAD_IN_PROGRESS,
|
||||
THREAD_LOAD_FAILED,
|
||||
THREAD_LOAD_LOADED
|
||||
};
|
||||
|
||||
private:
|
||||
static Ref<ResourceFormatLoader> loader[MAX_LOADERS];
|
||||
static int loader_count;
|
||||
static bool timestamp_on_load;
|
||||
@@ -115,34 +101,47 @@ class ResourceLoader {
|
||||
friend class ResourceFormatImporter;
|
||||
friend class ResourceInteractiveLoader;
|
||||
//internal load function
|
||||
static RES _load(const String &p_path, const String &p_original_path, const String &p_type_hint, bool p_no_cache, Error *r_error);
|
||||
static RES _load(const String &p_path, const String &p_original_path, const String &p_type_hint, bool p_no_cache, Error *r_error, bool p_use_sub_threads, float *r_progress);
|
||||
|
||||
static ResourceLoadedCallback _loaded_callback;
|
||||
|
||||
static Ref<ResourceFormatLoader> _find_custom_resource_format_loader(String path);
|
||||
static Mutex loading_map_mutex;
|
||||
|
||||
//used to track paths being loaded in a thread, avoids cyclic recursion
|
||||
struct LoadingMapKey {
|
||||
String path;
|
||||
Thread::ID thread;
|
||||
bool operator==(const LoadingMapKey &p_key) const {
|
||||
return (thread == p_key.thread && path == p_key.path);
|
||||
}
|
||||
};
|
||||
struct LoadingMapKeyHasher {
|
||||
|
||||
static _FORCE_INLINE_ uint32_t hash(const LoadingMapKey &p_key) { return p_key.path.hash() + HashMapHasherDefault::hash(p_key.thread); }
|
||||
struct ThreadLoadTask {
|
||||
Thread *thread = nullptr;
|
||||
Thread::ID loader_id = 0;
|
||||
Semaphore *semaphore = nullptr;
|
||||
String local_path;
|
||||
String remapped_path;
|
||||
String type_hint;
|
||||
float progress = 0.0;
|
||||
ThreadLoadStatus status = THREAD_LOAD_IN_PROGRESS;
|
||||
Error error;
|
||||
RES resource;
|
||||
bool xl_remapped = false;
|
||||
bool use_sub_threads = false;
|
||||
bool start_next = true;
|
||||
int requests = 0;
|
||||
int poll_requests = 0;
|
||||
Set<String> sub_tasks;
|
||||
};
|
||||
|
||||
static HashMap<LoadingMapKey, int, LoadingMapKeyHasher> loading_map;
|
||||
static void _thread_load_function(void *p_userdata);
|
||||
static Mutex *thread_load_mutex;
|
||||
static HashMap<String, ThreadLoadTask> thread_load_tasks;
|
||||
static Semaphore *thread_load_semaphore;
|
||||
static int thread_waiting_count;
|
||||
static int thread_loading_count;
|
||||
static int thread_suspended_count;
|
||||
static int thread_load_max;
|
||||
|
||||
static bool _add_to_loading_map(const String &p_path);
|
||||
static void _remove_from_loading_map(const String &p_path);
|
||||
static void _remove_from_loading_map_and_thread(const String &p_path, Thread::ID p_thread);
|
||||
static float _dependency_get_progress(const String &p_path);
|
||||
|
||||
public:
|
||||
static Ref<ResourceInteractiveLoader> load_interactive(const String &p_path, const String &p_type_hint = "", bool p_no_cache = false, Error *r_error = NULL);
|
||||
static Error load_threaded_request(const String &p_path, const String &p_type_hint = "", bool p_use_sub_threads = false, const String &p_source_resource = String());
|
||||
static ThreadLoadStatus load_threaded_get_status(const String &p_path, float *r_progress = nullptr);
|
||||
static RES load_threaded_get(const String &p_path, Error *r_error = NULL);
|
||||
|
||||
static RES load(const String &p_path, const String &p_type_hint = "", bool p_no_cache = false, Error *r_error = NULL);
|
||||
static bool exists(const String &p_path, const String &p_type_hint = "");
|
||||
|
||||
|
||||
@@ -176,7 +176,7 @@ RES TranslationLoaderPO::load_translation(FileAccess *f, Error *r_error, const S
|
||||
return translation;
|
||||
}
|
||||
|
||||
RES TranslationLoaderPO::load(const String &p_path, const String &p_original_path, Error *r_error) {
|
||||
RES TranslationLoaderPO::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress) {
|
||||
|
||||
if (r_error)
|
||||
*r_error = ERR_CANT_OPEN;
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
class TranslationLoaderPO : public ResourceFormatLoader {
|
||||
public:
|
||||
static RES load_translation(FileAccess *f, Error *r_error, const String &p_path = String());
|
||||
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
|
||||
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL, bool p_use_sub_threads = false, float *r_progress = nullptr);
|
||||
virtual void get_recognized_extensions(List<String> *p_extensions) const;
|
||||
virtual bool handles_type(const String &p_type) const;
|
||||
virtual String get_resource_type(const String &p_path) const;
|
||||
|
||||
@@ -126,6 +126,7 @@ enum PropertyUsageFlags {
|
||||
PROPERTY_USAGE_NODE_PATH_FROM_SCENE_ROOT = 1 << 23,
|
||||
PROPERTY_USAGE_RESOURCE_NOT_PERSISTENT = 1 << 24,
|
||||
PROPERTY_USAGE_KEYING_INCREMENTS = 1 << 25, // Used in inspector to increment property when keyed in animation player
|
||||
PROPERTY_USAGE_DEFERRED_SET_RESOURCE = 1 << 26, // when loading, the resource for this property can be set at the end of loading
|
||||
|
||||
PROPERTY_USAGE_DEFAULT = PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_NETWORK,
|
||||
PROPERTY_USAGE_DEFAULT_INTL = PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_NETWORK | PROPERTY_USAGE_INTERNATIONALIZED,
|
||||
|
||||
@@ -186,8 +186,6 @@ void register_core_types() {
|
||||
ClassDB::register_class<HTTPClient>();
|
||||
ClassDB::register_class<TriangleMesh>();
|
||||
|
||||
ClassDB::register_virtual_class<ResourceInteractiveLoader>();
|
||||
|
||||
ClassDB::register_class<ResourceFormatLoader>();
|
||||
ClassDB::register_class<ResourceFormatSaver>();
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
|
||||
#include <string.h>
|
||||
|
||||
RES ResourceFormatDummyTexture::load(const String &p_path, const String &p_original_path, Error *r_error) {
|
||||
RES ResourceFormatDummyTexture::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress) {
|
||||
unsigned int width = 8;
|
||||
unsigned int height = 8;
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
|
||||
class ResourceFormatDummyTexture : public ResourceFormatLoader {
|
||||
public:
|
||||
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
|
||||
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL, bool p_use_sub_threads = false, float *r_progress = nullptr);
|
||||
virtual void get_recognized_extensions(List<String> *p_extensions) const;
|
||||
virtual bool handles_type(const String &p_type) const;
|
||||
virtual String get_resource_type(const String &p_path) const;
|
||||
|
||||
@@ -94,7 +94,7 @@ static const DDSFormatInfo dds_format_info[DDS_MAX] = {
|
||||
{ "GRAYSCALE_ALPHA", false, false, 1, 2, Image::FORMAT_LA8 }
|
||||
};
|
||||
|
||||
RES ResourceFormatDDS::load(const String &p_path, const String &p_original_path, Error *r_error) {
|
||||
RES ResourceFormatDDS::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress) {
|
||||
|
||||
if (r_error)
|
||||
*r_error = ERR_CANT_OPEN;
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
|
||||
class ResourceFormatDDS : public ResourceFormatLoader {
|
||||
public:
|
||||
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
|
||||
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL, bool p_use_sub_threads = false, float *r_progress = nullptr);
|
||||
virtual void get_recognized_extensions(List<String> *p_extensions) const;
|
||||
virtual bool handles_type(const String &p_type) const;
|
||||
virtual String get_resource_type(const String &p_path) const;
|
||||
|
||||
@@ -42,7 +42,7 @@ struct ETC1Header {
|
||||
uint16_t origHeight;
|
||||
};
|
||||
|
||||
RES ResourceFormatPKM::load(const String &p_path, const String &p_original_path, Error *r_error) {
|
||||
RES ResourceFormatPKM::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress) {
|
||||
|
||||
if (r_error)
|
||||
*r_error = ERR_CANT_OPEN;
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
|
||||
class ResourceFormatPKM : public ResourceFormatLoader {
|
||||
public:
|
||||
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
|
||||
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL, bool p_use_sub_threads = false, float *r_progress = nullptr);
|
||||
virtual void get_recognized_extensions(List<String> *p_extensions) const;
|
||||
virtual bool handles_type(const String &p_type) const;
|
||||
virtual String get_resource_type(const String &p_path) const;
|
||||
|
||||
@@ -493,7 +493,7 @@ Error GDNative::get_symbol(StringName p_procedure_name, void *&r_handle, bool p_
|
||||
return result;
|
||||
}
|
||||
|
||||
RES GDNativeLibraryResourceLoader::load(const String &p_path, const String &p_original_path, Error *r_error) {
|
||||
RES GDNativeLibraryResourceLoader::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress) {
|
||||
Ref<GDNativeLibrary> lib;
|
||||
lib.instance();
|
||||
|
||||
|
||||
@@ -166,7 +166,7 @@ public:
|
||||
|
||||
class GDNativeLibraryResourceLoader : public ResourceFormatLoader {
|
||||
public:
|
||||
virtual RES load(const String &p_path, const String &p_original_path, Error *r_error);
|
||||
virtual RES load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads = false, float *r_progress = nullptr);
|
||||
virtual void get_recognized_extensions(List<String> *p_extensions) const;
|
||||
virtual bool handles_type(const String &p_type) const;
|
||||
virtual String get_resource_type(const String &p_path) const;
|
||||
|
||||
@@ -1931,7 +1931,7 @@ void NativeReloadNode::_notification(int p_what) {
|
||||
#endif
|
||||
}
|
||||
|
||||
RES ResourceFormatLoaderNativeScript::load(const String &p_path, const String &p_original_path, Error *r_error) {
|
||||
RES ResourceFormatLoaderNativeScript::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress) {
|
||||
return ResourceFormatLoaderText::singleton->load(p_path, p_original_path, r_error);
|
||||
}
|
||||
|
||||
|
||||
@@ -406,7 +406,7 @@ public:
|
||||
|
||||
class ResourceFormatLoaderNativeScript : public ResourceFormatLoader {
|
||||
public:
|
||||
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
|
||||
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL, bool p_use_sub_threads = false, float *r_progress = nullptr);
|
||||
virtual void get_recognized_extensions(List<String> *p_extensions) const;
|
||||
virtual bool handles_type(const String &p_type) const;
|
||||
virtual String get_resource_type(const String &p_path) const;
|
||||
|
||||
@@ -39,7 +39,7 @@ ResourceFormatLoaderPluginScript::ResourceFormatLoaderPluginScript(PluginScriptL
|
||||
_language = language;
|
||||
}
|
||||
|
||||
RES ResourceFormatLoaderPluginScript::load(const String &p_path, const String &p_original_path, Error *r_error) {
|
||||
RES ResourceFormatLoaderPluginScript::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress) {
|
||||
if (r_error)
|
||||
*r_error = ERR_FILE_CANT_OPEN;
|
||||
|
||||
|
||||
@@ -44,7 +44,7 @@ class ResourceFormatLoaderPluginScript : public ResourceFormatLoader {
|
||||
|
||||
public:
|
||||
ResourceFormatLoaderPluginScript(PluginScriptLanguage *language);
|
||||
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
|
||||
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL, bool p_use_sub_threads = false, float *r_progress = nullptr);
|
||||
virtual void get_recognized_extensions(List<String> *p_extensions) const;
|
||||
virtual bool handles_type(const String &p_type) const;
|
||||
virtual String get_resource_type(const String &p_path) const;
|
||||
|
||||
@@ -373,7 +373,7 @@ void VideoStreamGDNative::set_audio_track(int p_track) {
|
||||
|
||||
/* --- NOTE ResourceFormatLoaderVideoStreamGDNative starts here. ----- */
|
||||
|
||||
RES ResourceFormatLoaderVideoStreamGDNative::load(const String &p_path, const String &p_original_path, Error *r_error) {
|
||||
RES ResourceFormatLoaderVideoStreamGDNative::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress) {
|
||||
FileAccess *f = FileAccess::open(p_path, FileAccess::READ);
|
||||
if (!f) {
|
||||
if (r_error) {
|
||||
|
||||
@@ -199,7 +199,7 @@ public:
|
||||
|
||||
class ResourceFormatLoaderVideoStreamGDNative : public ResourceFormatLoader {
|
||||
public:
|
||||
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
|
||||
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL, bool p_use_sub_threads = false, float *r_progress = nullptr);
|
||||
virtual void get_recognized_extensions(List<String> *p_extensions) const;
|
||||
virtual bool handles_type(const String &p_type) const;
|
||||
virtual String get_resource_type(const String &p_path) const;
|
||||
|
||||
@@ -2251,7 +2251,7 @@ Ref<GDScript> GDScriptLanguage::get_orphan_subclass(const String &p_qualified_na
|
||||
|
||||
/*************** RESOURCE ***************/
|
||||
|
||||
RES ResourceFormatLoaderGDScript::load(const String &p_path, const String &p_original_path, Error *r_error) {
|
||||
RES ResourceFormatLoaderGDScript::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress) {
|
||||
|
||||
if (r_error)
|
||||
*r_error = ERR_FILE_CANT_OPEN;
|
||||
|
||||
@@ -542,7 +542,7 @@ public:
|
||||
|
||||
class ResourceFormatLoaderGDScript : public ResourceFormatLoader {
|
||||
public:
|
||||
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
|
||||
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL, bool p_use_sub_threads = false, float *r_progress = nullptr);
|
||||
virtual void get_recognized_extensions(List<String> *p_extensions) const;
|
||||
virtual bool handles_type(const String &p_type) const;
|
||||
virtual String get_resource_type(const String &p_path) const;
|
||||
|
||||
@@ -3451,7 +3451,7 @@ CSharpScript::~CSharpScript() {
|
||||
|
||||
/*************** RESOURCE ***************/
|
||||
|
||||
RES ResourceFormatLoaderCSharpScript::load(const String &p_path, const String &p_original_path, Error *r_error) {
|
||||
RES ResourceFormatLoaderCSharpScript::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress) {
|
||||
|
||||
if (r_error)
|
||||
*r_error = ERR_FILE_CANT_OPEN;
|
||||
|
||||
@@ -497,7 +497,7 @@ public:
|
||||
|
||||
class ResourceFormatLoaderCSharpScript : public ResourceFormatLoader {
|
||||
public:
|
||||
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
|
||||
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL, bool p_use_sub_threads = false, float *r_progress = nullptr);
|
||||
virtual void get_recognized_extensions(List<String> *p_extensions) const;
|
||||
virtual bool handles_type(const String &p_type) const;
|
||||
virtual String get_resource_type(const String &p_path) const;
|
||||
|
||||
@@ -354,7 +354,7 @@ AudioStreamPlaybackOpus::~AudioStreamPlaybackOpus() {
|
||||
_clear_stream();
|
||||
}
|
||||
|
||||
RES ResourceFormatLoaderAudioStreamOpus::load(const String &p_path, const String &p_original_path, Error *r_error) {
|
||||
RES ResourceFormatLoaderAudioStreamOpus::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress) {
|
||||
if (r_error)
|
||||
*r_error = OK;
|
||||
|
||||
|
||||
@@ -133,7 +133,7 @@ public:
|
||||
|
||||
class ResourceFormatLoaderAudioStreamOpus : public ResourceFormatLoader {
|
||||
public:
|
||||
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
|
||||
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL, bool p_use_sub_threads = false, float *r_progress = nullptr);
|
||||
virtual void get_recognized_extensions(List<String> *p_extensions) const;
|
||||
virtual bool handles_type(const String &p_type) const;
|
||||
virtual String get_resource_type(const String &p_path) const;
|
||||
|
||||
@@ -51,7 +51,7 @@ enum PVRFLags {
|
||||
|
||||
};
|
||||
|
||||
RES ResourceFormatPVR::load(const String &p_path, const String &p_original_path, Error *r_error) {
|
||||
RES ResourceFormatPVR::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress) {
|
||||
|
||||
if (r_error)
|
||||
*r_error = ERR_CANT_OPEN;
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
|
||||
class ResourceFormatPVR : public ResourceFormatLoader {
|
||||
public:
|
||||
virtual RES load(const String &p_path, const String &p_original_path, Error *r_error = NULL);
|
||||
virtual RES load(const String &p_path, const String &p_original_path, Error *r_error = NULL, bool p_use_sub_threads = false, float *r_progress = nullptr);
|
||||
virtual void get_recognized_extensions(List<String> *p_extensions) const;
|
||||
virtual bool handles_type(const String &p_type) const;
|
||||
virtual String get_resource_type(const String &p_path) const;
|
||||
|
||||
@@ -725,7 +725,7 @@ void VideoStreamTheora::_bind_methods() {
|
||||
|
||||
////////////
|
||||
|
||||
RES ResourceFormatLoaderTheora::load(const String &p_path, const String &p_original_path, Error *r_error) {
|
||||
RES ResourceFormatLoaderTheora::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress) {
|
||||
|
||||
FileAccess *f = FileAccess::open(p_path, FileAccess::READ);
|
||||
if (!f) {
|
||||
|
||||
@@ -187,7 +187,7 @@ public:
|
||||
|
||||
class ResourceFormatLoaderTheora : public ResourceFormatLoader {
|
||||
public:
|
||||
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
|
||||
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL, bool p_use_sub_threads = false, float *r_progress = nullptr);
|
||||
virtual void get_recognized_extensions(List<String> *p_extensions) const;
|
||||
virtual bool handles_type(const String &p_type) const;
|
||||
virtual String get_resource_type(const String &p_path) const;
|
||||
|
||||
@@ -381,7 +381,7 @@ AudioStreamPlaybackOGGVorbis::~AudioStreamPlaybackOGGVorbis() {
|
||||
_clear_stream();
|
||||
}
|
||||
|
||||
RES ResourceFormatLoaderAudioStreamOGGVorbis::load(const String &p_path, const String &p_original_path, Error *r_error) {
|
||||
RES ResourceFormatLoaderAudioStreamOGGVorbis::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress) {
|
||||
if (r_error)
|
||||
*r_error = OK;
|
||||
|
||||
|
||||
@@ -128,7 +128,7 @@ public:
|
||||
|
||||
class ResourceFormatLoaderAudioStreamOGGVorbis : public ResourceFormatLoader {
|
||||
public:
|
||||
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
|
||||
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL, bool p_use_sub_threads = false, float *r_progress = nullptr);
|
||||
virtual void get_recognized_extensions(List<String> *p_extensions) const;
|
||||
virtual bool handles_type(const String &p_type) const;
|
||||
virtual String get_resource_type(const String &p_path) const;
|
||||
|
||||
@@ -474,7 +474,7 @@ void VideoStreamWebm::set_audio_track(int p_track) {
|
||||
|
||||
////////////
|
||||
|
||||
RES ResourceFormatLoaderWebm::load(const String &p_path, const String &p_original_path, Error *r_error) {
|
||||
RES ResourceFormatLoaderWebm::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress) {
|
||||
|
||||
FileAccess *f = FileAccess::open(p_path, FileAccess::READ);
|
||||
if (!f) {
|
||||
|
||||
@@ -128,7 +128,7 @@ public:
|
||||
|
||||
class ResourceFormatLoaderWebm : public ResourceFormatLoader {
|
||||
public:
|
||||
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
|
||||
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL, bool p_use_sub_threads = false, float *r_progress = nullptr);
|
||||
virtual void get_recognized_extensions(List<String> *p_extensions) const;
|
||||
virtual bool handles_type(const String &p_type) const;
|
||||
virtual String get_resource_type(const String &p_path) const;
|
||||
|
||||
@@ -101,7 +101,7 @@ void MeshInstance::_get_property_list(List<PropertyInfo> *p_list) const {
|
||||
|
||||
if (mesh.is_valid()) {
|
||||
for (int i = 0; i < mesh->get_surface_count(); i++) {
|
||||
p_list->push_back(PropertyInfo(Variant::OBJECT, "material/" + itos(i), PROPERTY_HINT_RESOURCE_TYPE, "ShaderMaterial,StandardMaterial3D"));
|
||||
p_list->push_back(PropertyInfo(Variant::OBJECT, "material/" + itos(i), PROPERTY_HINT_RESOURCE_TYPE, "ShaderMaterial,StandardMaterial3D", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_DEFERRED_SET_RESOURCE));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -294,7 +294,7 @@ void GeometryInstance::_bind_methods() {
|
||||
ClassDB::bind_method(D_METHOD("get_aabb"), &GeometryInstance::get_aabb);
|
||||
|
||||
ADD_GROUP("Geometry", "");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "material_override", PROPERTY_HINT_RESOURCE_TYPE, "ShaderMaterial,StandardMaterial3D"), "set_material_override", "get_material_override");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "material_override", PROPERTY_HINT_RESOURCE_TYPE, "ShaderMaterial,StandardMaterial3D", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_DEFERRED_SET_RESOURCE), "set_material_override", "get_material_override");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "cast_shadow", PROPERTY_HINT_ENUM, "Off,On,Double-Sided,Shadows Only"), "set_cast_shadows_setting", "get_cast_shadows_setting");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "extra_cull_margin", PROPERTY_HINT_RANGE, "0,16384,0.01"), "set_extra_cull_margin", "get_extra_cull_margin");
|
||||
ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "use_in_baked_light"), "set_flag", "get_flag", FLAG_USE_BAKED_LIGHT);
|
||||
|
||||
@@ -1063,7 +1063,7 @@ void DynamicFont::update_oversampling() {
|
||||
|
||||
/////////////////////////
|
||||
|
||||
RES ResourceFormatLoaderDynamicFont::load(const String &p_path, const String &p_original_path, Error *r_error) {
|
||||
RES ResourceFormatLoaderDynamicFont::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress) {
|
||||
|
||||
if (r_error)
|
||||
*r_error = ERR_FILE_CANT_OPEN;
|
||||
|
||||
@@ -302,7 +302,7 @@ VARIANT_ENUM_CAST(DynamicFont::SpacingType);
|
||||
|
||||
class ResourceFormatLoaderDynamicFont : public ResourceFormatLoader {
|
||||
public:
|
||||
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
|
||||
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL, bool p_use_sub_threads = false, float *r_progress = nullptr);
|
||||
virtual void get_recognized_extensions(List<String> *p_extensions) const;
|
||||
virtual bool handles_type(const String &p_type) const;
|
||||
virtual String get_resource_type(const String &p_path) const;
|
||||
|
||||
@@ -646,7 +646,7 @@ BitmapFont::~BitmapFont() {
|
||||
|
||||
////////////
|
||||
|
||||
RES ResourceFormatLoaderBMFont::load(const String &p_path, const String &p_original_path, Error *r_error) {
|
||||
RES ResourceFormatLoaderBMFont::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress) {
|
||||
|
||||
if (r_error)
|
||||
*r_error = ERR_FILE_CANT_OPEN;
|
||||
|
||||
@@ -200,7 +200,7 @@ public:
|
||||
|
||||
class ResourceFormatLoaderBMFont : public ResourceFormatLoader {
|
||||
public:
|
||||
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
|
||||
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL, bool p_use_sub_threads = false, float *r_progress = nullptr);
|
||||
virtual void get_recognized_extensions(List<String> *p_extensions) const;
|
||||
virtual bool handles_type(const String &p_type) const;
|
||||
virtual String get_resource_type(const String &p_path) const;
|
||||
|
||||
@@ -1004,7 +1004,6 @@ void ArrayMesh::_set_surfaces(const Array &p_surfaces) {
|
||||
} else {
|
||||
// if mesh does not exist (first time this is loaded, most likely),
|
||||
// we can create it with a single call, which is a lot more efficient and thread friendly
|
||||
print_line("create mesh from surfaces: " + itos(surface_data.size()));
|
||||
mesh = VS::get_singleton()->mesh_create_from_surfaces(surface_data);
|
||||
VS::get_singleton()->mesh_set_blend_shape_mode(mesh, (VS::BlendShapeMode)blend_shape_mode);
|
||||
}
|
||||
|
||||
@@ -45,17 +45,17 @@
|
||||
|
||||
///
|
||||
|
||||
void ResourceInteractiveLoaderText::set_local_path(const String &p_local_path) {
|
||||
void ResourceLoaderText::set_local_path(const String &p_local_path) {
|
||||
|
||||
res_path = p_local_path;
|
||||
}
|
||||
|
||||
Ref<Resource> ResourceInteractiveLoaderText::get_resource() {
|
||||
Ref<Resource> ResourceLoaderText::get_resource() {
|
||||
|
||||
return resource;
|
||||
}
|
||||
|
||||
Error ResourceInteractiveLoaderText::_parse_sub_resource_dummy(DummyReadData *p_data, VariantParser::Stream *p_stream, Ref<Resource> &r_res, int &line, String &r_err_str) {
|
||||
Error ResourceLoaderText::_parse_sub_resource_dummy(DummyReadData *p_data, VariantParser::Stream *p_stream, Ref<Resource> &r_res, int &line, String &r_err_str) {
|
||||
|
||||
VariantParser::Token token;
|
||||
VariantParser::get_token(p_stream, token, line, r_err_str);
|
||||
@@ -85,7 +85,7 @@ Error ResourceInteractiveLoaderText::_parse_sub_resource_dummy(DummyReadData *p_
|
||||
return OK;
|
||||
}
|
||||
|
||||
Error ResourceInteractiveLoaderText::_parse_ext_resource_dummy(DummyReadData *p_data, VariantParser::Stream *p_stream, Ref<Resource> &r_res, int &line, String &r_err_str) {
|
||||
Error ResourceLoaderText::_parse_ext_resource_dummy(DummyReadData *p_data, VariantParser::Stream *p_stream, Ref<Resource> &r_res, int &line, String &r_err_str) {
|
||||
|
||||
VariantParser::Token token;
|
||||
VariantParser::get_token(p_stream, token, line, r_err_str);
|
||||
@@ -109,7 +109,7 @@ Error ResourceInteractiveLoaderText::_parse_ext_resource_dummy(DummyReadData *p_
|
||||
return OK;
|
||||
}
|
||||
|
||||
Error ResourceInteractiveLoaderText::_parse_sub_resource(VariantParser::Stream *p_stream, Ref<Resource> &r_res, int &line, String &r_err_str) {
|
||||
Error ResourceLoaderText::_parse_sub_resource(VariantParser::Stream *p_stream, Ref<Resource> &r_res, int &line, String &r_err_str) {
|
||||
|
||||
VariantParser::Token token;
|
||||
VariantParser::get_token(p_stream, token, line, r_err_str);
|
||||
@@ -143,7 +143,7 @@ Error ResourceInteractiveLoaderText::_parse_sub_resource(VariantParser::Stream *
|
||||
return OK;
|
||||
}
|
||||
|
||||
Error ResourceInteractiveLoaderText::_parse_ext_resource(VariantParser::Stream *p_stream, Ref<Resource> &r_res, int &line, String &r_err_str) {
|
||||
Error ResourceLoaderText::_parse_ext_resource(VariantParser::Stream *p_stream, Ref<Resource> &r_res, int &line, String &r_err_str) {
|
||||
|
||||
VariantParser::Token token;
|
||||
VariantParser::get_token(p_stream, token, line, r_err_str);
|
||||
@@ -164,15 +164,30 @@ Error ResourceInteractiveLoaderText::_parse_ext_resource(VariantParser::Stream *
|
||||
String path = ext_resources[id].path;
|
||||
String type = ext_resources[id].type;
|
||||
|
||||
if (path.find("://") == -1 && path.is_rel_path()) {
|
||||
// path is relative to file being loaded, so convert to a resource path
|
||||
path = ProjectSettings::get_singleton()->localize_path(res_path.get_base_dir().plus_file(path));
|
||||
}
|
||||
if (ext_resources[id].cache.is_valid()) {
|
||||
r_res = ext_resources[id].cache;
|
||||
} else if (use_sub_threads) {
|
||||
|
||||
r_res = ResourceLoader::load(path, type);
|
||||
RES res = ResourceLoader::load_threaded_get(path);
|
||||
if (res.is_null()) {
|
||||
|
||||
if (r_res.is_null()) {
|
||||
WARN_PRINT(String("Couldn't load external resource: " + path).utf8().get_data());
|
||||
if (ResourceLoader::get_abort_on_missing_resources()) {
|
||||
error = ERR_FILE_CORRUPT;
|
||||
error_text = "[ext_resource] referenced nonexistent resource at: " + path;
|
||||
_printerr();
|
||||
return error;
|
||||
} else {
|
||||
ResourceLoader::notify_dependency_error(local_path, path, type);
|
||||
}
|
||||
} else {
|
||||
ext_resources[id].cache = res;
|
||||
r_res = res;
|
||||
}
|
||||
} else {
|
||||
error = ERR_FILE_CORRUPT;
|
||||
error_text = "[ext_resource] referenced non-loaded resource at: " + path;
|
||||
_printerr();
|
||||
return error;
|
||||
}
|
||||
} else {
|
||||
r_res = RES();
|
||||
@@ -187,7 +202,7 @@ Error ResourceInteractiveLoaderText::_parse_ext_resource(VariantParser::Stream *
|
||||
return OK;
|
||||
}
|
||||
|
||||
Ref<PackedScene> ResourceInteractiveLoaderText::_parse_node_tag(VariantParser::ResourceParser &parser) {
|
||||
Ref<PackedScene> ResourceLoaderText::_parse_node_tag(VariantParser::ResourceParser &parser) {
|
||||
Ref<PackedScene> packed_scene;
|
||||
packed_scene.instance();
|
||||
|
||||
@@ -321,7 +336,7 @@ Ref<PackedScene> ResourceInteractiveLoaderText::_parse_node_tag(VariantParser::R
|
||||
NodePath to = next_tag.fields["to"];
|
||||
StringName method = next_tag.fields["method"];
|
||||
StringName signal = next_tag.fields["signal"];
|
||||
int flags = CONNECT_PERSIST;
|
||||
int flags = Object::CONNECT_PERSIST;
|
||||
Array binds;
|
||||
|
||||
if (next_tag.fields.has("flags")) {
|
||||
@@ -389,12 +404,15 @@ Ref<PackedScene> ResourceInteractiveLoaderText::_parse_node_tag(VariantParser::R
|
||||
return packed_scene;
|
||||
}
|
||||
|
||||
Error ResourceInteractiveLoaderText::poll() {
|
||||
Error ResourceLoaderText::load() {
|
||||
|
||||
if (error != OK)
|
||||
return error;
|
||||
|
||||
if (next_tag.name == "ext_resource") {
|
||||
while (true) {
|
||||
if (next_tag.name != "ext_resource") {
|
||||
break;
|
||||
}
|
||||
|
||||
if (!next_tag.fields.has("path")) {
|
||||
error = ERR_FILE_CORRUPT;
|
||||
@@ -430,30 +448,49 @@ Error ResourceInteractiveLoaderText::poll() {
|
||||
path = remaps[path];
|
||||
}
|
||||
|
||||
RES res = ResourceLoader::load(path, type);
|
||||
|
||||
if (res.is_null()) {
|
||||
|
||||
if (ResourceLoader::get_abort_on_missing_resources()) {
|
||||
error = ERR_FILE_CORRUPT;
|
||||
error_text = "[ext_resource] referenced nonexistent resource at: " + path;
|
||||
_printerr();
|
||||
return error;
|
||||
} else {
|
||||
ResourceLoader::notify_dependency_error(local_path, path, type);
|
||||
}
|
||||
} else {
|
||||
|
||||
resource_cache.push_back(res);
|
||||
#ifdef TOOLS_ENABLED
|
||||
//remember ID for saving
|
||||
res->set_id_for_path(local_path, index);
|
||||
#endif
|
||||
}
|
||||
|
||||
ExtResource er;
|
||||
er.path = path;
|
||||
er.type = type;
|
||||
|
||||
if (use_sub_threads) {
|
||||
|
||||
Error err = ResourceLoader::load_threaded_request(path, type, use_sub_threads, local_path);
|
||||
|
||||
if (err != OK) {
|
||||
if (ResourceLoader::get_abort_on_missing_resources()) {
|
||||
error = ERR_FILE_CORRUPT;
|
||||
error_text = "[ext_resource] referenced broken resource at: " + path;
|
||||
_printerr();
|
||||
return error;
|
||||
} else {
|
||||
ResourceLoader::notify_dependency_error(local_path, path, type);
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
RES res = ResourceLoader::load(path, type);
|
||||
|
||||
if (res.is_null()) {
|
||||
|
||||
if (ResourceLoader::get_abort_on_missing_resources()) {
|
||||
error = ERR_FILE_CORRUPT;
|
||||
error_text = "[ext_resource] referenced nonexistent resource at: " + path;
|
||||
_printerr();
|
||||
return error;
|
||||
} else {
|
||||
ResourceLoader::notify_dependency_error(local_path, path, type);
|
||||
}
|
||||
} else {
|
||||
|
||||
#ifdef TOOLS_ENABLED
|
||||
//remember ID for saving
|
||||
res->set_id_for_path(local_path, index);
|
||||
#endif
|
||||
}
|
||||
|
||||
er.cache = res;
|
||||
}
|
||||
|
||||
ext_resources[index] = er;
|
||||
|
||||
error = VariantParser::parse_tag(&stream, lines, error_text, next_tag, &rp);
|
||||
@@ -463,9 +500,16 @@ Error ResourceInteractiveLoaderText::poll() {
|
||||
}
|
||||
|
||||
resource_current++;
|
||||
return error;
|
||||
}
|
||||
|
||||
} else if (next_tag.name == "sub_resource") {
|
||||
//these are the ones that count
|
||||
resources_total -= resource_current;
|
||||
resource_current = 0;
|
||||
|
||||
while (true) {
|
||||
if (next_tag.name != "sub_resource") {
|
||||
break;
|
||||
}
|
||||
|
||||
if (!next_tag.fields.has("type")) {
|
||||
error = ERR_FILE_CORRUPT;
|
||||
@@ -546,9 +590,15 @@ Error ResourceInteractiveLoaderText::poll() {
|
||||
}
|
||||
}
|
||||
|
||||
return OK;
|
||||
if (progress) {
|
||||
*progress = resource_current / float(resources_total);
|
||||
}
|
||||
}
|
||||
|
||||
} else if (next_tag.name == "resource") {
|
||||
while (true) {
|
||||
if (next_tag.name != "resource") {
|
||||
break;
|
||||
}
|
||||
|
||||
if (is_scene) {
|
||||
|
||||
@@ -609,14 +659,23 @@ Error ResourceInteractiveLoaderText::poll() {
|
||||
_printerr();
|
||||
return error;
|
||||
} else {
|
||||
error = ERR_FILE_EOF;
|
||||
error = OK;
|
||||
if (progress) {
|
||||
*progress = resource_current / float(resources_total);
|
||||
}
|
||||
|
||||
return error;
|
||||
}
|
||||
}
|
||||
|
||||
return OK;
|
||||
if (progress) {
|
||||
*progress = resource_current / float(resources_total);
|
||||
}
|
||||
}
|
||||
|
||||
} else if (next_tag.name == "node") {
|
||||
//for scene files
|
||||
|
||||
if (next_tag.name == "node") {
|
||||
|
||||
if (!is_scene) {
|
||||
|
||||
@@ -631,49 +690,54 @@ Error ResourceInteractiveLoaderText::poll() {
|
||||
if (!packed_scene.is_valid())
|
||||
return error;
|
||||
|
||||
error = ERR_FILE_EOF;
|
||||
error = OK;
|
||||
//get it here
|
||||
resource = packed_scene;
|
||||
if (!ResourceCache::has(res_path)) {
|
||||
packed_scene->set_path(res_path);
|
||||
}
|
||||
|
||||
return error;
|
||||
resource_current++;
|
||||
|
||||
if (progress) {
|
||||
*progress = resource_current / float(resources_total);
|
||||
}
|
||||
|
||||
return error;
|
||||
} else {
|
||||
error_text += "Unknown tag in file: " + next_tag.name;
|
||||
_printerr();
|
||||
error = ERR_FILE_CORRUPT;
|
||||
return error;
|
||||
}
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
int ResourceInteractiveLoaderText::get_stage() const {
|
||||
int ResourceLoaderText::get_stage() const {
|
||||
|
||||
return resource_current;
|
||||
}
|
||||
int ResourceInteractiveLoaderText::get_stage_count() const {
|
||||
int ResourceLoaderText::get_stage_count() const {
|
||||
|
||||
return resources_total; //+ext_resources;
|
||||
}
|
||||
|
||||
void ResourceInteractiveLoaderText::set_translation_remapped(bool p_remapped) {
|
||||
void ResourceLoaderText::set_translation_remapped(bool p_remapped) {
|
||||
|
||||
translation_remapped = p_remapped;
|
||||
}
|
||||
|
||||
ResourceInteractiveLoaderText::ResourceInteractiveLoaderText() {
|
||||
ResourceLoaderText::ResourceLoaderText() {
|
||||
progress = nullptr;
|
||||
translation_remapped = false;
|
||||
use_sub_threads = false;
|
||||
}
|
||||
|
||||
ResourceInteractiveLoaderText::~ResourceInteractiveLoaderText() {
|
||||
ResourceLoaderText::~ResourceLoaderText() {
|
||||
|
||||
memdelete(f);
|
||||
}
|
||||
|
||||
void ResourceInteractiveLoaderText::get_dependencies(FileAccess *p_f, List<String> *p_dependencies, bool p_add_types) {
|
||||
void ResourceLoaderText::get_dependencies(FileAccess *p_f, List<String> *p_dependencies, bool p_add_types) {
|
||||
|
||||
open(p_f);
|
||||
ignore_resource_parsing = true;
|
||||
@@ -720,7 +784,7 @@ void ResourceInteractiveLoaderText::get_dependencies(FileAccess *p_f, List<Strin
|
||||
}
|
||||
}
|
||||
|
||||
Error ResourceInteractiveLoaderText::rename_dependencies(FileAccess *p_f, const String &p_path, const Map<String, String> &p_map) {
|
||||
Error ResourceLoaderText::rename_dependencies(FileAccess *p_f, const String &p_path, const Map<String, String> &p_map) {
|
||||
|
||||
open(p_f, true);
|
||||
ERR_FAIL_COND_V(error != OK, error);
|
||||
@@ -822,7 +886,7 @@ Error ResourceInteractiveLoaderText::rename_dependencies(FileAccess *p_f, const
|
||||
return OK;
|
||||
}
|
||||
|
||||
void ResourceInteractiveLoaderText::open(FileAccess *p_f, bool p_skip_first_tag) {
|
||||
void ResourceLoaderText::open(FileAccess *p_f, bool p_skip_first_tag) {
|
||||
|
||||
error = OK;
|
||||
|
||||
@@ -908,7 +972,7 @@ static void bs_save_unicode_string(FileAccess *f, const String &p_string, bool p
|
||||
f->store_buffer((const uint8_t *)utf8.get_data(), utf8.length() + 1);
|
||||
}
|
||||
|
||||
Error ResourceInteractiveLoaderText::save_as_binary(FileAccess *p_f, const String &p_path) {
|
||||
Error ResourceLoaderText::save_as_binary(FileAccess *p_f, const String &p_path) {
|
||||
|
||||
if (error)
|
||||
return error;
|
||||
@@ -1172,7 +1236,7 @@ Error ResourceInteractiveLoaderText::save_as_binary(FileAccess *p_f, const Strin
|
||||
return OK;
|
||||
}
|
||||
|
||||
String ResourceInteractiveLoaderText::recognize(FileAccess *p_f) {
|
||||
String ResourceLoaderText::recognize(FileAccess *p_f) {
|
||||
|
||||
error = OK;
|
||||
|
||||
@@ -1217,24 +1281,34 @@ String ResourceInteractiveLoaderText::recognize(FileAccess *p_f) {
|
||||
|
||||
/////////////////////
|
||||
|
||||
Ref<ResourceInteractiveLoader> ResourceFormatLoaderText::load_interactive(const String &p_path, const String &p_original_path, Error *r_error) {
|
||||
RES ResourceFormatLoaderText::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress) {
|
||||
|
||||
if (r_error)
|
||||
*r_error = ERR_CANT_OPEN;
|
||||
|
||||
Error err;
|
||||
|
||||
FileAccess *f = FileAccess::open(p_path, FileAccess::READ, &err);
|
||||
|
||||
ERR_FAIL_COND_V_MSG(err != OK, Ref<ResourceInteractiveLoader>(), "Cannot open file '" + p_path + "'.");
|
||||
ERR_FAIL_COND_V_MSG(err != OK, RES(), "Cannot open file '" + p_path + "'.");
|
||||
|
||||
Ref<ResourceInteractiveLoaderText> ria = memnew(ResourceInteractiveLoaderText);
|
||||
ResourceLoaderText loader;
|
||||
String path = p_original_path != "" ? p_original_path : p_path;
|
||||
ria->local_path = ProjectSettings::get_singleton()->localize_path(path);
|
||||
ria->res_path = ria->local_path;
|
||||
//ria->set_local_path( ProjectSettings::get_singleton()->localize_path(p_path) );
|
||||
ria->open(f);
|
||||
|
||||
return ria;
|
||||
loader.use_sub_threads = p_use_sub_threads;
|
||||
loader.local_path = ProjectSettings::get_singleton()->localize_path(path);
|
||||
loader.progress = r_progress;
|
||||
loader.res_path = loader.local_path;
|
||||
//loader.set_local_path( ProjectSettings::get_singleton()->localize_path(p_path) );
|
||||
loader.open(f);
|
||||
err = loader.load();
|
||||
if (r_error) {
|
||||
*r_error = err;
|
||||
}
|
||||
if (err == OK) {
|
||||
return loader.get_resource();
|
||||
} else {
|
||||
return RES();
|
||||
}
|
||||
}
|
||||
|
||||
void ResourceFormatLoaderText::get_recognized_extensions_for_type(const String &p_type, List<String> *p_extensions) const {
|
||||
@@ -1276,11 +1350,11 @@ String ResourceFormatLoaderText::get_resource_type(const String &p_path) const {
|
||||
return ""; //could not rwead
|
||||
}
|
||||
|
||||
Ref<ResourceInteractiveLoaderText> ria = memnew(ResourceInteractiveLoaderText);
|
||||
ria->local_path = ProjectSettings::get_singleton()->localize_path(p_path);
|
||||
ria->res_path = ria->local_path;
|
||||
//ria->set_local_path( ProjectSettings::get_singleton()->localize_path(p_path) );
|
||||
String r = ria->recognize(f);
|
||||
ResourceLoaderText loader;
|
||||
loader.local_path = ProjectSettings::get_singleton()->localize_path(p_path);
|
||||
loader.res_path = loader.local_path;
|
||||
//loader.set_local_path( ProjectSettings::get_singleton()->localize_path(p_path) );
|
||||
String r = loader.recognize(f);
|
||||
return ClassDB::get_compatibility_remapped_class(r);
|
||||
}
|
||||
|
||||
@@ -1292,11 +1366,11 @@ void ResourceFormatLoaderText::get_dependencies(const String &p_path, List<Strin
|
||||
ERR_FAIL();
|
||||
}
|
||||
|
||||
Ref<ResourceInteractiveLoaderText> ria = memnew(ResourceInteractiveLoaderText);
|
||||
ria->local_path = ProjectSettings::get_singleton()->localize_path(p_path);
|
||||
ria->res_path = ria->local_path;
|
||||
//ria->set_local_path( ProjectSettings::get_singleton()->localize_path(p_path) );
|
||||
ria->get_dependencies(f, p_dependencies, p_add_types);
|
||||
ResourceLoaderText loader;
|
||||
loader.local_path = ProjectSettings::get_singleton()->localize_path(p_path);
|
||||
loader.res_path = loader.local_path;
|
||||
//loader.set_local_path( ProjectSettings::get_singleton()->localize_path(p_path) );
|
||||
loader.get_dependencies(f, p_dependencies, p_add_types);
|
||||
}
|
||||
|
||||
Error ResourceFormatLoaderText::rename_dependencies(const String &p_path, const Map<String, String> &p_map) {
|
||||
@@ -1307,11 +1381,11 @@ Error ResourceFormatLoaderText::rename_dependencies(const String &p_path, const
|
||||
ERR_FAIL_V(ERR_CANT_OPEN);
|
||||
}
|
||||
|
||||
Ref<ResourceInteractiveLoaderText> ria = memnew(ResourceInteractiveLoaderText);
|
||||
ria->local_path = ProjectSettings::get_singleton()->localize_path(p_path);
|
||||
ria->res_path = ria->local_path;
|
||||
//ria->set_local_path( ProjectSettings::get_singleton()->localize_path(p_path) );
|
||||
return ria->rename_dependencies(f, p_path, p_map);
|
||||
ResourceLoaderText loader;
|
||||
loader.local_path = ProjectSettings::get_singleton()->localize_path(p_path);
|
||||
loader.res_path = loader.local_path;
|
||||
//loader.set_local_path( ProjectSettings::get_singleton()->localize_path(p_path) );
|
||||
return loader.rename_dependencies(f, p_path, p_map);
|
||||
}
|
||||
|
||||
ResourceFormatLoaderText *ResourceFormatLoaderText::singleton = NULL;
|
||||
@@ -1323,13 +1397,13 @@ Error ResourceFormatLoaderText::convert_file_to_binary(const String &p_src_path,
|
||||
|
||||
ERR_FAIL_COND_V_MSG(err != OK, ERR_CANT_OPEN, "Cannot open file '" + p_src_path + "'.");
|
||||
|
||||
Ref<ResourceInteractiveLoaderText> ria = memnew(ResourceInteractiveLoaderText);
|
||||
ResourceLoaderText loader;
|
||||
const String &path = p_src_path;
|
||||
ria->local_path = ProjectSettings::get_singleton()->localize_path(path);
|
||||
ria->res_path = ria->local_path;
|
||||
//ria->set_local_path( ProjectSettings::get_singleton()->localize_path(p_path) );
|
||||
ria->open(f);
|
||||
return ria->save_as_binary(f, p_dst_path);
|
||||
loader.local_path = ProjectSettings::get_singleton()->localize_path(path);
|
||||
loader.res_path = loader.local_path;
|
||||
//loader.set_local_path( ProjectSettings::get_singleton()->localize_path(p_path) );
|
||||
loader.open(f);
|
||||
return loader.save_as_binary(f, p_dst_path);
|
||||
}
|
||||
|
||||
/*****************************************************************************************************/
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
#include "core/variant_parser.h"
|
||||
#include "scene/resources/packed_scene.h"
|
||||
|
||||
class ResourceInteractiveLoaderText : public ResourceInteractiveLoader {
|
||||
class ResourceLoaderText {
|
||||
|
||||
bool translation_remapped;
|
||||
String local_path;
|
||||
@@ -49,6 +49,7 @@ class ResourceInteractiveLoaderText : public ResourceInteractiveLoader {
|
||||
VariantParser::StreamFile stream;
|
||||
|
||||
struct ExtResource {
|
||||
RES cache;
|
||||
String path;
|
||||
String type;
|
||||
};
|
||||
@@ -68,13 +69,16 @@ class ResourceInteractiveLoaderText : public ResourceInteractiveLoader {
|
||||
|
||||
VariantParser::Tag next_tag;
|
||||
|
||||
bool use_sub_threads;
|
||||
float *progress;
|
||||
|
||||
mutable int lines;
|
||||
|
||||
Map<String, String> remaps;
|
||||
//void _printerr();
|
||||
|
||||
static Error _parse_sub_resources(void *p_self, VariantParser::Stream *p_stream, Ref<Resource> &r_res, int &line, String &r_err_str) { return reinterpret_cast<ResourceInteractiveLoaderText *>(p_self)->_parse_sub_resource(p_stream, r_res, line, r_err_str); }
|
||||
static Error _parse_ext_resources(void *p_self, VariantParser::Stream *p_stream, Ref<Resource> &r_res, int &line, String &r_err_str) { return reinterpret_cast<ResourceInteractiveLoaderText *>(p_self)->_parse_ext_resource(p_stream, r_res, line, r_err_str); }
|
||||
static Error _parse_sub_resources(void *p_self, VariantParser::Stream *p_stream, Ref<Resource> &r_res, int &line, String &r_err_str) { return reinterpret_cast<ResourceLoaderText *>(p_self)->_parse_sub_resource(p_stream, r_res, line, r_err_str); }
|
||||
static Error _parse_ext_resources(void *p_self, VariantParser::Stream *p_stream, Ref<Resource> &r_res, int &line, String &r_err_str) { return reinterpret_cast<ResourceLoaderText *>(p_self)->_parse_ext_resource(p_stream, r_res, line, r_err_str); }
|
||||
|
||||
Error _parse_sub_resource(VariantParser::Stream *p_stream, Ref<Resource> &r_res, int &line, String &r_err_str);
|
||||
Error _parse_ext_resource(VariantParser::Stream *p_stream, Ref<Resource> &r_res, int &line, String &r_err_str);
|
||||
@@ -110,12 +114,12 @@ class ResourceInteractiveLoaderText : public ResourceInteractiveLoader {
|
||||
Ref<PackedScene> _parse_node_tag(VariantParser::ResourceParser &parser);
|
||||
|
||||
public:
|
||||
virtual void set_local_path(const String &p_local_path);
|
||||
virtual Ref<Resource> get_resource();
|
||||
virtual Error poll();
|
||||
virtual int get_stage() const;
|
||||
virtual int get_stage_count() const;
|
||||
virtual void set_translation_remapped(bool p_remapped);
|
||||
void set_local_path(const String &p_local_path);
|
||||
Ref<Resource> get_resource();
|
||||
Error load();
|
||||
int get_stage() const;
|
||||
int get_stage_count() const;
|
||||
void set_translation_remapped(bool p_remapped);
|
||||
|
||||
void open(FileAccess *p_f, bool p_skip_first_tag = false);
|
||||
String recognize(FileAccess *p_f);
|
||||
@@ -123,14 +127,14 @@ public:
|
||||
Error rename_dependencies(FileAccess *p_f, const String &p_path, const Map<String, String> &p_map);
|
||||
|
||||
Error save_as_binary(FileAccess *p_f, const String &p_path);
|
||||
ResourceInteractiveLoaderText();
|
||||
~ResourceInteractiveLoaderText();
|
||||
ResourceLoaderText();
|
||||
~ResourceLoaderText();
|
||||
};
|
||||
|
||||
class ResourceFormatLoaderText : public ResourceFormatLoader {
|
||||
public:
|
||||
static ResourceFormatLoaderText *singleton;
|
||||
virtual Ref<ResourceInteractiveLoader> load_interactive(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
|
||||
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL, bool p_use_sub_threads = false, float *r_progress = nullptr);
|
||||
virtual void get_recognized_extensions_for_type(const String &p_type, List<String> *p_extensions) const;
|
||||
virtual void get_recognized_extensions(List<String> *p_extensions) const;
|
||||
virtual bool handles_type(const String &p_type) const;
|
||||
|
||||
@@ -173,7 +173,7 @@ Shader::~Shader() {
|
||||
}
|
||||
////////////
|
||||
|
||||
RES ResourceFormatLoaderShader::load(const String &p_path, const String &p_original_path, Error *r_error) {
|
||||
RES ResourceFormatLoaderShader::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress) {
|
||||
|
||||
if (r_error)
|
||||
*r_error = ERR_FILE_CANT_OPEN;
|
||||
|
||||
@@ -101,7 +101,7 @@ VARIANT_ENUM_CAST(Shader::Mode);
|
||||
|
||||
class ResourceFormatLoaderShader : public ResourceFormatLoader {
|
||||
public:
|
||||
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
|
||||
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL, bool p_use_sub_threads = false, float *r_progress = nullptr);
|
||||
virtual void get_recognized_extensions(List<String> *p_extensions) const;
|
||||
virtual bool handles_type(const String &p_type) const;
|
||||
virtual String get_resource_type(const String &p_path) const;
|
||||
|
||||
@@ -363,7 +363,6 @@ Ref<Image> StreamTexture::load_image_from_file(FileAccess *f, int p_size_limit)
|
||||
uint32_t mipmaps = f->get_32();
|
||||
Image::Format format = Image::Format(f->get_32());
|
||||
|
||||
print_line("format: " + itos(data_format) + " size " + Size2i(w, h) + " mipmaps: " + itos(mipmaps));
|
||||
if (data_format == DATA_FORMAT_LOSSLESS || data_format == DATA_FORMAT_LOSSY || data_format == DATA_FORMAT_BASIS_UNIVERSAL) {
|
||||
//look for a PNG or WEBP file inside
|
||||
|
||||
@@ -797,7 +796,7 @@ StreamTexture::~StreamTexture() {
|
||||
}
|
||||
}
|
||||
|
||||
RES ResourceFormatLoaderStreamTexture::load(const String &p_path, const String &p_original_path, Error *r_error) {
|
||||
RES ResourceFormatLoaderStreamTexture::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress) {
|
||||
|
||||
Ref<StreamTexture> st;
|
||||
st.instance();
|
||||
@@ -2027,7 +2026,7 @@ TextureLayered::~TextureLayered() {
|
||||
}
|
||||
}
|
||||
|
||||
RES ResourceFormatLoaderTextureLayered::load(const String &p_path, const String &p_original_path, Error *r_error) {
|
||||
RES ResourceFormatLoaderTextureLayered::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress) {
|
||||
|
||||
if (r_error) {
|
||||
*r_error = ERR_CANT_OPEN;
|
||||
|
||||
@@ -213,7 +213,7 @@ public:
|
||||
|
||||
class ResourceFormatLoaderStreamTexture : public ResourceFormatLoader {
|
||||
public:
|
||||
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
|
||||
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL, bool p_use_sub_threads = false, float *r_progress = nullptr);
|
||||
virtual void get_recognized_extensions(List<String> *p_extensions) const;
|
||||
virtual bool handles_type(const String &p_type) const;
|
||||
virtual String get_resource_type(const String &p_path) const;
|
||||
@@ -421,7 +421,7 @@ public:
|
||||
COMPRESSION_UNCOMPRESSED
|
||||
};
|
||||
|
||||
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
|
||||
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL, bool p_use_sub_threads = false, float *r_progress = nullptr);
|
||||
virtual void get_recognized_extensions(List<String> *p_extensions) const;
|
||||
virtual bool handles_type(const String &p_type) const;
|
||||
virtual String get_resource_type(const String &p_path) const;
|
||||
|
||||
Reference in New Issue
Block a user