From e3f7e9091279f9102e392abc91bb762a108e71ca Mon Sep 17 00:00:00 2001 From: Mario Zechner Date: Tue, 16 Dec 2025 15:20:01 +0100 Subject: [PATCH] [godot] Fix GDExtension crash on editor shutdown Properly remove import/inspector plugins in NOTIFICATION_PREDELETE before the extension is unloaded to prevent crash when Godot's ResourceFormatImporter tries to unreference already-destroyed plugins. --- spine-godot/spine_godot/SpineEditorPlugin.cpp | 23 +++++++++++++++---- spine-godot/spine_godot/SpineEditorPlugin.h | 9 ++++++++ 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/spine-godot/spine_godot/SpineEditorPlugin.cpp b/spine-godot/spine_godot/SpineEditorPlugin.cpp index fe48777d2..34b3ad2f2 100644 --- a/spine-godot/spine_godot/SpineEditorPlugin.cpp +++ b/spine-godot/spine_godot/SpineEditorPlugin.cpp @@ -178,11 +178,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 ea1aacd01..37493824e 100644 --- a/spine-godot/spine_godot/SpineEditorPlugin.h +++ b/spine-godot/spine_godot/SpineEditorPlugin.h @@ -287,11 +287,20 @@ 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(); String _get_plugin_name() const override { return "SpineEditorPlugin"; } + + void _notification(int p_what); #else explicit SpineEditorPlugin(EditorNode *node);