[godot] Fix spurious errors on first import of .atlas file. Closes #2385

This commit is contained in:
Mario Zechner 2024-10-02 16:01:04 +02:00
parent 29288ca44d
commit 4f06406e96
4 changed files with 33 additions and 5 deletions

View File

@ -1,5 +1,5 @@
{ {
"cmake.configureOnOpen": false, "cmake.configureOnOpen": false,
"C_Cpp.intelliSenseEngine": "disabled", "C_Cpp.intelliSenseEngine": "default",
"dotnet.defaultSolution": "disable" "dotnet.defaultSolution": "disable"
} }

View File

@ -33,14 +33,20 @@
#include "scene/resources/texture.h" #include "scene/resources/texture.h"
#include <spine/TextureLoader.h> #include <spine/TextureLoader.h>
#define TOOLS_ENABLED
#ifdef TOOLS_ENABLED
#include "editor/editor_file_system.h"
#endif
class GodotSpineTextureLoader : public spine::TextureLoader { class GodotSpineTextureLoader : public spine::TextureLoader {
Array *textures; Array *textures;
Array *normal_maps; Array *normal_maps;
String normal_map_prefix; String normal_map_prefix;
bool is_importing;
public: public:
GodotSpineTextureLoader(Array *_textures, Array *_normal_maps, const String &normal_map_prefix) : textures(_textures), normal_maps(_normal_maps), normal_map_prefix(normal_map_prefix) { 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) { static String fix_path(const String &path) {
@ -65,6 +71,20 @@ public:
Error error = OK; Error error = OK;
auto fixed_path = fix_path(String(path.buffer())); auto fixed_path = fix_path(String(path.buffer()));
#ifdef VERSION_MAJOR > 4
#ifdef TOOLS_ENABLED
// Required when importing into editor by e.g. drag & drop. The .png files
// of the atlas might not have been imported yet.
// See https://github.com/EsotericSoftware/spine-runtimes/issues/2385
if (is_importing) {
HashMap<StringName, Variant> custom_options;
Dictionary generator_parameters;
EditorFileSystem::get_singleton()->reimport_append(fixed_path, custom_options, "", generator_parameters);
}
#endif
#endif
#if VERSION_MAJOR > 3 #if VERSION_MAJOR > 3
Ref<Texture2D> texture = ResourceLoader::load(fixed_path, "", ResourceFormatLoader::CACHE_MODE_REUSE, &error); Ref<Texture2D> texture = ResourceLoader::load(fixed_path, "", ResourceFormatLoader::CACHE_MODE_REUSE, &error);
#else #else
@ -156,13 +176,17 @@ String SpineAtlasResource::get_source_path() {
} }
Error SpineAtlasResource::load_from_atlas_file(const String &path) { Error SpineAtlasResource::load_from_atlas_file(const String &path) {
load_from_atlas_file_internal(path, false);
}
Error SpineAtlasResource::load_from_atlas_file_internal(const String &path, bool is_importing) {
Error err; Error err;
source_path = path; source_path = path;
atlas_data = FileAccess::get_file_as_string(path, &err); atlas_data = FileAccess::get_file_as_string(path, &err);
if (err != OK) return err; if (err != OK) return err;
clear(); clear();
texture_loader = new GodotSpineTextureLoader(&textures, &normal_maps, normal_map_prefix); texture_loader = new GodotSpineTextureLoader(&textures, &normal_maps, normal_map_prefix, is_importing);
auto atlas_utf8 = atlas_data.utf8(); auto atlas_utf8 = atlas_data.utf8();
atlas = new spine::Atlas(atlas_utf8, atlas_utf8.length(), source_path.get_base_dir().utf8(), texture_loader); atlas = new spine::Atlas(atlas_utf8, atlas_utf8.length(), source_path.get_base_dir().utf8(), texture_loader);
if (atlas) return OK; if (atlas) return OK;
@ -195,7 +219,7 @@ Error SpineAtlasResource::load_from_file(const String &path) {
normal_map_prefix = content["normal_texture_prefix"]; normal_map_prefix = content["normal_texture_prefix"];
clear(); clear();
texture_loader = new GodotSpineTextureLoader(&textures, &normal_maps, normal_map_prefix); texture_loader = new GodotSpineTextureLoader(&textures, &normal_maps, normal_map_prefix, false);
auto utf8 = atlas_data.utf8(); auto utf8 = atlas_data.utf8();
atlas = new spine::Atlas(utf8.ptr(), utf8.size(), source_path.get_base_dir().utf8(), texture_loader); atlas = new spine::Atlas(utf8.ptr(), utf8.size(), source_path.get_base_dir().utf8(), texture_loader);
if (atlas) return OK; if (atlas) return OK;

View File

@ -65,6 +65,8 @@ public:
Error load_from_atlas_file(const String &path);// .atlas Error load_from_atlas_file(const String &path);// .atlas
Error load_from_atlas_file_internal(const String &path, bool is_importing);// .atlas
Error load_from_file(const String &path);// .spatlas Error load_from_file(const String &path);// .spatlas
Error save_to_file(const String &path);// .spatlas Error save_to_file(const String &path);// .spatlas

View File

@ -26,6 +26,8 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THE * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THE
* SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*****************************************************************************/ *****************************************************************************/
#define TOOLS_ENABLED
#define VERSION_MAJOR 4
#ifdef TOOLS_ENABLED #ifdef TOOLS_ENABLED
#include "SpineEditorPlugin.h" #include "SpineEditorPlugin.h"
@ -40,7 +42,7 @@ Error SpineAtlasResourceImportPlugin::import(const String &source_file, const St
#endif #endif
Ref<SpineAtlasResource> atlas(memnew(SpineAtlasResource)); Ref<SpineAtlasResource> atlas(memnew(SpineAtlasResource));
atlas->set_normal_texture_prefix(options["normal_map_prefix"]); atlas->set_normal_texture_prefix(options["normal_map_prefix"]);
atlas->load_from_atlas_file(source_file); atlas->load_from_atlas_file_internal(source_file, true);
String file_name = vformat("%s.%s", save_path, get_save_extension()); String file_name = vformat("%s.%s", save_path, get_save_extension());
#if VERSION_MAJOR > 3 #if VERSION_MAJOR > 3