|
@@ -41,12 +41,21 @@ namespace godot {
|
|
|
|
|
|
namespace internal {
|
|
|
|
|
|
-const GDNativeInterface *interface;
|
|
|
-GDNativeExtensionClassLibraryPtr library;
|
|
|
-void *token;
|
|
|
+const GDNativeInterface *interface = nullptr;
|
|
|
+GDNativeExtensionClassLibraryPtr library = nullptr;
|
|
|
+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;
|
|
|
+
|
|
|
GDNativeBool GDExtensionBinding::init(const GDNativeInterface *p_interface, const GDNativeExtensionClassLibraryPtr p_library, GDNativeInitialization *r_initialization) {
|
|
|
internal::interface = p_interface;
|
|
|
internal::library = p_library;
|
|
@@ -54,7 +63,18 @@ GDNativeBool GDExtensionBinding::init(const GDNativeInterface *p_interface, cons
|
|
|
|
|
|
r_initialization->initialize = initialize_level;
|
|
|
r_initialization->deinitialize = deinitialize_level;
|
|
|
- r_initialization->minimum_initialization_level = GDNATIVE_INITIALIZATION_CORE;
|
|
|
+
|
|
|
+ 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.");
|
|
|
+ }
|
|
|
|
|
|
Variant::init_bindings();
|
|
|
|
|
@@ -62,11 +82,57 @@ 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;
|
|
|
+ }
|
|
|
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;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
void *GDExtensionBinding::create_instance_callback(void *p_token, void *p_instance) {
|
|
@@ -80,6 +146,42 @@ void GDExtensionBinding::free_instance_callback(void *p_token, void *p_instance,
|
|
|
memdelete((Wrapped *)p_binding);
|
|
|
}
|
|
|
|
|
|
+void GDExtensionBinding::InitObject::register_core_initializer(Callback p_core_init) const {
|
|
|
+ GDExtensionBinding::core_init = p_core_init;
|
|
|
+}
|
|
|
+
|
|
|
+void GDExtensionBinding::InitObject::register_server_initializer(Callback p_server_init) const {
|
|
|
+ GDExtensionBinding::server_init = p_server_init;
|
|
|
+}
|
|
|
+
|
|
|
+void GDExtensionBinding::InitObject::register_scene_initializer(Callback p_scene_init) const {
|
|
|
+ GDExtensionBinding::scene_init = p_scene_init;
|
|
|
+}
|
|
|
+
|
|
|
+void GDExtensionBinding::InitObject::register_editor_initializer(Callback p_editor_init) const {
|
|
|
+ GDExtensionBinding::editor_init = p_editor_init;
|
|
|
+}
|
|
|
+
|
|
|
+void GDExtensionBinding::InitObject::register_core_terminator(Callback p_core_terminate) const {
|
|
|
+ GDExtensionBinding::core_terminate = p_core_terminate;
|
|
|
+}
|
|
|
+
|
|
|
+void GDExtensionBinding::InitObject::register_server_terminator(Callback p_server_terminate) const {
|
|
|
+ GDExtensionBinding::server_terminate = p_server_terminate;
|
|
|
+}
|
|
|
+
|
|
|
+void GDExtensionBinding::InitObject::register_scene_terminator(Callback p_scene_terminate) const {
|
|
|
+ GDExtensionBinding::scene_terminate = p_scene_terminate;
|
|
|
+}
|
|
|
+
|
|
|
+void GDExtensionBinding::InitObject::register_editor_terminator(Callback p_editor_terminate) const {
|
|
|
+ GDExtensionBinding::editor_terminate = p_editor_terminate;
|
|
|
+}
|
|
|
+
|
|
|
+GDNativeBool GDExtensionBinding::InitObject::init() const {
|
|
|
+ return GDExtensionBinding::init(interface, library, initialization);
|
|
|
+}
|
|
|
+
|
|
|
} // namespace godot
|
|
|
|
|
|
extern "C" {
|