diff --git a/spine-godot/spine_godot/SpineSprite.cpp b/spine-godot/spine_godot/SpineSprite.cpp index 5ffa7d5db..d2fb31cd4 100644 --- a/spine-godot/spine_godot/SpineSprite.cpp +++ b/spine-godot/spine_godot/SpineSprite.cpp @@ -87,6 +87,9 @@ // Needed due to shared lib initializers in GDExtension. // See: https://x.com/badlogicgames/status/1843661872404591068 struct SpineSpriteStatics { +private: + static SpineSpriteStatics *_instance; + public: Ref default_materials[4] = {}; int sprite_count; @@ -126,11 +129,21 @@ struct SpineSpriteStatics { } static SpineSpriteStatics &instance() { - static SpineSpriteStatics inst; - return inst; + if (!_instance) { + _instance = new SpineSpriteStatics(); + } + return *_instance; + } + + static void clear() { + if (_instance) { + delete _instance; + } + _instance = nullptr; } }; +SpineSpriteStatics *SpineSpriteStatics::_instance = nullptr; static void clear_triangles(SpineMesh2D *mesh_instance) { @@ -230,10 +243,10 @@ void SpineMesh2D::update_mesh(const PackedVector2Array &vertices, surface_offsets[RS::ARRAY_TEX_UV] = RS::get_singleton()->mesh_surface_get_format_offset(surface_format, vertices.size(), RS::ARRAY_TEX_UV); vertex_stride = RS::get_singleton()->mesh_surface_get_format_vertex_stride(surface_format, vertices.size()); attribute_stride = RS::get_singleton()->mesh_surface_get_format_attribute_stride(surface_format, vertices.size()); - num_vertices = vertices.size(); - num_indices = indices.size(); vertex_buffer = surface["vertex_data"]; attribute_buffer = surface["attribute_data"]; + num_vertices = vertices.size(); + num_indices = indices.size(); indices_changed = false; } else { AABB aabb_new; @@ -394,6 +407,10 @@ void SpineMesh2D::update_mesh(const Vector &vertices, } #endif +void SpineSprite::clear_statics() { + SpineSpriteStatics::clear(); +} + void SpineSprite::_bind_methods() { ClassDB::bind_method(D_METHOD("set_skeleton_data_res", "skeleton_data_res"), &SpineSprite::set_skeleton_data_res); ClassDB::bind_method(D_METHOD("get_skeleton_data_res"), &SpineSprite::get_skeleton_data_res); diff --git a/spine-godot/spine_godot/SpineSprite.h b/spine-godot/spine_godot/SpineSprite.h index dcd9777d4..fb07d71ad 100644 --- a/spine-godot/spine_godot/SpineSprite.h +++ b/spine-godot/spine_godot/SpineSprite.h @@ -297,4 +297,6 @@ class SpineSprite : public Node2D, virtual bool _edit_use_rect() const; #endif #endif + + static void clear_statics(); }; diff --git a/spine-godot/spine_godot/register_types.cpp b/spine-godot/spine_godot/register_types.cpp index 85ee90fd4..39cec747c 100644 --- a/spine-godot/spine_godot/register_types.cpp +++ b/spine-godot/spine_godot/register_types.cpp @@ -195,7 +195,10 @@ void register_spine_godot_types() { #if VERSION_MAJOR > 3 void uninitialize_spine_godot_module(ModuleInitializationLevel level) { - return; + if (level == MODULE_INITIALIZATION_LEVEL_SCENE) { + SpineSprite::clear_statics(); + return; + } if (level != MODULE_INITIALIZATION_LEVEL_CORE) return; #else void unregister_spine_godot_types() {