diff --git a/spine-godot/spine_godot/SpineEditorPlugin.cpp b/spine-godot/spine_godot/SpineEditorPlugin.cpp index 806f153ad..715162da9 100644 --- a/spine-godot/spine_godot/SpineEditorPlugin.cpp +++ b/spine-godot/spine_godot/SpineEditorPlugin.cpp @@ -197,11 +197,24 @@ Error SpineBinaryResourceImportPlugin::import(const String &source_file, const S #ifdef SPINE_GODOT_EXTENSION SpineEditorPlugin::SpineEditorPlugin() { - add_import_plugin(memnew(SpineAtlasResourceImportPlugin)); - add_import_plugin(memnew(SpineJsonResourceImportPlugin)); - add_import_plugin(memnew(SpineBinaryResourceImportPlugin)); - add_inspector_plugin(memnew(SpineSkeletonDataResourceInspectorPlugin)); - // add_inspector_plugin(memnew(SpineSpriteInspectorPlugin)); + atlas_import_plugin = Ref(memnew(SpineAtlasResourceImportPlugin)); + json_import_plugin = Ref(memnew(SpineJsonResourceImportPlugin)); + binary_import_plugin = Ref(memnew(SpineBinaryResourceImportPlugin)); + skeleton_data_inspector_plugin = Ref(memnew(SpineSkeletonDataResourceInspectorPlugin)); + + add_import_plugin(atlas_import_plugin); + add_import_plugin(json_import_plugin); + add_import_plugin(binary_import_plugin); + add_inspector_plugin(skeleton_data_inspector_plugin); +} + +void SpineEditorPlugin::_notification(int p_what) { + if (p_what == NOTIFICATION_PREDELETE) { + remove_import_plugin(atlas_import_plugin); + remove_import_plugin(json_import_plugin); + remove_import_plugin(binary_import_plugin); + remove_inspector_plugin(skeleton_data_inspector_plugin); + } } #else SpineEditorPlugin::SpineEditorPlugin(EditorNode *node) { diff --git a/spine-godot/spine_godot/SpineEditorPlugin.h b/spine-godot/spine_godot/SpineEditorPlugin.h index abad5b7d5..667f718e9 100644 --- a/spine-godot/spine_godot/SpineEditorPlugin.h +++ b/spine-godot/spine_godot/SpineEditorPlugin.h @@ -424,6 +424,13 @@ class SpineEditorPlugin : public EditorPlugin { static void _bind_methods() { } +#ifdef SPINE_GODOT_EXTENSION + Ref atlas_import_plugin; + Ref json_import_plugin; + Ref binary_import_plugin; + Ref skeleton_data_inspector_plugin; +#endif + public: #ifdef SPINE_GODOT_EXTENSION explicit SpineEditorPlugin(); @@ -431,6 +438,8 @@ public: String _get_plugin_name() const override { return "SpineEditorPlugin"; } + + void _notification(int p_what); #else explicit SpineEditorPlugin(EditorNode *node); diff --git a/spine-godot/spine_godot/SpineSkeletonDataResource.cpp b/spine-godot/spine_godot/SpineSkeletonDataResource.cpp index eadf9f46d..fdcb04bad 100644 --- a/spine-godot/spine_godot/SpineSkeletonDataResource.cpp +++ b/spine-godot/spine_godot/SpineSkeletonDataResource.cpp @@ -194,6 +194,8 @@ SpineSkeletonDataResource::SpineSkeletonDataResource() : default_mix(0), skeleto if (Engine::get_singleton()->is_editor_hint()) { EditorFileSystem *efs = get_editor_file_system(); if (efs) { + // Store the ObjectID for safe validation in destructor + editor_file_system_id = efs->get_instance_id(); efs->connect("resources_reimported", callable_mp(this, &SpineSkeletonDataResource::_on_resources_reimported)); } } @@ -201,6 +203,8 @@ SpineSkeletonDataResource::SpineSkeletonDataResource() : default_mix(0), skeleto if (Engine::get_singleton()->is_editor_hint()) { EditorFileSystem *efs = EditorFileSystem::get_singleton(); if (efs) { + // Store the ObjectID for safe validation in destructor + editor_file_system_id = efs->get_instance_id(); efs->connect("resources_reimported", this, "_on_resources_reimported"); } } @@ -212,14 +216,14 @@ SpineSkeletonDataResource::~SpineSkeletonDataResource() { #ifdef TOOLS_ENABLED #if VERSION_MAJOR > 3 if (Engine::get_singleton()->is_editor_hint()) { - EditorFileSystem *efs = get_editor_file_system(); + EditorFileSystem *efs = Object::cast_to(ObjectDB::get_instance(editor_file_system_id)); if (efs && efs->is_connected("resources_reimported", callable_mp(this, &SpineSkeletonDataResource::_on_resources_reimported))) { efs->disconnect("resources_reimported", callable_mp(this, &SpineSkeletonDataResource::_on_resources_reimported)); } } #else if (Engine::get_singleton()->is_editor_hint()) { - EditorFileSystem *efs = EditorFileSystem::get_singleton(); + EditorFileSystem *efs = Object::cast_to(ObjectDB::get_instance(editor_file_system_id)); if (efs && efs->is_connected("resources_reimported", this, "_on_resources_reimported")) { efs->disconnect("resources_reimported", this, "_on_resources_reimported"); } diff --git a/spine-godot/spine_godot/SpineSkeletonDataResource.h b/spine-godot/spine_godot/SpineSkeletonDataResource.h index ee39b6023..67d8e0020 100644 --- a/spine-godot/spine_godot/SpineSkeletonDataResource.h +++ b/spine-godot/spine_godot/SpineSkeletonDataResource.h @@ -82,6 +82,10 @@ private: spine::SkeletonData *skeleton_data; spine::AnimationStateData *animation_state_data; +#ifdef TOOLS_ENABLED + ObjectID editor_file_system_id; +#endif + void update_skeleton_data(); #ifdef SPINE_GODOT_EXTENSION diff --git a/spine-godot/spine_godot/register_types.cpp b/spine-godot/spine_godot/register_types.cpp index a250cd86b..779e05a1a 100644 --- a/spine-godot/spine_godot/register_types.cpp +++ b/spine-godot/spine_godot/register_types.cpp @@ -103,6 +103,13 @@ void initialize_spine_godot_module(ModuleInitializationLevel level) { #endif return; } + if (level == MODULE_INITIALIZATION_LEVEL_CORE) { + GDREGISTER_CLASS(SpineAtlasResourceFormatLoader); + GDREGISTER_CLASS(SpineAtlasResourceFormatSaver); + GDREGISTER_CLASS(SpineSkeletonFileResourceFormatLoader); + GDREGISTER_CLASS(SpineSkeletonFileResourceFormatSaver); + return; + } if (level != MODULE_INITIALIZATION_LEVEL_SCENE) return; #else #if VERSION_MAJOR > 3 @@ -125,10 +132,12 @@ void register_spine_godot_types() { #endif spine::Bone::setYDown(true); +#ifndef SPINE_GODOT_EXTENSION GDREGISTER_CLASS(SpineAtlasResourceFormatLoader); GDREGISTER_CLASS(SpineAtlasResourceFormatSaver); GDREGISTER_CLASS(SpineSkeletonFileResourceFormatLoader); GDREGISTER_CLASS(SpineSkeletonFileResourceFormatSaver); +#endif GDREGISTER_CLASS(SpineObjectWrapper); GDREGISTER_CLASS(SpineAtlasResource); @@ -221,9 +230,11 @@ void register_spine_godot_types() { #ifdef SPINE_GODOT_EXTENSION void uninitialize_spine_godot_module(ModuleInitializationLevel level) { - if (level != MODULE_INITIALIZATION_LEVEL_SCENE) return; - - SpineSprite::clear_statics(); + if (level == MODULE_INITIALIZATION_LEVEL_SCENE) { + SpineSprite::clear_statics(); + return; + } + if (level != MODULE_INITIALIZATION_LEVEL_CORE) return; ResourceLoader::get_singleton()->remove_resource_format_loader(atlas_loader); ResourceSaver::get_singleton()->remove_resource_format_saver(atlas_saver); @@ -258,7 +269,7 @@ extern "C" GDExtensionBool GDE_EXPORT spine_godot_library_init(GDExtensionInterf GDExtensionBinding::InitObject init_obj(p_get_proc_address, p_library, r_initialization); init_obj.register_initializer(initialize_spine_godot_module); init_obj.register_terminator(uninitialize_spine_godot_module); - init_obj.set_minimum_library_initialization_level(MODULE_INITIALIZATION_LEVEL_SCENE); + init_obj.set_minimum_library_initialization_level(MODULE_INITIALIZATION_LEVEL_CORE); return init_obj.init(); } #endif