Bladeren bron

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

Mario Zechner 11 maanden geleden
bovenliggende
commit
4f06406e96

+ 1 - 1
spine-godot/.vscode/settings.json

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

+ 27 - 3
spine-godot/spine_godot/SpineAtlasResource.cpp

@@ -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;

+ 2 - 0
spine-godot/spine_godot/SpineAtlasResource.h

@@ -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

+ 3 - 1
spine-godot/spine_godot/SpineEditorPlugin.cpp

@@ -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