From 02802b1d0e2586dbf6dedd7e4de3589f7eb62680 Mon Sep 17 00:00:00 2001 From: Bastiaan Olij Date: Sat, 11 Sep 2021 12:31:10 +1000 Subject: [PATCH] Add in driver types and rejig code to make it easier to extend --- godot-headers-temp/godot/gdnative_interface.h | 2 + include/godot_cpp/godot.hpp | 14 +-- src/godot.cpp | 100 ++++++------------ 3 files changed, 39 insertions(+), 77 deletions(-) diff --git a/godot-headers-temp/godot/gdnative_interface.h b/godot-headers-temp/godot/gdnative_interface.h index 63f4b091..30346f23 100644 --- a/godot-headers-temp/godot/gdnative_interface.h +++ b/godot-headers-temp/godot/gdnative_interface.h @@ -449,6 +449,8 @@ typedef enum { GDNATIVE_INITIALIZATION_SERVERS, GDNATIVE_INITIALIZATION_SCENE, GDNATIVE_INITIALIZATION_EDITOR, + GDNATIVE_INITIALIZATION_DRIVER, + GDNATIVE_MAX_INITIALIZATION_LEVEL, } GDNativeInitializationLevel; typedef struct { diff --git a/include/godot_cpp/godot.hpp b/include/godot_cpp/godot.hpp index eedc1c51..7cab430d 100644 --- a/include/godot_cpp/godot.hpp +++ b/include/godot_cpp/godot.hpp @@ -47,14 +47,8 @@ class GDExtensionBinding { public: using Callback = void (*)(); - static Callback core_init; - static Callback server_init; - static Callback scene_init; - static Callback editor_init; - static Callback core_terminate; - static Callback server_terminate; - static Callback scene_terminate; - static Callback editor_terminate; + static Callback init_callbacks[GDNATIVE_MAX_INITIALIZATION_LEVEL]; + static Callback terminate_callbacks[GDNATIVE_MAX_INITIALIZATION_LEVEL]; static GDNativeBool init(const GDNativeInterface *p_interface, const GDNativeExtensionClassLibraryPtr p_library, GDNativeInitialization *r_initialization); public: @@ -73,16 +67,18 @@ public: InitObject(const GDNativeInterface *p_interface, const GDNativeExtensionClassLibraryPtr p_library, GDNativeInitialization *r_initialization) : interface(p_interface), library(p_library), - initialization(r_initialization) {} + initialization(r_initialization) {}; void register_core_initializer(Callback p_core_init) const; void register_server_initializer(Callback p_server_init) const; void register_scene_initializer(Callback p_scene_init) const; void register_editor_initializer(Callback p_editor_init) const; + void register_driver_initializer(Callback p_driver_init) const; void register_core_terminator(Callback p_core_terminate) const; void register_server_terminator(Callback p_server_terminate) const; void register_scene_terminator(Callback p_scene_terminate) const; void register_editor_terminator(Callback p_editor_terminate) const; + void register_driver_terminator(Callback p_driver_terminate) const; GDNativeBool init() const; }; diff --git a/src/godot.cpp b/src/godot.cpp index fa45b197..15fdc6f4 100644 --- a/src/godot.cpp +++ b/src/godot.cpp @@ -47,14 +47,8 @@ void *token = nullptr; } // namespace internal -GDExtensionBinding::Callback GDExtensionBinding::core_init = nullptr; -GDExtensionBinding::Callback GDExtensionBinding::server_init = nullptr; -GDExtensionBinding::Callback GDExtensionBinding::scene_init = nullptr; -GDExtensionBinding::Callback GDExtensionBinding::editor_init = nullptr; -GDExtensionBinding::Callback GDExtensionBinding::core_terminate = nullptr; -GDExtensionBinding::Callback GDExtensionBinding::server_terminate = nullptr; -GDExtensionBinding::Callback GDExtensionBinding::scene_terminate = nullptr; -GDExtensionBinding::Callback GDExtensionBinding::editor_terminate = nullptr; +GDExtensionBinding::Callback GDExtensionBinding::init_callbacks[GDNATIVE_MAX_INITIALIZATION_LEVEL] = {}; +GDExtensionBinding::Callback GDExtensionBinding::terminate_callbacks[GDNATIVE_MAX_INITIALIZATION_LEVEL] = {}; GDNativeBool GDExtensionBinding::init(const GDNativeInterface *p_interface, const GDNativeExtensionClassLibraryPtr p_library, GDNativeInitialization *r_initialization) { internal::interface = p_interface; @@ -64,17 +58,14 @@ GDNativeBool GDExtensionBinding::init(const GDNativeInterface *p_interface, cons r_initialization->initialize = initialize_level; r_initialization->deinitialize = deinitialize_level; - if (core_init) { - r_initialization->minimum_initialization_level = GDNATIVE_INITIALIZATION_CORE; - } else if (server_init) { - r_initialization->minimum_initialization_level = GDNATIVE_INITIALIZATION_SERVERS; - } else if (scene_init) { - r_initialization->minimum_initialization_level = GDNATIVE_INITIALIZATION_SCENE; - } else if (editor_init) { - r_initialization->minimum_initialization_level = GDNATIVE_INITIALIZATION_EDITOR; - } else { - ERR_FAIL_V_MSG(false, "At least one initialization callback must be defined."); + bool has_init = false; + for (int i = 0; i < GDNATIVE_MAX_INITIALIZATION_LEVEL; i++) { + if (init_callbacks[i]) { + r_initialization->minimum_initialization_level = GDNativeInitializationLevel(i); + has_init = true; + } } + ERR_FAIL_COND_V_MSG(!has_init, false, "At least one initialization callback must be defined."); Variant::init_bindings(); @@ -83,55 +74,20 @@ GDNativeBool GDExtensionBinding::init(const GDNativeInterface *p_interface, cons void GDExtensionBinding::initialize_level(void *userdata, GDNativeInitializationLevel p_level) { ClassDB::current_level = p_level; - switch (p_level) { - case GDNATIVE_INITIALIZATION_CORE: - if (core_init) { - core_init(); - } - break; - case GDNATIVE_INITIALIZATION_SERVERS: - if (server_init) { - server_init(); - } - break; - case GDNATIVE_INITIALIZATION_SCENE: - if (scene_init) { - scene_init(); - } - break; - case GDNATIVE_INITIALIZATION_EDITOR: - if (editor_init) { - editor_init(); - } - break; + + if (init_callbacks[p_level]) { + init_callbacks[p_level](); } + ClassDB::initialize(p_level); } void GDExtensionBinding::deinitialize_level(void *userdata, GDNativeInitializationLevel p_level) { ClassDB::current_level = p_level; ClassDB::deinitialize(p_level); - switch (p_level) { - case GDNATIVE_INITIALIZATION_CORE: - if (core_terminate) { - core_terminate(); - } - break; - case GDNATIVE_INITIALIZATION_SERVERS: - if (server_terminate) { - server_terminate(); - } - break; - case GDNATIVE_INITIALIZATION_SCENE: - if (scene_terminate) { - scene_terminate(); - } - break; - case GDNATIVE_INITIALIZATION_EDITOR: - if (editor_terminate) { - editor_terminate(); - } - break; + + if (terminate_callbacks[p_level]) { + terminate_callbacks[p_level](); } } @@ -147,35 +103,43 @@ void GDExtensionBinding::free_instance_callback(void *p_token, void *p_instance, } void GDExtensionBinding::InitObject::register_core_initializer(Callback p_core_init) const { - GDExtensionBinding::core_init = p_core_init; + GDExtensionBinding::init_callbacks[GDNATIVE_INITIALIZATION_CORE] = p_core_init; } void GDExtensionBinding::InitObject::register_server_initializer(Callback p_server_init) const { - GDExtensionBinding::server_init = p_server_init; + GDExtensionBinding::init_callbacks[GDNATIVE_INITIALIZATION_SERVERS] = p_server_init; } void GDExtensionBinding::InitObject::register_scene_initializer(Callback p_scene_init) const { - GDExtensionBinding::scene_init = p_scene_init; + GDExtensionBinding::init_callbacks[GDNATIVE_INITIALIZATION_SCENE] = p_scene_init; } void GDExtensionBinding::InitObject::register_editor_initializer(Callback p_editor_init) const { - GDExtensionBinding::editor_init = p_editor_init; + GDExtensionBinding::init_callbacks[GDNATIVE_INITIALIZATION_EDITOR] = p_editor_init; +} + +void GDExtensionBinding::InitObject::register_driver_initializer(Callback p_driver_init) const { + GDExtensionBinding::init_callbacks[GDNATIVE_INITIALIZATION_DRIVER] = p_driver_init; } void GDExtensionBinding::InitObject::register_core_terminator(Callback p_core_terminate) const { - GDExtensionBinding::core_terminate = p_core_terminate; + GDExtensionBinding::terminate_callbacks[GDNATIVE_INITIALIZATION_CORE] = p_core_terminate; } void GDExtensionBinding::InitObject::register_server_terminator(Callback p_server_terminate) const { - GDExtensionBinding::server_terminate = p_server_terminate; + GDExtensionBinding::terminate_callbacks[GDNATIVE_INITIALIZATION_SERVERS] = p_server_terminate; } void GDExtensionBinding::InitObject::register_scene_terminator(Callback p_scene_terminate) const { - GDExtensionBinding::scene_terminate = p_scene_terminate; + GDExtensionBinding::terminate_callbacks[GDNATIVE_INITIALIZATION_SCENE] = p_scene_terminate; } void GDExtensionBinding::InitObject::register_editor_terminator(Callback p_editor_terminate) const { - GDExtensionBinding::editor_terminate = p_editor_terminate; + GDExtensionBinding::terminate_callbacks[GDNATIVE_INITIALIZATION_EDITOR] = p_editor_terminate; +} + +void GDExtensionBinding::InitObject::register_driver_terminator(Callback p_driver_terminate) const { + GDExtensionBinding::terminate_callbacks[GDNATIVE_INITIALIZATION_DRIVER] = p_driver_terminate; } GDNativeBool GDExtensionBinding::InitObject::init() const {