Forráskód Böngészése

Add in driver types and rejig code to make it easier to extend

Bastiaan Olij 3 éve
szülő
commit
02802b1d0e

+ 2 - 0
godot-headers-temp/godot/gdnative_interface.h

@@ -449,6 +449,8 @@ typedef enum {
 	GDNATIVE_INITIALIZATION_SERVERS,
 	GDNATIVE_INITIALIZATION_SERVERS,
 	GDNATIVE_INITIALIZATION_SCENE,
 	GDNATIVE_INITIALIZATION_SCENE,
 	GDNATIVE_INITIALIZATION_EDITOR,
 	GDNATIVE_INITIALIZATION_EDITOR,
+	GDNATIVE_INITIALIZATION_DRIVER,
+	GDNATIVE_MAX_INITIALIZATION_LEVEL,
 } GDNativeInitializationLevel;
 } GDNativeInitializationLevel;
 
 
 typedef struct {
 typedef struct {

+ 5 - 9
include/godot_cpp/godot.hpp

@@ -47,14 +47,8 @@ class GDExtensionBinding {
 public:
 public:
 	using Callback = void (*)();
 	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);
 	static GDNativeBool init(const GDNativeInterface *p_interface, const GDNativeExtensionClassLibraryPtr p_library, GDNativeInitialization *r_initialization);
 
 
 public:
 public:
@@ -73,16 +67,18 @@ public:
 		InitObject(const GDNativeInterface *p_interface, const GDNativeExtensionClassLibraryPtr p_library, GDNativeInitialization *r_initialization) :
 		InitObject(const GDNativeInterface *p_interface, const GDNativeExtensionClassLibraryPtr p_library, GDNativeInitialization *r_initialization) :
 				interface(p_interface),
 				interface(p_interface),
 				library(p_library),
 				library(p_library),
-				initialization(r_initialization) {}
+				initialization(r_initialization) {};
 
 
 		void register_core_initializer(Callback p_core_init) const;
 		void register_core_initializer(Callback p_core_init) const;
 		void register_server_initializer(Callback p_server_init) const;
 		void register_server_initializer(Callback p_server_init) const;
 		void register_scene_initializer(Callback p_scene_init) const;
 		void register_scene_initializer(Callback p_scene_init) const;
 		void register_editor_initializer(Callback p_editor_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_core_terminator(Callback p_core_terminate) const;
 		void register_server_terminator(Callback p_server_terminate) const;
 		void register_server_terminator(Callback p_server_terminate) const;
 		void register_scene_terminator(Callback p_scene_terminate) const;
 		void register_scene_terminator(Callback p_scene_terminate) const;
 		void register_editor_terminator(Callback p_editor_terminate) const;
 		void register_editor_terminator(Callback p_editor_terminate) const;
+		void register_driver_terminator(Callback p_driver_terminate) const;
 
 
 		GDNativeBool init() const;
 		GDNativeBool init() const;
 	};
 	};

+ 32 - 68
src/godot.cpp

@@ -47,14 +47,8 @@ void *token = nullptr;
 
 
 } // namespace internal
 } // 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) {
 GDNativeBool GDExtensionBinding::init(const GDNativeInterface *p_interface, const GDNativeExtensionClassLibraryPtr p_library, GDNativeInitialization *r_initialization) {
 	internal::interface = p_interface;
 	internal::interface = p_interface;
@@ -64,17 +58,14 @@ GDNativeBool GDExtensionBinding::init(const GDNativeInterface *p_interface, cons
 	r_initialization->initialize = initialize_level;
 	r_initialization->initialize = initialize_level;
 	r_initialization->deinitialize = deinitialize_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();
 	Variant::init_bindings();
 
 
@@ -83,55 +74,20 @@ GDNativeBool GDExtensionBinding::init(const GDNativeInterface *p_interface, cons
 
 
 void GDExtensionBinding::initialize_level(void *userdata, GDNativeInitializationLevel p_level) {
 void GDExtensionBinding::initialize_level(void *userdata, GDNativeInitializationLevel p_level) {
 	ClassDB::current_level = 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);
 	ClassDB::initialize(p_level);
 }
 }
 
 
 void GDExtensionBinding::deinitialize_level(void *userdata, GDNativeInitializationLevel p_level) {
 void GDExtensionBinding::deinitialize_level(void *userdata, GDNativeInitializationLevel p_level) {
 	ClassDB::current_level = p_level;
 	ClassDB::current_level = p_level;
 	ClassDB::deinitialize(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 {
 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 {
 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 {
 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 {
 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 {
 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 {
 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 {
 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 {
 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 {
 GDNativeBool GDExtensionBinding::InitObject::init() const {