[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,
"C_Cpp.intelliSenseEngine": "disabled",
"C_Cpp.intelliSenseEngine": "default",
"dotnet.defaultSolution": "disable"
}

View File

@ -33,14 +33,20 @@
#include "scene/resources/texture.h"
#include <spine/TextureLoader.h>
#define TOOLS_ENABLED
#ifdef TOOLS_ENABLED
#include "editor/editor_file_system.h"
#endif
class GodotSpineTextureLoader : public spine::TextureLoader {
Array *textures;
Array *normal_maps;
String normal_map_prefix;
bool is_importing;
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) {
@ -65,6 +71,20 @@ public:
Error error = OK;
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
Ref<Texture2D> texture = ResourceLoader::load(fixed_path, "", ResourceFormatLoader::CACHE_MODE_REUSE, &error);
#else
@ -156,13 +176,17 @@ String SpineAtlasResource::get_source_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;
source_path = path;
atlas_data = FileAccess::get_file_as_string(path, &err);
if (err != OK) return err;
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();
atlas = new spine::Atlas(atlas_utf8, atlas_utf8.length(), source_path.get_base_dir().utf8(), texture_loader);
if (atlas) return OK;
@ -195,7 +219,7 @@ Error SpineAtlasResource::load_from_file(const String &path) {
normal_map_prefix = content["normal_texture_prefix"];
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();
atlas = new spine::Atlas(utf8.ptr(), utf8.size(), source_path.get_base_dir().utf8(), texture_loader);
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_internal(const String &path, bool is_importing);// .atlas
Error load_from_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
* SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*****************************************************************************/
#define TOOLS_ENABLED
#define VERSION_MAJOR 4
#ifdef TOOLS_ENABLED
#include "SpineEditorPlugin.h"
@ -40,7 +42,7 @@ Error SpineAtlasResourceImportPlugin::import(const String &source_file, const St
#endif
Ref<SpineAtlasResource> atlas(memnew(SpineAtlasResource));
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());
#if VERSION_MAJOR > 3