diff --git a/spine-godot/spine_godot/SpineAnimationTrack.cpp b/spine-godot/spine_godot/SpineAnimationTrack.cpp index da0b80c5ad..ff22de00af 100644 --- a/spine-godot/spine_godot/SpineAnimationTrack.cpp +++ b/spine-godot/spine_godot/SpineAnimationTrack.cpp @@ -37,7 +37,7 @@ #include "scene/resources/animation.h" #ifdef TOOLS_ENABLED -#include "godot/editor/editor_node.h" +#include "editor/editor_node.h" #include "editor/plugins/animation_player_editor_plugin.h" #include "editor/plugins/animation_tree_editor_plugin.h" #endif diff --git a/spine-godot/spine_godot/SpineAtlasResource.cpp b/spine-godot/spine_godot/SpineAtlasResource.cpp index 7864d504cc..ac258fe522 100644 --- a/spine-godot/spine_godot/SpineAtlasResource.cpp +++ b/spine-godot/spine_godot/SpineAtlasResource.cpp @@ -30,6 +30,8 @@ #include "SpineAtlasResource.h" #include "SpineRendererObject.h" #include "core/io/json.h" +#include "core/io/image.h" +#include "scene/resources/image_texture.h" #include "scene/resources/texture.h" #include @@ -49,27 +51,64 @@ class GodotSpineTextureLoader : public spine::TextureLoader { GodotSpineTextureLoader(Array *_textures, Array *_normal_maps, const String &normal_map_prefix, bool is_importing) : textures(_textures), normal_maps(_normal_maps), normal_map_prefix(normal_map_prefix), is_importing(is_importing) { } - static String fix_path(const String &path) { - if (path.size() > 5 && path[4] == '/' && path[5] == '/') return path; + static bool fix_path(String &path) { const String prefix = "res:/"; auto i = path.find(prefix); + if (i == std::string::npos) { + return false; + } + auto sub_str_pos = i + prefix.size() - 1; - if (sub_str_pos < 0) return path; auto res = path.substr(sub_str_pos); - if (!EMPTY(res)) { if (res[0] != '/') { - return prefix + "/" + res; + path = prefix + "/" + res; } else { - return prefix + res; + path = prefix + res; + } + } + return true; + } + +#if VERSION_MAJOR > 3 + Ref get_texture_from_image(const String &path, bool is_resource) { + Error error = OK; + if (is_resource) { + return ResourceLoader::load(path, "", ResourceFormatLoader::CACHE_MODE_REUSE, &error); + } else { + Ref img; + img.instantiate(); + img = img->load_from_file(path); + return ImageTexture::create_from_image(img); + } + } +#else + Ref get_texture_from_image(const String &path, bool is_resource) { + Error error = OK; + if (is_resource) { + return ResourceLoader::load(path, "", false, &error); + } else { + Vector buf = FileAccess::get_file_as_array(path, &error); + if (error == OK) { + Ref img; + img.instantiate(); + String filename = path.get_filename().to_lower(); + if (filename.ends_with(".png")) { + img->load_png_from_buffer(buf); + } else if (filename_lower.ends_with(".jpg")) { + img->load_jpg_from_buffer(buf); + } + return ImageTexture::create_from_image(img); } } - return path; + return Ref(); } +#endif void load(spine::AtlasPage &page, const spine::String &path) override { Error error = OK; - auto fixed_path = fix_path(String(path.buffer())); + String fixed_path = String(path.buffer()); + bool is_resource = fix_path(fixed_path); #ifdef VERSION_MAJOR > 4 @@ -86,9 +125,9 @@ class GodotSpineTextureLoader : public spine::TextureLoader { #endif #if VERSION_MAJOR > 3 - Ref texture = ResourceLoader::load(fixed_path, "", ResourceFormatLoader::CACHE_MODE_REUSE, &error); + Ref texture = get_texture_from_image(fixed_path, is_resource); #else - Ref texture = ResourceLoader::load(fixed_path, "", false, &error); + Ref texture = get_texture_from_image(fixed_path, is_resource); #endif if (error != OK || !texture.is_valid()) { ERR_PRINT(vformat("Can't load texture: \"%s\"", String(path.buffer()))); @@ -106,7 +145,7 @@ class GodotSpineTextureLoader : public spine::TextureLoader { String new_path = vformat("%s/%s_%s", fixed_path.get_base_dir(), normal_map_prefix, fixed_path.get_file()); if (ResourceLoader::exists(new_path)) { - Ref normal_map = ResourceLoader::load(new_path); + Ref normal_map = get_texture_from_image(new_path, is_resource); normal_maps->append(normal_map); renderer_object->normal_map = normal_map; } diff --git a/spine-godot/spine_godot/SpineSkeletonFileResource.cpp b/spine-godot/spine_godot/SpineSkeletonFileResource.cpp index b9ae39a708..ae646dfc1e 100644 --- a/spine-godot/spine_godot/SpineSkeletonFileResource.cpp +++ b/spine-godot/spine_godot/SpineSkeletonFileResource.cpp @@ -89,6 +89,7 @@ static char *readString(BinaryInput *input) { } void SpineSkeletonFileResource::_bind_methods() { + ClassDB::bind_method(D_METHOD("load_from_file", "path"), &SpineSkeletonFileResource::load_from_file); ADD_SIGNAL(MethodInfo("skeleton_file_changed")); } diff --git a/spine-godot/spine_godot/docs/SpineSkeletonFileResource.xml b/spine-godot/spine_godot/docs/SpineSkeletonFileResource.xml index cbb0d9b3e9..378c54208e 100644 --- a/spine-godot/spine_godot/docs/SpineSkeletonFileResource.xml +++ b/spine-godot/spine_godot/docs/SpineSkeletonFileResource.xml @@ -9,6 +9,12 @@ + + + + + +