[godot] Fix statics deinitialization

This commit is contained in:
Mario Zechner 2024-10-09 21:14:01 +02:00
parent 62aad81999
commit 5600d0d7c7
3 changed files with 27 additions and 5 deletions

View File

@ -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<CanvasItemMaterial> default_materials[4] = {};
int sprite_count;
@ -126,11 +129,21 @@ public:
}
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<Point2> &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);

View File

@ -297,4 +297,6 @@ public:
virtual bool _edit_use_rect() const;
#endif
#endif
static void clear_statics();
};

View File

@ -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() {