Browse Source

Merge pull request #60723 from reduz/refactor-module-initialization

Rémi Verschelde 3 years ago
parent
commit
84f64ddde9
100 changed files with 902 additions and 451 deletions
  1. 0 1
      core/extension/gdnative_interface.h
  2. 0 1
      core/extension/native_extension.cpp
  3. 4 5
      core/extension/native_extension.h
  4. 1 3
      doc/classes/NativeExtension.xml
  5. 0 2
      drivers/register_driver_types.cpp
  6. 0 4
      editor/editor_node.cpp
  7. 38 11
      main/main.cpp
  8. 12 23
      methods.py
  9. 10 2
      modules/basis_universal/register_types.cpp
  10. 4 2
      modules/basis_universal/register_types.h
  11. 10 2
      modules/bmp/register_types.cpp
  12. 4 2
      modules/bmp/register_types.h
  13. 9 2
      modules/camera/register_types.cpp
  14. 4 2
      modules/camera/register_types.h
  15. 19 13
      modules/csg/register_types.cpp
  16. 4 2
      modules/csg/register_types.h
  17. 10 2
      modules/cvtt/register_types.cpp
  18. 4 2
      modules/cvtt/register_types.h
  19. 10 2
      modules/dds/register_types.cpp
  20. 4 2
      modules/dds/register_types.h
  21. 9 2
      modules/denoise/register_types.cpp
  22. 4 2
      modules/denoise/register_types.h
  23. 10 2
      modules/enet/register_types.cpp
  24. 4 2
      modules/enet/register_types.h
  25. 9 2
      modules/etcpak/register_types.cpp
  26. 6 2
      modules/etcpak/register_types.h
  27. 10 2
      modules/freetype/register_types.cpp
  28. 4 2
      modules/freetype/register_types.h
  29. 39 31
      modules/gdscript/register_types.cpp
  30. 4 2
      modules/gdscript/register_types.h
  31. 9 4
      modules/glslang/register_types.cpp
  32. 4 3
      modules/glslang/register_types.h
  33. 40 33
      modules/gltf/register_types.cpp
  34. 4 2
      modules/gltf/register_types.h
  35. 11 4
      modules/gridmap/register_types.cpp
  36. 4 2
      modules/gridmap/register_types.h
  37. 10 2
      modules/hdr/register_types.cpp
  38. 4 2
      modules/hdr/register_types.h
  39. 10 2
      modules/jpg/register_types.cpp
  40. 4 2
      modules/jpg/register_types.h
  41. 9 2
      modules/jsonrpc/register_types.cpp
  42. 4 2
      modules/jsonrpc/register_types.h
  43. 9 2
      modules/lightmapper_rd/register_types.cpp
  44. 4 2
      modules/lightmapper_rd/register_types.h
  45. 10 2
      modules/mbedtls/register_types.cpp
  46. 4 2
      modules/mbedtls/register_types.h
  47. 10 2
      modules/meshoptimizer/register_types.cpp
  48. 4 2
      modules/meshoptimizer/register_types.h
  49. 9 2
      modules/minimp3/register_types.cpp
  50. 4 2
      modules/minimp3/register_types.h
  51. 10 2
      modules/mobile_vr/register_types.cpp
  52. 4 2
      modules/mobile_vr/register_types.h
  53. 10 2
      modules/mono/register_types.cpp
  54. 4 2
      modules/mono/register_types.h
  55. 10 2
      modules/msdfgen/register_types.cpp
  56. 4 2
      modules/msdfgen/register_types.h
  57. 15 7
      modules/navigation/register_types.cpp
  58. 4 2
      modules/navigation/register_types.h
  59. 13 6
      modules/noise/register_types.cpp
  60. 4 2
      modules/noise/register_types.h
  61. 10 2
      modules/ogg/register_types.cpp
  62. 4 2
      modules/ogg/register_types.h
  63. 34 28
      modules/openxr/register_types.cpp
  64. 4 3
      modules/openxr/register_types.h
  65. 10 2
      modules/raycast/register_types.cpp
  66. 4 2
      modules/raycast/register_types.h
  67. 9 2
      modules/regex/register_types.cpp
  68. 4 2
      modules/regex/register_types.h
  69. 11 3
      modules/register_module_types.h
  70. 10 2
      modules/squish/register_types.cpp
  71. 4 2
      modules/squish/register_types.h
  72. 10 2
      modules/svg/register_types.cpp
  73. 4 2
      modules/svg/register_types.h
  74. 12 7
      modules/text_server_adv/register_types.cpp
  75. 8 4
      modules/text_server_adv/register_types.h
  76. 12 7
      modules/text_server_fb/register_types.cpp
  77. 8 4
      modules/text_server_fb/register_types.h
  78. 10 2
      modules/tga/register_types.cpp
  79. 4 2
      modules/tga/register_types.h
  80. 10 2
      modules/theora/register_types.cpp
  81. 4 2
      modules/theora/register_types.h
  82. 10 2
      modules/tinyexr/register_types.cpp
  83. 4 2
      modules/tinyexr/register_types.h
  84. 9 2
      modules/upnp/register_types.cpp
  85. 4 2
      modules/upnp/register_types.h
  86. 10 2
      modules/vhacd/register_types.cpp
  87. 4 2
      modules/vhacd/register_types.h
  88. 90 81
      modules/visual_script/register_types.cpp
  89. 4 2
      modules/visual_script/register_types.h
  90. 10 2
      modules/vorbis/register_types.cpp
  91. 4 2
      modules/vorbis/register_types.h
  92. 10 2
      modules/webp/register_types.cpp
  93. 4 2
      modules/webp/register_types.h
  94. 10 2
      modules/webrtc/register_types.cpp
  95. 4 2
      modules/webrtc/register_types.h
  96. 21 13
      modules/websocket/register_types.cpp
  97. 4 2
      modules/websocket/register_types.h
  98. 10 2
      modules/webxr/register_types.cpp
  99. 4 2
      modules/webxr/register_types.h
  100. 9 2
      modules/xatlas_unwrap/register_types.cpp

+ 0 - 1
core/extension/gdnative_interface.h

@@ -556,7 +556,6 @@ typedef enum {
 	GDNATIVE_INITIALIZATION_CORE,
 	GDNATIVE_INITIALIZATION_CORE,
 	GDNATIVE_INITIALIZATION_SERVERS,
 	GDNATIVE_INITIALIZATION_SERVERS,
 	GDNATIVE_INITIALIZATION_SCENE,
 	GDNATIVE_INITIALIZATION_SCENE,
-	GDNATIVE_INITIALIZATION_DRIVER,
 	GDNATIVE_INITIALIZATION_EDITOR,
 	GDNATIVE_INITIALIZATION_EDITOR,
 	GDNATIVE_MAX_INITIALIZATION_LEVEL,
 	GDNATIVE_MAX_INITIALIZATION_LEVEL,
 } GDNativeInitializationLevel;
 } GDNativeInitializationLevel;

+ 0 - 1
core/extension/native_extension.cpp

@@ -334,7 +334,6 @@ void NativeExtension::_bind_methods() {
 	BIND_ENUM_CONSTANT(INITIALIZATION_LEVEL_CORE);
 	BIND_ENUM_CONSTANT(INITIALIZATION_LEVEL_CORE);
 	BIND_ENUM_CONSTANT(INITIALIZATION_LEVEL_SERVERS);
 	BIND_ENUM_CONSTANT(INITIALIZATION_LEVEL_SERVERS);
 	BIND_ENUM_CONSTANT(INITIALIZATION_LEVEL_SCENE);
 	BIND_ENUM_CONSTANT(INITIALIZATION_LEVEL_SCENE);
-	BIND_ENUM_CONSTANT(INITIALIZATION_LEVEL_DRIVER);
 	BIND_ENUM_CONSTANT(INITIALIZATION_LEVEL_EDITOR);
 	BIND_ENUM_CONSTANT(INITIALIZATION_LEVEL_EDITOR);
 }
 }
 
 

+ 4 - 5
core/extension/native_extension.h

@@ -70,11 +70,10 @@ public:
 	void close_library();
 	void close_library();
 
 
 	enum InitializationLevel {
 	enum InitializationLevel {
-		INITIALIZATION_LEVEL_CORE,
-		INITIALIZATION_LEVEL_SERVERS,
-		INITIALIZATION_LEVEL_SCENE,
-		INITIALIZATION_LEVEL_DRIVER,
-		INITIALIZATION_LEVEL_EDITOR,
+		INITIALIZATION_LEVEL_CORE = GDNATIVE_INITIALIZATION_CORE,
+		INITIALIZATION_LEVEL_SERVERS = GDNATIVE_INITIALIZATION_SERVERS,
+		INITIALIZATION_LEVEL_SCENE = GDNATIVE_INITIALIZATION_SCENE,
+		INITIALIZATION_LEVEL_EDITOR = GDNATIVE_INITIALIZATION_EDITOR
 	};
 	};
 
 
 	bool is_library_open() const;
 	bool is_library_open() const;

+ 1 - 3
doc/classes/NativeExtension.xml

@@ -43,9 +43,7 @@
 		</constant>
 		</constant>
 		<constant name="INITIALIZATION_LEVEL_SCENE" value="2" enum="InitializationLevel">
 		<constant name="INITIALIZATION_LEVEL_SCENE" value="2" enum="InitializationLevel">
 		</constant>
 		</constant>
-		<constant name="INITIALIZATION_LEVEL_DRIVER" value="3" enum="InitializationLevel">
-		</constant>
-		<constant name="INITIALIZATION_LEVEL_EDITOR" value="4" enum="InitializationLevel">
+		<constant name="INITIALIZATION_LEVEL_EDITOR" value="3" enum="InitializationLevel">
 		</constant>
 		</constant>
 	</constants>
 	</constants>
 </class>
 </class>

+ 0 - 2
drivers/register_driver_types.cpp

@@ -55,9 +55,7 @@ void unregister_core_driver_types() {
 }
 }
 
 
 void register_driver_types() {
 void register_driver_types() {
-	NativeExtensionManager::get_singleton()->initialize_extensions(NativeExtension::INITIALIZATION_LEVEL_DRIVER);
 }
 }
 
 
 void unregister_driver_types() {
 void unregister_driver_types() {
-	NativeExtensionManager::get_singleton()->deinitialize_extensions(NativeExtension::INITIALIZATION_LEVEL_DRIVER);
 }
 }

+ 0 - 4
editor/editor_node.cpp

@@ -31,7 +31,6 @@
 #include "editor_node.h"
 #include "editor_node.h"
 
 
 #include "core/config/project_settings.h"
 #include "core/config/project_settings.h"
-#include "core/extension/native_extension_manager.h"
 #include "core/input/input.h"
 #include "core/input/input.h"
 #include "core/io/config_file.h"
 #include "core/io/config_file.h"
 #include "core/io/file_access.h"
 #include "core/io/file_access.h"
@@ -3942,12 +3941,9 @@ void EditorNode::register_editor_types() {
 	GDREGISTER_CLASS(EditorScenePostImport);
 	GDREGISTER_CLASS(EditorScenePostImport);
 	GDREGISTER_CLASS(EditorCommandPalette);
 	GDREGISTER_CLASS(EditorCommandPalette);
 	GDREGISTER_CLASS(EditorDebuggerPlugin);
 	GDREGISTER_CLASS(EditorDebuggerPlugin);
-
-	NativeExtensionManager::get_singleton()->initialize_extensions(NativeExtension::INITIALIZATION_LEVEL_EDITOR);
 }
 }
 
 
 void EditorNode::unregister_editor_types() {
 void EditorNode::unregister_editor_types() {
-	NativeExtensionManager::get_singleton()->deinitialize_extensions(NativeExtension::INITIALIZATION_LEVEL_EDITOR);
 	_init_callbacks.clear();
 	_init_callbacks.clear();
 	if (EditorPaths::get_singleton()) {
 	if (EditorPaths::get_singleton()) {
 		EditorPaths::free();
 		EditorPaths::free();

+ 38 - 11
main/main.cpp

@@ -35,6 +35,7 @@
 #include "core/crypto/crypto.h"
 #include "core/crypto/crypto.h"
 #include "core/debugger/engine_debugger.h"
 #include "core/debugger/engine_debugger.h"
 #include "core/extension/extension_api_dump.h"
 #include "core/extension/extension_api_dump.h"
+#include "core/extension/native_extension_manager.h"
 #include "core/input/input.h"
 #include "core/input/input.h"
 #include "core/input/input_map.h"
 #include "core/input/input_map.h"
 #include "core/io/dir_access.h"
 #include "core/io/dir_access.h"
@@ -406,15 +407,18 @@ Error Main::test_setup() {
 		tsman->add_interface(ts);
 		tsman->add_interface(ts);
 	}
 	}
 
 
+	// From `Main::setup2()`.
+	initialize_modules(MODULE_INITIALIZATION_LEVEL_CORE);
 	register_core_extensions();
 	register_core_extensions();
 
 
-	// From `Main::setup2()`.
-	preregister_module_types();
 	preregister_server_types();
 	preregister_server_types();
 
 
 	register_core_singletons();
 	register_core_singletons();
 
 
+	/** INITIALIZE SERVERS **/
 	register_server_types();
 	register_server_types();
+	initialize_modules(MODULE_INITIALIZATION_LEVEL_SERVERS);
+	NativeExtensionManager::get_singleton()->initialize_extensions(NativeExtension::INITIALIZATION_LEVEL_SERVERS);
 
 
 	translation_server->setup(); //register translations, load them, etc.
 	translation_server->setup(); //register translations, load them, etc.
 	if (!locale.is_empty()) {
 	if (!locale.is_empty()) {
@@ -428,16 +432,20 @@ Error Main::test_setup() {
 	register_scene_types();
 	register_scene_types();
 	register_driver_types();
 	register_driver_types();
 
 
+	initialize_modules(MODULE_INITIALIZATION_LEVEL_SCENE);
+	NativeExtensionManager::get_singleton()->initialize_extensions(NativeExtension::INITIALIZATION_LEVEL_SCENE);
+
 #ifdef TOOLS_ENABLED
 #ifdef TOOLS_ENABLED
 	ClassDB::set_current_api(ClassDB::API_EDITOR);
 	ClassDB::set_current_api(ClassDB::API_EDITOR);
 	EditorNode::register_editor_types();
 	EditorNode::register_editor_types();
 
 
+	initialize_modules(MODULE_INITIALIZATION_LEVEL_EDITOR);
+	NativeExtensionManager::get_singleton()->initialize_extensions(NativeExtension::INITIALIZATION_LEVEL_EDITOR);
+
 	ClassDB::set_current_api(ClassDB::API_CORE);
 	ClassDB::set_current_api(ClassDB::API_CORE);
 #endif
 #endif
 	register_platform_apis();
 	register_platform_apis();
 
 
-	register_module_types();
-
 	// Theme needs modules to be initialized so that sub-resources can be loaded.
 	// Theme needs modules to be initialized so that sub-resources can be loaded.
 	initialize_theme();
 	initialize_theme();
 
 
@@ -479,13 +487,19 @@ void Main::test_cleanup() {
 	ResourceSaver::remove_custom_savers();
 	ResourceSaver::remove_custom_savers();
 
 
 #ifdef TOOLS_ENABLED
 #ifdef TOOLS_ENABLED
+	NativeExtensionManager::get_singleton()->deinitialize_extensions(NativeExtension::INITIALIZATION_LEVEL_EDITOR);
+	uninitialize_modules(MODULE_INITIALIZATION_LEVEL_EDITOR);
 	EditorNode::unregister_editor_types();
 	EditorNode::unregister_editor_types();
 #endif
 #endif
 
 
-	unregister_module_types();
+	NativeExtensionManager::get_singleton()->deinitialize_extensions(NativeExtension::INITIALIZATION_LEVEL_SCENE);
+	uninitialize_modules(MODULE_INITIALIZATION_LEVEL_SCENE);
 	unregister_platform_apis();
 	unregister_platform_apis();
 	unregister_driver_types();
 	unregister_driver_types();
 	unregister_scene_types();
 	unregister_scene_types();
+
+	NativeExtensionManager::get_singleton()->deinitialize_extensions(NativeExtension::INITIALIZATION_LEVEL_SERVERS);
+	uninitialize_modules(MODULE_INITIALIZATION_LEVEL_SERVERS);
 	unregister_server_types();
 	unregister_server_types();
 
 
 	OS::get_singleton()->finalize();
 	OS::get_singleton()->finalize();
@@ -507,6 +521,7 @@ void Main::test_cleanup() {
 	}
 	}
 
 
 	unregister_core_driver_types();
 	unregister_core_driver_types();
+	uninitialize_modules(MODULE_INITIALIZATION_LEVEL_CORE);
 	unregister_core_extensions();
 	unregister_core_extensions();
 	unregister_core_types();
 	unregister_core_types();
 
 
@@ -1166,6 +1181,7 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
 	// Initialize user data dir.
 	// Initialize user data dir.
 	OS::get_singleton()->ensure_user_data_dir();
 	OS::get_singleton()->ensure_user_data_dir();
 
 
+	initialize_modules(MODULE_INITIALIZATION_LEVEL_CORE);
 	register_core_extensions(); // core extensions must be registered after globals setup and before display
 	register_core_extensions(); // core extensions must be registered after globals setup and before display
 
 
 	ResourceUID::get_singleton()->load_from_cache(); // load UUIDs from cache.
 	ResourceUID::get_singleton()->load_from_cache(); // load UUIDs from cache.
@@ -1584,7 +1600,6 @@ Error Main::setup2(Thread::ID p_main_tid_override) {
 		tsman->add_interface(ts);
 		tsman->add_interface(ts);
 	}
 	}
 
 
-	preregister_module_types();
 	preregister_server_types();
 	preregister_server_types();
 
 
 	// Print engine name and version
 	// Print engine name and version
@@ -1751,6 +1766,8 @@ Error Main::setup2(Thread::ID p_main_tid_override) {
 	}
 	}
 
 
 	register_server_types();
 	register_server_types();
+	initialize_modules(MODULE_INITIALIZATION_LEVEL_SERVERS);
+	NativeExtensionManager::get_singleton()->initialize_extensions(NativeExtension::INITIALIZATION_LEVEL_SERVERS);
 
 
 	MAIN_PRINT("Main: Load Boot Image");
 	MAIN_PRINT("Main: Load Boot Image");
 
 
@@ -1925,14 +1942,16 @@ Error Main::setup2(Thread::ID p_main_tid_override) {
 	MAIN_PRINT("Main: Load Scene Types");
 	MAIN_PRINT("Main: Load Scene Types");
 
 
 	register_scene_types();
 	register_scene_types();
-
-	MAIN_PRINT("Main: Load Driver Types");
-
 	register_driver_types();
 	register_driver_types();
 
 
+	initialize_modules(MODULE_INITIALIZATION_LEVEL_SCENE);
+	NativeExtensionManager::get_singleton()->initialize_extensions(NativeExtension::INITIALIZATION_LEVEL_SCENE);
+
 #ifdef TOOLS_ENABLED
 #ifdef TOOLS_ENABLED
 	ClassDB::set_current_api(ClassDB::API_EDITOR);
 	ClassDB::set_current_api(ClassDB::API_EDITOR);
 	EditorNode::register_editor_types();
 	EditorNode::register_editor_types();
+	initialize_modules(MODULE_INITIALIZATION_LEVEL_EDITOR);
+	NativeExtensionManager::get_singleton()->initialize_extensions(NativeExtension::INITIALIZATION_LEVEL_EDITOR);
 
 
 	ClassDB::set_current_api(ClassDB::API_CORE);
 	ClassDB::set_current_api(ClassDB::API_CORE);
 
 
@@ -1941,7 +1960,6 @@ Error Main::setup2(Thread::ID p_main_tid_override) {
 	MAIN_PRINT("Main: Load Modules");
 	MAIN_PRINT("Main: Load Modules");
 
 
 	register_platform_apis();
 	register_platform_apis();
-	register_module_types();
 
 
 	// Theme needs modules to be initialized so that sub-resources can be loaded.
 	// Theme needs modules to be initialized so that sub-resources can be loaded.
 	initialize_theme();
 	initialize_theme();
@@ -2852,15 +2870,23 @@ void Main::cleanup(bool p_force) {
 	}
 	}
 
 
 #ifdef TOOLS_ENABLED
 #ifdef TOOLS_ENABLED
+	NativeExtensionManager::get_singleton()->deinitialize_extensions(NativeExtension::INITIALIZATION_LEVEL_EDITOR);
+	uninitialize_modules(MODULE_INITIALIZATION_LEVEL_EDITOR);
 	EditorNode::unregister_editor_types();
 	EditorNode::unregister_editor_types();
+
 #endif
 #endif
 
 
 	ImageLoader::cleanup();
 	ImageLoader::cleanup();
 
 
-	unregister_module_types();
+	NativeExtensionManager::get_singleton()->deinitialize_extensions(NativeExtension::INITIALIZATION_LEVEL_SCENE);
+	uninitialize_modules(MODULE_INITIALIZATION_LEVEL_SCENE);
+
 	unregister_platform_apis();
 	unregister_platform_apis();
 	unregister_driver_types();
 	unregister_driver_types();
 	unregister_scene_types();
 	unregister_scene_types();
+
+	NativeExtensionManager::get_singleton()->deinitialize_extensions(NativeExtension::INITIALIZATION_LEVEL_SERVERS);
+	uninitialize_modules(MODULE_INITIALIZATION_LEVEL_SERVERS);
 	unregister_server_types();
 	unregister_server_types();
 
 
 	EngineDebugger::deinitialize();
 	EngineDebugger::deinitialize();
@@ -2929,6 +2955,7 @@ void Main::cleanup(bool p_force) {
 
 
 	unregister_core_driver_types();
 	unregister_core_driver_types();
 	unregister_core_extensions();
 	unregister_core_extensions();
+	uninitialize_modules(MODULE_INITIALIZATION_LEVEL_CORE);
 	unregister_core_types();
 	unregister_core_types();
 
 
 	OS::get_singleton()->finalize_core();
 	OS::get_singleton()->finalize_core();

+ 12 - 23
methods.py

@@ -266,25 +266,19 @@ def write_disabled_classes(class_list):
 
 
 def write_modules(modules):
 def write_modules(modules):
     includes_cpp = ""
     includes_cpp = ""
-    preregister_cpp = ""
-    register_cpp = ""
-    unregister_cpp = ""
+    initialize_cpp = ""
+    uninitialize_cpp = ""
 
 
     for name, path in modules.items():
     for name, path in modules.items():
         try:
         try:
             with open(os.path.join(path, "register_types.h")):
             with open(os.path.join(path, "register_types.h")):
                 includes_cpp += '#include "' + path + '/register_types.h"\n'
                 includes_cpp += '#include "' + path + '/register_types.h"\n'
-                preregister_cpp += "#ifdef MODULE_" + name.upper() + "_ENABLED\n"
-                preregister_cpp += "#ifdef MODULE_" + name.upper() + "_HAS_PREREGISTER\n"
-                preregister_cpp += "\tpreregister_" + name + "_types();\n"
-                preregister_cpp += "#endif\n"
-                preregister_cpp += "#endif\n"
-                register_cpp += "#ifdef MODULE_" + name.upper() + "_ENABLED\n"
-                register_cpp += "\tregister_" + name + "_types();\n"
-                register_cpp += "#endif\n"
-                unregister_cpp += "#ifdef MODULE_" + name.upper() + "_ENABLED\n"
-                unregister_cpp += "\tunregister_" + name + "_types();\n"
-                unregister_cpp += "#endif\n"
+                initialize_cpp += "#ifdef MODULE_" + name.upper() + "_ENABLED\n"
+                initialize_cpp += "\tinitialize_" + name + "_module(p_level);\n"
+                initialize_cpp += "#endif\n"
+                uninitialize_cpp += "#ifdef MODULE_" + name.upper() + "_ENABLED\n"
+                uninitialize_cpp += "\tuninitialize_" + name + "_module(p_level);\n"
+                uninitialize_cpp += "#endif\n"
         except OSError:
         except OSError:
             pass
             pass
 
 
@@ -296,22 +290,17 @@ def write_modules(modules):
 
 
 %s
 %s
 
 
-void preregister_module_types() {
+void initialize_modules(ModuleInitializationLevel p_level) {
 %s
 %s
 }
 }
 
 
-void register_module_types() {
-%s
-}
-
-void unregister_module_types() {
+void uninitialize_modules(ModuleInitializationLevel p_level) {
 %s
 %s
 }
 }
 """ % (
 """ % (
         includes_cpp,
         includes_cpp,
-        preregister_cpp,
-        register_cpp,
-        unregister_cpp,
+        initialize_cpp,
+        uninitialize_cpp,
     )
     )
 
 
     # NOTE: It is safe to generate this file here, since this is still executed serially
     # NOTE: It is safe to generate this file here, since this is still executed serially

+ 10 - 2
modules/basis_universal/register_types.cpp

@@ -266,7 +266,11 @@ static Ref<Image> basis_universal_unpacker(const Vector<uint8_t> &p_buffer) {
 	return basis_universal_unpacker_ptr(r, size);
 	return basis_universal_unpacker_ptr(r, size);
 }
 }
 
 
-void register_basis_universal_types() {
+void initialize_basis_universal_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+
 #ifdef TOOLS_ENABLED
 #ifdef TOOLS_ENABLED
 	using namespace basisu;
 	using namespace basisu;
 	using namespace basist;
 	using namespace basist;
@@ -277,7 +281,11 @@ void register_basis_universal_types() {
 	Image::basis_universal_unpacker_ptr = basis_universal_unpacker_ptr;
 	Image::basis_universal_unpacker_ptr = basis_universal_unpacker_ptr;
 }
 }
 
 
-void unregister_basis_universal_types() {
+void uninitialize_basis_universal_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+
 #ifdef TOOLS_ENABLED
 #ifdef TOOLS_ENABLED
 	Image::basis_universal_packer = nullptr;
 	Image::basis_universal_packer = nullptr;
 #endif
 #endif

+ 4 - 2
modules/basis_universal/register_types.h

@@ -31,7 +31,9 @@
 #ifndef BASIS_UNIVERSAL_REGISTER_TYPES_H
 #ifndef BASIS_UNIVERSAL_REGISTER_TYPES_H
 #define BASIS_UNIVERSAL_REGISTER_TYPES_H
 #define BASIS_UNIVERSAL_REGISTER_TYPES_H
 
 
-void register_basis_universal_types();
-void unregister_basis_universal_types();
+#include "modules/register_module_types.h"
+
+void initialize_basis_universal_module(ModuleInitializationLevel p_level);
+void uninitialize_basis_universal_module(ModuleInitializationLevel p_level);
 
 
 #endif // BASIS_UNIVERSAL_REGISTER_TYPES_H
 #endif // BASIS_UNIVERSAL_REGISTER_TYPES_H

+ 10 - 2
modules/bmp/register_types.cpp

@@ -34,11 +34,19 @@
 
 
 static ImageLoaderBMP *image_loader_bmp = nullptr;
 static ImageLoaderBMP *image_loader_bmp = nullptr;
 
 
-void register_bmp_types() {
+void initialize_bmp_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+
 	image_loader_bmp = memnew(ImageLoaderBMP);
 	image_loader_bmp = memnew(ImageLoaderBMP);
 	ImageLoader::add_image_format_loader(image_loader_bmp);
 	ImageLoader::add_image_format_loader(image_loader_bmp);
 }
 }
 
 
-void unregister_bmp_types() {
+void uninitialize_bmp_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+
 	memdelete(image_loader_bmp);
 	memdelete(image_loader_bmp);
 }
 }

+ 4 - 2
modules/bmp/register_types.h

@@ -31,7 +31,9 @@
 #ifndef BMP_REGISTER_TYPES_H
 #ifndef BMP_REGISTER_TYPES_H
 #define BMP_REGISTER_TYPES_H
 #define BMP_REGISTER_TYPES_H
 
 
-void register_bmp_types();
-void unregister_bmp_types();
+#include "modules/register_module_types.h"
+
+void initialize_bmp_module(ModuleInitializationLevel p_level);
+void uninitialize_bmp_module(ModuleInitializationLevel p_level);
 
 
 #endif // BMP_REGISTER_TYPES_H
 #endif // BMP_REGISTER_TYPES_H

+ 9 - 2
modules/camera/register_types.cpp

@@ -37,7 +37,11 @@
 #include "camera_osx.h"
 #include "camera_osx.h"
 #endif
 #endif
 
 
-void register_camera_types() {
+void initialize_camera_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+
 #if defined(WINDOWS_ENABLED)
 #if defined(WINDOWS_ENABLED)
 	CameraServer::make_default<CameraWindows>();
 	CameraServer::make_default<CameraWindows>();
 #endif
 #endif
@@ -46,5 +50,8 @@ void register_camera_types() {
 #endif
 #endif
 }
 }
 
 
-void unregister_camera_types() {
+void uninitialize_camera_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
 }
 }

+ 4 - 2
modules/camera/register_types.h

@@ -31,7 +31,9 @@
 #ifndef CAMERA_REGISTER_TYPES_H
 #ifndef CAMERA_REGISTER_TYPES_H
 #define CAMERA_REGISTER_TYPES_H
 #define CAMERA_REGISTER_TYPES_H
 
 
-void register_camera_types();
-void unregister_camera_types();
+#include "modules/register_module_types.h"
+
+void initialize_camera_module(ModuleInitializationLevel p_level);
+void uninitialize_camera_module(ModuleInitializationLevel p_level);
 
 
 #endif // CAMERA_REGISTER_TYPES_H
 #endif // CAMERA_REGISTER_TYPES_H

+ 19 - 13
modules/csg/register_types.cpp

@@ -38,23 +38,29 @@
 #include "editor/csg_gizmos.h"
 #include "editor/csg_gizmos.h"
 #endif
 #endif
 
 
-void register_csg_types() {
-	GDREGISTER_ABSTRACT_CLASS(CSGShape3D);
-	GDREGISTER_ABSTRACT_CLASS(CSGPrimitive3D);
-	GDREGISTER_CLASS(CSGMesh3D);
-	GDREGISTER_CLASS(CSGSphere3D);
-	GDREGISTER_CLASS(CSGBox3D);
-	GDREGISTER_CLASS(CSGCylinder3D);
-	GDREGISTER_CLASS(CSGTorus3D);
-	GDREGISTER_CLASS(CSGPolygon3D);
-	GDREGISTER_CLASS(CSGCombiner3D);
-
+void initialize_csg_module(ModuleInitializationLevel p_level) {
+	if (p_level == MODULE_INITIALIZATION_LEVEL_SCENE) {
+		GDREGISTER_ABSTRACT_CLASS(CSGShape3D);
+		GDREGISTER_ABSTRACT_CLASS(CSGPrimitive3D);
+		GDREGISTER_CLASS(CSGMesh3D);
+		GDREGISTER_CLASS(CSGSphere3D);
+		GDREGISTER_CLASS(CSGBox3D);
+		GDREGISTER_CLASS(CSGCylinder3D);
+		GDREGISTER_CLASS(CSGTorus3D);
+		GDREGISTER_CLASS(CSGPolygon3D);
+		GDREGISTER_CLASS(CSGCombiner3D);
+	}
 #ifdef TOOLS_ENABLED
 #ifdef TOOLS_ENABLED
-	EditorPlugins::add_by_type<EditorPluginCSG>();
+	if (p_level == MODULE_INITIALIZATION_LEVEL_EDITOR) {
+		EditorPlugins::add_by_type<EditorPluginCSG>();
+	}
 #endif
 #endif
 }
 }
 
 
-void unregister_csg_types() {
+void uninitialize_csg_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
 }
 }
 
 
 #endif // _3D_DISABLED
 #endif // _3D_DISABLED

+ 4 - 2
modules/csg/register_types.h

@@ -31,7 +31,9 @@
 #ifndef CSG_REGISTER_TYPES_H
 #ifndef CSG_REGISTER_TYPES_H
 #define CSG_REGISTER_TYPES_H
 #define CSG_REGISTER_TYPES_H
 
 
-void register_csg_types();
-void unregister_csg_types();
+#include "modules/register_module_types.h"
+
+void initialize_csg_module(ModuleInitializationLevel p_level);
+void uninitialize_csg_module(ModuleInitializationLevel p_level);
 
 
 #endif // CSG_REGISTER_TYPES_H
 #endif // CSG_REGISTER_TYPES_H

+ 10 - 2
modules/cvtt/register_types.cpp

@@ -34,11 +34,19 @@
 
 
 #include "image_compress_cvtt.h"
 #include "image_compress_cvtt.h"
 
 
-void register_cvtt_types() {
+void initialize_cvtt_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+
 	Image::set_compress_bptc_func(image_compress_cvtt);
 	Image::set_compress_bptc_func(image_compress_cvtt);
 	Image::_image_decompress_bptc = image_decompress_cvtt;
 	Image::_image_decompress_bptc = image_decompress_cvtt;
 }
 }
 
 
-void unregister_cvtt_types() {}
+void uninitialize_cvtt_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+}
 
 
 #endif
 #endif

+ 4 - 2
modules/cvtt/register_types.h

@@ -33,8 +33,10 @@
 
 
 #ifdef TOOLS_ENABLED
 #ifdef TOOLS_ENABLED
 
 
-void register_cvtt_types();
-void unregister_cvtt_types();
+#include "modules/register_module_types.h"
+
+void initialize_cvtt_module(ModuleInitializationLevel p_level);
+void uninitialize_cvtt_module(ModuleInitializationLevel p_level);
 
 
 #endif // TOOLS_ENABLED
 #endif // TOOLS_ENABLED
 
 

+ 10 - 2
modules/dds/register_types.cpp

@@ -34,12 +34,20 @@
 
 
 static Ref<ResourceFormatDDS> resource_loader_dds;
 static Ref<ResourceFormatDDS> resource_loader_dds;
 
 
-void register_dds_types() {
+void initialize_dds_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+
 	resource_loader_dds.instantiate();
 	resource_loader_dds.instantiate();
 	ResourceLoader::add_resource_format_loader(resource_loader_dds);
 	ResourceLoader::add_resource_format_loader(resource_loader_dds);
 }
 }
 
 
-void unregister_dds_types() {
+void uninitialize_dds_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+
 	ResourceLoader::remove_resource_format_loader(resource_loader_dds);
 	ResourceLoader::remove_resource_format_loader(resource_loader_dds);
 	resource_loader_dds.unref();
 	resource_loader_dds.unref();
 }
 }

+ 4 - 2
modules/dds/register_types.h

@@ -31,7 +31,9 @@
 #ifndef DDS_REGISTER_TYPES_H
 #ifndef DDS_REGISTER_TYPES_H
 #define DDS_REGISTER_TYPES_H
 #define DDS_REGISTER_TYPES_H
 
 
-void register_dds_types();
-void unregister_dds_types();
+#include "modules/register_module_types.h"
+
+void initialize_dds_module(ModuleInitializationLevel p_level);
+void uninitialize_dds_module(ModuleInitializationLevel p_level);
 
 
 #endif // DDS_REGISTER_TYPES_H
 #endif // DDS_REGISTER_TYPES_H

+ 9 - 2
modules/denoise/register_types.cpp

@@ -32,9 +32,16 @@
 #include "core/config/engine.h"
 #include "core/config/engine.h"
 #include "lightmap_denoiser.h"
 #include "lightmap_denoiser.h"
 
 
-void register_denoise_types() {
+void initialize_denoise_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+
 	LightmapDenoiserOIDN::make_default_denoiser();
 	LightmapDenoiserOIDN::make_default_denoiser();
 }
 }
 
 
-void unregister_denoise_types() {
+void uninitialize_denoise_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
 }
 }

+ 4 - 2
modules/denoise/register_types.h

@@ -31,7 +31,9 @@
 #ifndef DENOISE_REGISTER_TYPES_H
 #ifndef DENOISE_REGISTER_TYPES_H
 #define DENOISE_REGISTER_TYPES_H
 #define DENOISE_REGISTER_TYPES_H
 
 
-void register_denoise_types();
-void unregister_denoise_types();
+#include "modules/register_module_types.h"
+
+void initialize_denoise_module(ModuleInitializationLevel p_level);
+void uninitialize_denoise_module(ModuleInitializationLevel p_level);
 
 
 #endif // DENOISE_REGISTER_TYPES_H
 #endif // DENOISE_REGISTER_TYPES_H

+ 10 - 2
modules/enet/register_types.cpp

@@ -36,7 +36,11 @@
 
 
 static bool enet_ok = false;
 static bool enet_ok = false;
 
 
-void register_enet_types() {
+void initialize_enet_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+
 	if (enet_initialize() != 0) {
 	if (enet_initialize() != 0) {
 		ERR_PRINT("ENet initialization failure");
 		ERR_PRINT("ENet initialization failure");
 	} else {
 	} else {
@@ -48,7 +52,11 @@ void register_enet_types() {
 	GDREGISTER_CLASS(ENetConnection);
 	GDREGISTER_CLASS(ENetConnection);
 }
 }
 
 
-void unregister_enet_types() {
+void uninitialize_enet_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+
 	if (enet_ok) {
 	if (enet_ok) {
 		enet_deinitialize();
 		enet_deinitialize();
 	}
 	}

+ 4 - 2
modules/enet/register_types.h

@@ -31,7 +31,9 @@
 #ifndef ENET_REGISTER_TYPES_H
 #ifndef ENET_REGISTER_TYPES_H
 #define ENET_REGISTER_TYPES_H
 #define ENET_REGISTER_TYPES_H
 
 
-void register_enet_types();
-void unregister_enet_types();
+#include "modules/register_module_types.h"
+
+void initialize_enet_module(ModuleInitializationLevel p_level);
+void uninitialize_enet_module(ModuleInitializationLevel p_level);
 
 
 #endif // ENET_REGISTER_TYPES_H
 #endif // ENET_REGISTER_TYPES_H

+ 9 - 2
modules/etcpak/register_types.cpp

@@ -32,11 +32,18 @@
 
 
 #include "image_compress_etcpak.h"
 #include "image_compress_etcpak.h"
 
 
-void register_etcpak_types() {
+void initialize_etcpak_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+
 	Image::_image_compress_etc1_func = _compress_etc1;
 	Image::_image_compress_etc1_func = _compress_etc1;
 	Image::_image_compress_etc2_func = _compress_etc2;
 	Image::_image_compress_etc2_func = _compress_etc2;
 	Image::_image_compress_bc_func = _compress_bc;
 	Image::_image_compress_bc_func = _compress_bc;
 }
 }
 
 
-void unregister_etcpak_types() {
+void uninitialize_etcpak_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
 }
 }

+ 6 - 2
modules/etcpak/register_types.h

@@ -31,7 +31,11 @@
 #ifndef ETCPAK_REGISTER_TYPES_H
 #ifndef ETCPAK_REGISTER_TYPES_H
 #define ETCPAK_REGISTER_TYPES_H
 #define ETCPAK_REGISTER_TYPES_H
 
 
-void register_etcpak_types();
-void unregister_etcpak_types();
+#include "modules/register_module_types.h"
+
+#include "modules/register_module_types.h"
+
+void initialize_etcpak_module(ModuleInitializationLevel p_level);
+void uninitialize_etcpak_module(ModuleInitializationLevel p_level);
 
 
 #endif // ETCPAK_REGISTER_TYPES_H
 #endif // ETCPAK_REGISTER_TYPES_H

+ 10 - 2
modules/freetype/register_types.cpp

@@ -30,6 +30,14 @@
 
 
 #include "register_types.h"
 #include "register_types.h"
 
 
-void register_freetype_types() {}
+void initialize_freetype_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+}
 
 
-void unregister_freetype_types() {}
+void uninitialize_freetype_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+}

+ 4 - 2
modules/freetype/register_types.h

@@ -31,7 +31,9 @@
 #ifndef FREETYPE_REGISTER_TYPES_H
 #ifndef FREETYPE_REGISTER_TYPES_H
 #define FREETYPE_REGISTER_TYPES_H
 #define FREETYPE_REGISTER_TYPES_H
 
 
-void register_freetype_types();
-void unregister_freetype_types();
+#include "modules/register_module_types.h"
+
+void initialize_freetype_module(ModuleInitializationLevel p_level);
+void uninitialize_freetype_module(ModuleInitializationLevel p_level);
 
 
 #endif // FREETYPE_REGISTER_TYPES_H
 #endif // FREETYPE_REGISTER_TYPES_H

+ 39 - 31
modules/gdscript/register_types.cpp

@@ -111,54 +111,62 @@ static void _editor_init() {
 
 
 #endif // TOOLS_ENABLED
 #endif // TOOLS_ENABLED
 
 
-void register_gdscript_types() {
-	GDREGISTER_CLASS(GDScript);
+void initialize_gdscript_module(ModuleInitializationLevel p_level) {
+	if (p_level == MODULE_INITIALIZATION_LEVEL_SERVERS) {
+		GDREGISTER_CLASS(GDScript);
 
 
-	script_language_gd = memnew(GDScriptLanguage);
-	ScriptServer::register_language(script_language_gd);
+		script_language_gd = memnew(GDScriptLanguage);
+		ScriptServer::register_language(script_language_gd);
 
 
-	resource_loader_gd.instantiate();
-	ResourceLoader::add_resource_format_loader(resource_loader_gd);
+		resource_loader_gd.instantiate();
+		ResourceLoader::add_resource_format_loader(resource_loader_gd);
 
 
-	resource_saver_gd.instantiate();
-	ResourceSaver::add_resource_format_saver(resource_saver_gd);
+		resource_saver_gd.instantiate();
+		ResourceSaver::add_resource_format_saver(resource_saver_gd);
 
 
-	gdscript_cache = memnew(GDScriptCache);
+		gdscript_cache = memnew(GDScriptCache);
+
+		GDScriptUtilityFunctions::register_functions();
+	}
 
 
 #ifdef TOOLS_ENABLED
 #ifdef TOOLS_ENABLED
-	EditorNode::add_init_callback(_editor_init);
+	if (p_level == MODULE_INITIALIZATION_LEVEL_SERVERS) {
+		EditorNode::add_init_callback(_editor_init);
 
 
-	gdscript_translation_parser_plugin.instantiate();
-	EditorTranslationParser::get_singleton()->add_parser(gdscript_translation_parser_plugin, EditorTranslationParser::STANDARD);
+		gdscript_translation_parser_plugin.instantiate();
+		EditorTranslationParser::get_singleton()->add_parser(gdscript_translation_parser_plugin, EditorTranslationParser::STANDARD);
+	}
 #endif // TOOLS_ENABLED
 #endif // TOOLS_ENABLED
-
-	GDScriptUtilityFunctions::register_functions();
 }
 }
 
 
-void unregister_gdscript_types() {
-	ScriptServer::unregister_language(script_language_gd);
+void uninitialize_gdscript_module(ModuleInitializationLevel p_level) {
+	if (p_level == MODULE_INITIALIZATION_LEVEL_SERVERS) {
+		ScriptServer::unregister_language(script_language_gd);
 
 
-	if (gdscript_cache) {
-		memdelete(gdscript_cache);
-	}
+		if (gdscript_cache) {
+			memdelete(gdscript_cache);
+		}
 
 
-	if (script_language_gd) {
-		memdelete(script_language_gd);
-	}
+		if (script_language_gd) {
+			memdelete(script_language_gd);
+		}
+
+		ResourceLoader::remove_resource_format_loader(resource_loader_gd);
+		resource_loader_gd.unref();
 
 
-	ResourceLoader::remove_resource_format_loader(resource_loader_gd);
-	resource_loader_gd.unref();
+		ResourceSaver::remove_resource_format_saver(resource_saver_gd);
+		resource_saver_gd.unref();
 
 
-	ResourceSaver::remove_resource_format_saver(resource_saver_gd);
-	resource_saver_gd.unref();
+		GDScriptParser::cleanup();
+		GDScriptUtilityFunctions::unregister_functions();
+	}
 
 
 #ifdef TOOLS_ENABLED
 #ifdef TOOLS_ENABLED
-	EditorTranslationParser::get_singleton()->remove_parser(gdscript_translation_parser_plugin, EditorTranslationParser::STANDARD);
-	gdscript_translation_parser_plugin.unref();
+	if (p_level == MODULE_INITIALIZATION_LEVEL_EDITOR) {
+		EditorTranslationParser::get_singleton()->remove_parser(gdscript_translation_parser_plugin, EditorTranslationParser::STANDARD);
+		gdscript_translation_parser_plugin.unref();
+	}
 #endif // TOOLS_ENABLED
 #endif // TOOLS_ENABLED
-
-	GDScriptParser::cleanup();
-	GDScriptUtilityFunctions::unregister_functions();
 }
 }
 
 
 #ifdef TESTS_ENABLED
 #ifdef TESTS_ENABLED

+ 4 - 2
modules/gdscript/register_types.h

@@ -31,7 +31,9 @@
 #ifndef GDSCRIPT_REGISTER_TYPES_H
 #ifndef GDSCRIPT_REGISTER_TYPES_H
 #define GDSCRIPT_REGISTER_TYPES_H
 #define GDSCRIPT_REGISTER_TYPES_H
 
 
-void register_gdscript_types();
-void unregister_gdscript_types();
+#include "modules/register_module_types.h"
+
+void initialize_gdscript_module(ModuleInitializationLevel p_level);
+void uninitialize_gdscript_module(ModuleInitializationLevel p_level);
 
 
 #endif // GDSCRIPT_REGISTER_TYPES_H
 #endif // GDSCRIPT_REGISTER_TYPES_H

+ 9 - 4
modules/glslang/register_types.cpp

@@ -190,7 +190,11 @@ static String _get_cache_key_function_glsl(const RenderingDevice::Capabilities *
 	return version;
 	return version;
 }
 }
 
 
-void preregister_glslang_types() {
+void initialize_glslang_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_CORE) {
+		return;
+	}
+
 	// Initialize in case it's not initialized. This is done once per thread
 	// Initialize in case it's not initialized. This is done once per thread
 	// and it's safe to call multiple times.
 	// and it's safe to call multiple times.
 	glslang::InitializeProcess();
 	glslang::InitializeProcess();
@@ -198,9 +202,10 @@ void preregister_glslang_types() {
 	RenderingDevice::shader_set_get_cache_key_function(_get_cache_key_function_glsl);
 	RenderingDevice::shader_set_get_cache_key_function(_get_cache_key_function_glsl);
 }
 }
 
 
-void register_glslang_types() {
-}
+void uninitialize_glslang_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_CORE) {
+		return;
+	}
 
 
-void unregister_glslang_types() {
 	glslang::FinalizeProcess();
 	glslang::FinalizeProcess();
 }
 }

+ 4 - 3
modules/glslang/register_types.h

@@ -33,8 +33,9 @@
 
 
 #define MODULE_GLSLANG_HAS_PREREGISTER
 #define MODULE_GLSLANG_HAS_PREREGISTER
 
 
-void preregister_glslang_types();
-void register_glslang_types();
-void unregister_glslang_types();
+#include "modules/register_module_types.h"
+
+void initialize_glslang_module(ModuleInitializationLevel p_level);
+void uninitialize_glslang_module(ModuleInitializationLevel p_level);
 
 
 #endif // GLSLANG_REGISTER_TYPES_H
 #endif // GLSLANG_REGISTER_TYPES_H

+ 40 - 33
modules/gltf/register_types.cpp

@@ -101,45 +101,52 @@ static void _editor_init() {
 }
 }
 #endif // TOOLS_ENABLED
 #endif // TOOLS_ENABLED
 
 
-void register_gltf_types() {
-	// glTF API available at runtime.
-	GDREGISTER_CLASS(GLTFAccessor);
-	GDREGISTER_CLASS(GLTFAnimation);
-	GDREGISTER_CLASS(GLTFBufferView);
-	GDREGISTER_CLASS(GLTFCamera);
-	GDREGISTER_CLASS(GLTFDocument);
-	GDREGISTER_CLASS(GLTFDocumentExtension);
-	GDREGISTER_CLASS(GLTFDocumentExtensionConvertImporterMesh);
-	GDREGISTER_CLASS(GLTFLight);
-	GDREGISTER_CLASS(GLTFMesh);
-	GDREGISTER_CLASS(GLTFNode);
-	GDREGISTER_CLASS(GLTFSkeleton);
-	GDREGISTER_CLASS(GLTFSkin);
-	GDREGISTER_CLASS(GLTFSpecGloss);
-	GDREGISTER_CLASS(GLTFState);
-	GDREGISTER_CLASS(GLTFTexture);
+void initialize_gltf_module(ModuleInitializationLevel p_level) {
+	if (p_level == MODULE_INITIALIZATION_LEVEL_SCENE) {
+		// glTF API available at runtime.
+		GDREGISTER_CLASS(GLTFAccessor);
+		GDREGISTER_CLASS(GLTFAnimation);
+		GDREGISTER_CLASS(GLTFBufferView);
+		GDREGISTER_CLASS(GLTFCamera);
+		GDREGISTER_CLASS(GLTFDocument);
+		GDREGISTER_CLASS(GLTFDocumentExtension);
+		GDREGISTER_CLASS(GLTFDocumentExtensionConvertImporterMesh);
+		GDREGISTER_CLASS(GLTFLight);
+		GDREGISTER_CLASS(GLTFMesh);
+		GDREGISTER_CLASS(GLTFNode);
+		GDREGISTER_CLASS(GLTFSkeleton);
+		GDREGISTER_CLASS(GLTFSkin);
+		GDREGISTER_CLASS(GLTFSpecGloss);
+		GDREGISTER_CLASS(GLTFState);
+		GDREGISTER_CLASS(GLTFTexture);
+	}
 
 
 #ifdef TOOLS_ENABLED
 #ifdef TOOLS_ENABLED
-	// Editor-specific API.
-	ClassDB::APIType prev_api = ClassDB::get_current_api();
-	ClassDB::set_current_api(ClassDB::API_EDITOR);
-
-	GDREGISTER_CLASS(EditorSceneFormatImporterGLTF);
-	EditorPlugins::add_by_type<SceneExporterGLTFPlugin>();
-
-	// Project settings defined here so doctool finds them.
-	GLOBAL_DEF_RST("filesystem/import/blender/enabled", true);
-	GLOBAL_DEF_RST("filesystem/import/fbx/enabled", true);
-	GDREGISTER_CLASS(EditorSceneFormatImporterBlend);
-	GDREGISTER_CLASS(EditorSceneFormatImporterFBX);
-
-	ClassDB::set_current_api(prev_api);
-	EditorNode::add_init_callback(_editor_init);
+	if (p_level == MODULE_INITIALIZATION_LEVEL_EDITOR) {
+		// Editor-specific API.
+		ClassDB::APIType prev_api = ClassDB::get_current_api();
+		ClassDB::set_current_api(ClassDB::API_EDITOR);
+
+		GDREGISTER_CLASS(EditorSceneFormatImporterGLTF);
+		EditorPlugins::add_by_type<SceneExporterGLTFPlugin>();
+
+		// Project settings defined here so doctool finds them.
+		GLOBAL_DEF_RST("filesystem/import/blender/enabled", true);
+		GLOBAL_DEF_RST("filesystem/import/fbx/enabled", true);
+		GDREGISTER_CLASS(EditorSceneFormatImporterBlend);
+		GDREGISTER_CLASS(EditorSceneFormatImporterFBX);
+
+		ClassDB::set_current_api(prev_api);
+		EditorNode::add_init_callback(_editor_init);
+	}
 
 
 #endif // TOOLS_ENABLED
 #endif // TOOLS_ENABLED
 }
 }
 
 
-void unregister_gltf_types() {
+void uninitialize_gltf_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
 }
 }
 
 
 #endif // _3D_DISABLED
 #endif // _3D_DISABLED

+ 4 - 2
modules/gltf/register_types.h

@@ -28,5 +28,7 @@
 /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
 /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
 /*************************************************************************/
 /*************************************************************************/
 
 
-void register_gltf_types();
-void unregister_gltf_types();
+#include "modules/register_module_types.h"
+
+void initialize_gltf_module(ModuleInitializationLevel p_level);
+void uninitialize_gltf_module(ModuleInitializationLevel p_level);

+ 11 - 4
modules/gridmap/register_types.cpp

@@ -39,14 +39,21 @@
 #include "editor/grid_map_editor_plugin.h"
 #include "editor/grid_map_editor_plugin.h"
 #endif
 #endif
 
 
-void register_gridmap_types() {
-	GDREGISTER_CLASS(GridMap);
+void initialize_gridmap_module(ModuleInitializationLevel p_level) {
+	if (p_level == MODULE_INITIALIZATION_LEVEL_SCENE) {
+		GDREGISTER_CLASS(GridMap);
+	}
 #ifdef TOOLS_ENABLED
 #ifdef TOOLS_ENABLED
-	EditorPlugins::add_by_type<GridMapEditorPlugin>();
+	if (p_level == MODULE_INITIALIZATION_LEVEL_EDITOR) {
+		EditorPlugins::add_by_type<GridMapEditorPlugin>();
+	}
 #endif
 #endif
 }
 }
 
 
-void unregister_gridmap_types() {
+void uninitialize_gridmap_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
 }
 }
 
 
 #endif // _3D_DISABLED
 #endif // _3D_DISABLED

+ 4 - 2
modules/gridmap/register_types.h

@@ -31,7 +31,9 @@
 #ifndef GRIDMAP_REGISTER_TYPES_H
 #ifndef GRIDMAP_REGISTER_TYPES_H
 #define GRIDMAP_REGISTER_TYPES_H
 #define GRIDMAP_REGISTER_TYPES_H
 
 
-void register_gridmap_types();
-void unregister_gridmap_types();
+#include "modules/register_module_types.h"
+
+void initialize_gridmap_module(ModuleInitializationLevel p_level);
+void uninitialize_gridmap_module(ModuleInitializationLevel p_level);
 
 
 #endif // GRIDMAP_REGISTER_TYPES_H
 #endif // GRIDMAP_REGISTER_TYPES_H

+ 10 - 2
modules/hdr/register_types.cpp

@@ -34,11 +34,19 @@
 
 
 static ImageLoaderHDR *image_loader_hdr = nullptr;
 static ImageLoaderHDR *image_loader_hdr = nullptr;
 
 
-void register_hdr_types() {
+void initialize_hdr_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+
 	image_loader_hdr = memnew(ImageLoaderHDR);
 	image_loader_hdr = memnew(ImageLoaderHDR);
 	ImageLoader::add_image_format_loader(image_loader_hdr);
 	ImageLoader::add_image_format_loader(image_loader_hdr);
 }
 }
 
 
-void unregister_hdr_types() {
+void uninitialize_hdr_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+
 	memdelete(image_loader_hdr);
 	memdelete(image_loader_hdr);
 }
 }

+ 4 - 2
modules/hdr/register_types.h

@@ -31,7 +31,9 @@
 #ifndef HDR_REGISTER_TYPES_H
 #ifndef HDR_REGISTER_TYPES_H
 #define HDR_REGISTER_TYPES_H
 #define HDR_REGISTER_TYPES_H
 
 
-void register_hdr_types();
-void unregister_hdr_types();
+#include "modules/register_module_types.h"
+
+void initialize_hdr_module(ModuleInitializationLevel p_level);
+void uninitialize_hdr_module(ModuleInitializationLevel p_level);
 
 
 #endif // HDR_REGISTER_TYPES_H
 #endif // HDR_REGISTER_TYPES_H

+ 10 - 2
modules/jpg/register_types.cpp

@@ -34,11 +34,19 @@
 
 
 static ImageLoaderJPG *image_loader_jpg = nullptr;
 static ImageLoaderJPG *image_loader_jpg = nullptr;
 
 
-void register_jpg_types() {
+void initialize_jpg_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+
 	image_loader_jpg = memnew(ImageLoaderJPG);
 	image_loader_jpg = memnew(ImageLoaderJPG);
 	ImageLoader::add_image_format_loader(image_loader_jpg);
 	ImageLoader::add_image_format_loader(image_loader_jpg);
 }
 }
 
 
-void unregister_jpg_types() {
+void uninitialize_jpg_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+
 	memdelete(image_loader_jpg);
 	memdelete(image_loader_jpg);
 }
 }

+ 4 - 2
modules/jpg/register_types.h

@@ -31,7 +31,9 @@
 #ifndef JPG_REGISTER_TYPES_H
 #ifndef JPG_REGISTER_TYPES_H
 #define JPG_REGISTER_TYPES_H
 #define JPG_REGISTER_TYPES_H
 
 
-void register_jpg_types();
-void unregister_jpg_types();
+#include "modules/register_module_types.h"
+
+void initialize_jpg_module(ModuleInitializationLevel p_level);
+void uninitialize_jpg_module(ModuleInitializationLevel p_level);
 
 
 #endif // JPG_REGISTER_TYPES_H
 #endif // JPG_REGISTER_TYPES_H

+ 9 - 2
modules/jsonrpc/register_types.cpp

@@ -32,9 +32,16 @@
 #include "core/object/class_db.h"
 #include "core/object/class_db.h"
 #include "jsonrpc.h"
 #include "jsonrpc.h"
 
 
-void register_jsonrpc_types() {
+void initialize_jsonrpc_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+
 	GDREGISTER_CLASS(JSONRPC);
 	GDREGISTER_CLASS(JSONRPC);
 }
 }
 
 
-void unregister_jsonrpc_types() {
+void uninitialize_jsonrpc_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
 }
 }

+ 4 - 2
modules/jsonrpc/register_types.h

@@ -31,7 +31,9 @@
 #ifndef JSONRPC_REGISTER_TYPES_H
 #ifndef JSONRPC_REGISTER_TYPES_H
 #define JSONRPC_REGISTER_TYPES_H
 #define JSONRPC_REGISTER_TYPES_H
 
 
-void register_jsonrpc_types();
-void unregister_jsonrpc_types();
+#include "modules/register_module_types.h"
+
+void initialize_jsonrpc_module(ModuleInitializationLevel p_level);
+void uninitialize_jsonrpc_module(ModuleInitializationLevel p_level);
 
 
 #endif // JSONRPC_REGISTER_TYPES_H
 #endif // JSONRPC_REGISTER_TYPES_H

+ 9 - 2
modules/lightmapper_rd/register_types.cpp

@@ -40,7 +40,11 @@ static Lightmapper *create_lightmapper_rd() {
 }
 }
 #endif
 #endif
 
 
-void register_lightmapper_rd_types() {
+void initialize_lightmapper_rd_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+
 	GLOBAL_DEF("rendering/lightmapping/bake_quality/low_quality_ray_count", 16);
 	GLOBAL_DEF("rendering/lightmapping/bake_quality/low_quality_ray_count", 16);
 	GLOBAL_DEF("rendering/lightmapping/bake_quality/medium_quality_ray_count", 64);
 	GLOBAL_DEF("rendering/lightmapping/bake_quality/medium_quality_ray_count", 64);
 	GLOBAL_DEF("rendering/lightmapping/bake_quality/high_quality_ray_count", 256);
 	GLOBAL_DEF("rendering/lightmapping/bake_quality/high_quality_ray_count", 256);
@@ -59,5 +63,8 @@ void register_lightmapper_rd_types() {
 #endif
 #endif
 }
 }
 
 
-void unregister_lightmapper_rd_types() {
+void uninitialize_lightmapper_rd_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
 }
 }

+ 4 - 2
modules/lightmapper_rd/register_types.h

@@ -31,7 +31,9 @@
 #ifndef LIGHTMAPPER_RD_REGISTER_TYPES_H
 #ifndef LIGHTMAPPER_RD_REGISTER_TYPES_H
 #define LIGHTMAPPER_RD_REGISTER_TYPES_H
 #define LIGHTMAPPER_RD_REGISTER_TYPES_H
 
 
-void register_lightmapper_rd_types();
-void unregister_lightmapper_rd_types();
+#include "modules/register_module_types.h"
+
+void initialize_lightmapper_rd_module(ModuleInitializationLevel p_level);
+void uninitialize_lightmapper_rd_module(ModuleInitializationLevel p_level);
 
 
 #endif // XATLAS_UNWRAP_REGISTER_TYPES_H
 #endif // XATLAS_UNWRAP_REGISTER_TYPES_H

+ 10 - 2
modules/mbedtls/register_types.cpp

@@ -39,14 +39,22 @@
 #include "tests/test_crypto_mbedtls.h"
 #include "tests/test_crypto_mbedtls.h"
 #endif
 #endif
 
 
-void register_mbedtls_types() {
+void initialize_mbedtls_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+
 	CryptoMbedTLS::initialize_crypto();
 	CryptoMbedTLS::initialize_crypto();
 	StreamPeerMbedTLS::initialize_ssl();
 	StreamPeerMbedTLS::initialize_ssl();
 	PacketPeerMbedDTLS::initialize_dtls();
 	PacketPeerMbedDTLS::initialize_dtls();
 	DTLSServerMbedTLS::initialize();
 	DTLSServerMbedTLS::initialize();
 }
 }
 
 
-void unregister_mbedtls_types() {
+void uninitialize_mbedtls_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+
 	DTLSServerMbedTLS::finalize();
 	DTLSServerMbedTLS::finalize();
 	PacketPeerMbedDTLS::finalize_dtls();
 	PacketPeerMbedDTLS::finalize_dtls();
 	StreamPeerMbedTLS::finalize_ssl();
 	StreamPeerMbedTLS::finalize_ssl();

+ 4 - 2
modules/mbedtls/register_types.h

@@ -31,7 +31,9 @@
 #ifndef MBEDTLS_REGISTER_TYPES_H
 #ifndef MBEDTLS_REGISTER_TYPES_H
 #define MBEDTLS_REGISTER_TYPES_H
 #define MBEDTLS_REGISTER_TYPES_H
 
 
-void register_mbedtls_types();
-void unregister_mbedtls_types();
+#include "modules/register_module_types.h"
+
+void initialize_mbedtls_module(ModuleInitializationLevel p_level);
+void uninitialize_mbedtls_module(ModuleInitializationLevel p_level);
 
 
 #endif // MBEDTLS_REGISTER_TYPES_H
 #endif // MBEDTLS_REGISTER_TYPES_H

+ 10 - 2
modules/meshoptimizer/register_types.cpp

@@ -32,7 +32,11 @@
 #include "scene/resources/surface_tool.h"
 #include "scene/resources/surface_tool.h"
 #include "thirdparty/meshoptimizer/meshoptimizer.h"
 #include "thirdparty/meshoptimizer/meshoptimizer.h"
 
 
-void register_meshoptimizer_types() {
+void initialize_meshoptimizer_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+
 	SurfaceTool::optimize_vertex_cache_func = meshopt_optimizeVertexCache;
 	SurfaceTool::optimize_vertex_cache_func = meshopt_optimizeVertexCache;
 	SurfaceTool::simplify_func = meshopt_simplify;
 	SurfaceTool::simplify_func = meshopt_simplify;
 	SurfaceTool::simplify_with_attrib_func = meshopt_simplifyWithAttributes;
 	SurfaceTool::simplify_with_attrib_func = meshopt_simplifyWithAttributes;
@@ -43,7 +47,11 @@ void register_meshoptimizer_types() {
 	SurfaceTool::remap_index_func = meshopt_remapIndexBuffer;
 	SurfaceTool::remap_index_func = meshopt_remapIndexBuffer;
 }
 }
 
 
-void unregister_meshoptimizer_types() {
+void uninitialize_meshoptimizer_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+
 	SurfaceTool::optimize_vertex_cache_func = nullptr;
 	SurfaceTool::optimize_vertex_cache_func = nullptr;
 	SurfaceTool::simplify_func = nullptr;
 	SurfaceTool::simplify_func = nullptr;
 	SurfaceTool::simplify_scale_func = nullptr;
 	SurfaceTool::simplify_scale_func = nullptr;

+ 4 - 2
modules/meshoptimizer/register_types.h

@@ -31,7 +31,9 @@
 #ifndef MESHOPTIMIZER_REGISTER_TYPES_H
 #ifndef MESHOPTIMIZER_REGISTER_TYPES_H
 #define MESHOPTIMIZER_REGISTER_TYPES_H
 #define MESHOPTIMIZER_REGISTER_TYPES_H
 
 
-void register_meshoptimizer_types();
-void unregister_meshoptimizer_types();
+#include "modules/register_module_types.h"
+
+void initialize_meshoptimizer_module(ModuleInitializationLevel p_level);
+void uninitialize_meshoptimizer_module(ModuleInitializationLevel p_level);
 
 
 #endif // PVR_REGISTER_TYPES_H
 #endif // PVR_REGISTER_TYPES_H

+ 9 - 2
modules/minimp3/register_types.cpp

@@ -37,7 +37,11 @@
 #include "resource_importer_mp3.h"
 #include "resource_importer_mp3.h"
 #endif
 #endif
 
 
-void register_minimp3_types() {
+void initialize_minimp3_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+
 #ifdef TOOLS_ENABLED
 #ifdef TOOLS_ENABLED
 	if (Engine::get_singleton()->is_editor_hint()) {
 	if (Engine::get_singleton()->is_editor_hint()) {
 		Ref<ResourceImporterMP3> mp3_import;
 		Ref<ResourceImporterMP3> mp3_import;
@@ -48,5 +52,8 @@ void register_minimp3_types() {
 	GDREGISTER_CLASS(AudioStreamMP3);
 	GDREGISTER_CLASS(AudioStreamMP3);
 }
 }
 
 
-void unregister_minimp3_types() {
+void uninitialize_minimp3_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
 }
 }

+ 4 - 2
modules/minimp3/register_types.h

@@ -31,7 +31,9 @@
 #ifndef MINIMP3_REGISTER_TYPES_H
 #ifndef MINIMP3_REGISTER_TYPES_H
 #define MINIMP3_REGISTER_TYPES_H
 #define MINIMP3_REGISTER_TYPES_H
 
 
-void register_minimp3_types();
-void unregister_minimp3_types();
+#include "modules/register_module_types.h"
+
+void initialize_minimp3_module(ModuleInitializationLevel p_level);
+void uninitialize_minimp3_module(ModuleInitializationLevel p_level);
 
 
 #endif // MINIMP3_REGISTER_TYPES_H
 #endif // MINIMP3_REGISTER_TYPES_H

+ 10 - 2
modules/mobile_vr/register_types.cpp

@@ -34,7 +34,11 @@
 
 
 Ref<MobileVRInterface> mobile_vr;
 Ref<MobileVRInterface> mobile_vr;
 
 
-void register_mobile_vr_types() {
+void initialize_mobile_vr_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+
 	GDREGISTER_CLASS(MobileVRInterface);
 	GDREGISTER_CLASS(MobileVRInterface);
 
 
 	if (XRServer::get_singleton()) {
 	if (XRServer::get_singleton()) {
@@ -43,7 +47,11 @@ void register_mobile_vr_types() {
 	}
 	}
 }
 }
 
 
-void unregister_mobile_vr_types() {
+void uninitialize_mobile_vr_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+
 	if (mobile_vr.is_valid()) {
 	if (mobile_vr.is_valid()) {
 		// uninitialise our interface if it is initialised
 		// uninitialise our interface if it is initialised
 		if (mobile_vr->is_initialized()) {
 		if (mobile_vr->is_initialized()) {

+ 4 - 2
modules/mobile_vr/register_types.h

@@ -31,7 +31,9 @@
 #ifndef MOBILE_VR_REGISTER_TYPES_H
 #ifndef MOBILE_VR_REGISTER_TYPES_H
 #define MOBILE_VR_REGISTER_TYPES_H
 #define MOBILE_VR_REGISTER_TYPES_H
 
 
-void register_mobile_vr_types();
-void unregister_mobile_vr_types();
+#include "modules/register_module_types.h"
+
+void initialize_mobile_vr_module(ModuleInitializationLevel p_level);
+void uninitialize_mobile_vr_module(ModuleInitializationLevel p_level);
 
 
 #endif // MOBILE_VR_REGISTER_TYPES_H
 #endif // MOBILE_VR_REGISTER_TYPES_H

+ 10 - 2
modules/mono/register_types.cpp

@@ -40,7 +40,11 @@ Ref<ResourceFormatSaverCSharpScript> resource_saver_cs;
 
 
 mono_bind::GodotSharp *_godotsharp = nullptr;
 mono_bind::GodotSharp *_godotsharp = nullptr;
 
 
-void register_mono_types() {
+void initialize_mono_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+
 	GDREGISTER_CLASS(CSharpScript);
 	GDREGISTER_CLASS(CSharpScript);
 
 
 	_godotsharp = memnew(mono_bind::GodotSharp);
 	_godotsharp = memnew(mono_bind::GodotSharp);
@@ -59,7 +63,11 @@ void register_mono_types() {
 	ResourceSaver::add_resource_format_saver(resource_saver_cs);
 	ResourceSaver::add_resource_format_saver(resource_saver_cs);
 }
 }
 
 
-void unregister_mono_types() {
+void uninitialize_mono_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+
 	ScriptServer::unregister_language(script_language_cs);
 	ScriptServer::unregister_language(script_language_cs);
 
 
 	if (script_language_cs) {
 	if (script_language_cs) {

+ 4 - 2
modules/mono/register_types.h

@@ -31,7 +31,9 @@
 #ifndef MONO_REGISTER_TYPES_H
 #ifndef MONO_REGISTER_TYPES_H
 #define MONO_REGISTER_TYPES_H
 #define MONO_REGISTER_TYPES_H
 
 
-void register_mono_types();
-void unregister_mono_types();
+#include "modules/register_module_types.h"
+
+void initialize_mono_module(ModuleInitializationLevel p_level);
+void uninitialize_mono_module(ModuleInitializationLevel p_level);
 
 
 #endif // MONO_REGISTER_TYPES_H
 #endif // MONO_REGISTER_TYPES_H

+ 10 - 2
modules/msdfgen/register_types.cpp

@@ -30,6 +30,14 @@
 
 
 #include "register_types.h"
 #include "register_types.h"
 
 
-void register_msdfgen_types() {}
+void initialize_msdfgen_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+}
 
 
-void unregister_msdfgen_types() {}
+void uninitialize_msdfgen_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+}

+ 4 - 2
modules/msdfgen/register_types.h

@@ -31,7 +31,9 @@
 #ifndef MSDFGEN_REGISTER_TYPES_H
 #ifndef MSDFGEN_REGISTER_TYPES_H
 #define MSDFGEN_REGISTER_TYPES_H
 #define MSDFGEN_REGISTER_TYPES_H
 
 
-void register_msdfgen_types();
-void unregister_msdfgen_types();
+#include "modules/register_module_types.h"
+
+void initialize_msdfgen_module(ModuleInitializationLevel p_level);
+void uninitialize_msdfgen_module(ModuleInitializationLevel p_level);
 
 
 #endif // MSDFGEN_REGISTER_TYPES_H
 #endif // MSDFGEN_REGISTER_TYPES_H

+ 15 - 7
modules/navigation/register_types.cpp

@@ -51,21 +51,29 @@ NavigationServer3D *new_server() {
 	return memnew(GodotNavigationServer);
 	return memnew(GodotNavigationServer);
 }
 }
 
 
-void register_navigation_types() {
-	NavigationServer3DManager::set_default_server(new_server);
+void initialize_navigation_module(ModuleInitializationLevel p_level) {
+	if (p_level == MODULE_INITIALIZATION_LEVEL_SERVERS) {
+		NavigationServer3DManager::set_default_server(new_server);
 
 
 #ifndef _3D_DISABLED
 #ifndef _3D_DISABLED
-	_nav_mesh_generator = memnew(NavigationMeshGenerator);
-	GDREGISTER_CLASS(NavigationMeshGenerator);
-	Engine::get_singleton()->add_singleton(Engine::Singleton("NavigationMeshGenerator", NavigationMeshGenerator::get_singleton()));
+		_nav_mesh_generator = memnew(NavigationMeshGenerator);
+		GDREGISTER_CLASS(NavigationMeshGenerator);
+		Engine::get_singleton()->add_singleton(Engine::Singleton("NavigationMeshGenerator", NavigationMeshGenerator::get_singleton()));
 #endif
 #endif
+	}
 
 
 #ifdef TOOLS_ENABLED
 #ifdef TOOLS_ENABLED
-	EditorPlugins::add_by_type<NavigationMeshEditorPlugin>();
+	if (p_level == MODULE_INITIALIZATION_LEVEL_EDITOR) {
+		EditorPlugins::add_by_type<NavigationMeshEditorPlugin>();
+	}
 #endif
 #endif
 }
 }
 
 
-void unregister_navigation_types() {
+void uninitialize_navigation_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SERVERS) {
+		return;
+	}
+
 #ifndef _3D_DISABLED
 #ifndef _3D_DISABLED
 	if (_nav_mesh_generator) {
 	if (_nav_mesh_generator) {
 		memdelete(_nav_mesh_generator);
 		memdelete(_nav_mesh_generator);

+ 4 - 2
modules/navigation/register_types.h

@@ -31,7 +31,9 @@
 #ifndef NAVIGATION_REGISTER_TYPES_H
 #ifndef NAVIGATION_REGISTER_TYPES_H
 #define NAVIGATION_REGISTER_TYPES_H
 #define NAVIGATION_REGISTER_TYPES_H
 
 
-void register_navigation_types();
-void unregister_navigation_types();
+#include "modules/register_module_types.h"
+
+void initialize_navigation_module(ModuleInitializationLevel p_level);
+void uninitialize_navigation_module(ModuleInitializationLevel p_level);
 
 
 #endif // NAVIGATION_REGISTER_TYPES_H
 #endif // NAVIGATION_REGISTER_TYPES_H

+ 13 - 6
modules/noise/register_types.cpp

@@ -39,15 +39,22 @@
 #include "editor/noise_editor_plugin.h"
 #include "editor/noise_editor_plugin.h"
 #endif
 #endif
 
 
-void register_noise_types() {
-	GDREGISTER_CLASS(NoiseTexture);
-	GDREGISTER_ABSTRACT_CLASS(Noise);
-	GDREGISTER_CLASS(FastNoiseLite);
+void initialize_noise_module(ModuleInitializationLevel p_level) {
+	if (p_level == MODULE_INITIALIZATION_LEVEL_SCENE) {
+		GDREGISTER_CLASS(NoiseTexture);
+		GDREGISTER_ABSTRACT_CLASS(Noise);
+		GDREGISTER_CLASS(FastNoiseLite);
+	}
 
 
 #ifdef TOOLS_ENABLED
 #ifdef TOOLS_ENABLED
-	EditorPlugins::add_by_type<NoiseEditorPlugin>();
+	if (p_level == MODULE_INITIALIZATION_LEVEL_EDITOR) {
+		EditorPlugins::add_by_type<NoiseEditorPlugin>();
+	}
 #endif
 #endif
 }
 }
 
 
-void unregister_noise_types() {
+void uninitialize_noise_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
 }
 }

+ 4 - 2
modules/noise/register_types.h

@@ -31,7 +31,9 @@
 #ifndef NOISE_REGISTER_TYPES_H
 #ifndef NOISE_REGISTER_TYPES_H
 #define NOISE_REGISTER_TYPES_H
 #define NOISE_REGISTER_TYPES_H
 
 
-void register_noise_types();
-void unregister_noise_types();
+#include "modules/register_module_types.h"
+
+void initialize_noise_module(ModuleInitializationLevel p_level);
+void uninitialize_noise_module(ModuleInitializationLevel p_level);
 
 
 #endif // NOISE_REGISTER_TYPES_H
 #endif // NOISE_REGISTER_TYPES_H

+ 10 - 2
modules/ogg/register_types.cpp

@@ -32,9 +32,17 @@
 
 
 #include "ogg_packet_sequence.h"
 #include "ogg_packet_sequence.h"
 
 
-void register_ogg_types() {
+void initialize_ogg_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+
 	GDREGISTER_CLASS(OGGPacketSequence);
 	GDREGISTER_CLASS(OGGPacketSequence);
 	GDREGISTER_CLASS(OGGPacketSequencePlayback);
 	GDREGISTER_CLASS(OGGPacketSequencePlayback);
 }
 }
 
 
-void unregister_ogg_types() {}
+void uninitialize_ogg_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+}

+ 4 - 2
modules/ogg/register_types.h

@@ -31,7 +31,9 @@
 #ifndef OGG_REGISTER_TYPES_H
 #ifndef OGG_REGISTER_TYPES_H
 #define OGG_REGISTER_TYPES_H
 #define OGG_REGISTER_TYPES_H
 
 
-void register_ogg_types();
-void unregister_ogg_types();
+#include "modules/register_module_types.h"
+
+void initialize_ogg_module(ModuleInitializationLevel p_level);
+void uninitialize_ogg_module(ModuleInitializationLevel p_level);
 
 
 #endif // OGG_REGISTER_TYPES_H
 #endif // OGG_REGISTER_TYPES_H

+ 34 - 28
modules/openxr/register_types.cpp

@@ -54,49 +54,55 @@ static void _editor_init() {
 
 
 #endif
 #endif
 
 
-OpenXRAPI *openxr_api = nullptr;
-Ref<OpenXRInterface> openxr_interface;
+static OpenXRAPI *openxr_api = nullptr;
+static Ref<OpenXRInterface> openxr_interface;
 
 
-void preregister_openxr_types() {
-	// For now we create our openxr device here. If we merge it with openxr_interface we'll create that here soon.
+void initialize_openxr_module(ModuleInitializationLevel p_level) {
+	if (p_level == MODULE_INITIALIZATION_LEVEL_SERVERS) {
+		// For now we create our openxr device here. If we merge it with openxr_interface we'll create that here soon.
 
 
-	if (OpenXRAPI::openxr_is_enabled()) {
-		openxr_api = memnew(OpenXRAPI);
-		ERR_FAIL_NULL(openxr_api);
+		if (OpenXRAPI::openxr_is_enabled()) {
+			openxr_api = memnew(OpenXRAPI);
+			ERR_FAIL_NULL(openxr_api);
 
 
-		if (!openxr_api->initialize(Main::get_rendering_driver_name())) {
-			memdelete(openxr_api);
-			openxr_api = nullptr;
-			return;
+			if (!openxr_api->initialize(Main::get_rendering_driver_name())) {
+				memdelete(openxr_api);
+				openxr_api = nullptr;
+				return;
+			}
 		}
 		}
 	}
 	}
-}
 
 
-void register_openxr_types() {
-	GDREGISTER_CLASS(OpenXRInterface);
+	if (p_level == MODULE_INITIALIZATION_LEVEL_SCENE) {
+		GDREGISTER_CLASS(OpenXRInterface);
 
 
-	GDREGISTER_CLASS(OpenXRAction);
-	GDREGISTER_CLASS(OpenXRActionSet);
-	GDREGISTER_CLASS(OpenXRActionMap);
-	GDREGISTER_CLASS(OpenXRIPBinding);
-	GDREGISTER_CLASS(OpenXRInteractionProfile);
+		GDREGISTER_CLASS(OpenXRAction);
+		GDREGISTER_CLASS(OpenXRActionSet);
+		GDREGISTER_CLASS(OpenXRActionMap);
+		GDREGISTER_CLASS(OpenXRIPBinding);
+		GDREGISTER_CLASS(OpenXRInteractionProfile);
 
 
-	XRServer *xr_server = XRServer::get_singleton();
-	if (xr_server) {
-		openxr_interface.instantiate();
-		xr_server->add_interface(openxr_interface);
+		XRServer *xr_server = XRServer::get_singleton();
+		if (xr_server) {
+			openxr_interface.instantiate();
+			xr_server->add_interface(openxr_interface);
 
 
-		if (openxr_interface->initialize_on_startup()) {
-			openxr_interface->initialize();
+			if (openxr_interface->initialize_on_startup()) {
+				openxr_interface->initialize();
+			}
 		}
 		}
-	}
 
 
 #ifdef TOOLS_ENABLED
 #ifdef TOOLS_ENABLED
-	EditorNode::add_init_callback(_editor_init);
+		EditorNode::add_init_callback(_editor_init);
 #endif
 #endif
+	}
 }
 }
 
 
-void unregister_openxr_types() {
+void uninitialize_openxr_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+
 	if (openxr_interface.is_valid()) {
 	if (openxr_interface.is_valid()) {
 		// uninitialize just in case
 		// uninitialize just in case
 		if (openxr_interface->is_initialized()) {
 		if (openxr_interface->is_initialized()) {

+ 4 - 3
modules/openxr/register_types.h

@@ -33,8 +33,9 @@
 
 
 #define MODULE_OPENXR_HAS_PREREGISTER
 #define MODULE_OPENXR_HAS_PREREGISTER
 
 
-void preregister_openxr_types();
-void register_openxr_types();
-void unregister_openxr_types();
+#include "modules/register_module_types.h"
+
+void initialize_openxr_module(ModuleInitializationLevel p_level);
+void uninitialize_openxr_module(ModuleInitializationLevel p_level);
 
 
 #endif // OPENXR_REGISTER_TYPES_H
 #endif // OPENXR_REGISTER_TYPES_H

+ 10 - 2
modules/raycast/register_types.cpp

@@ -36,7 +36,11 @@
 
 
 RaycastOcclusionCull *raycast_occlusion_cull = nullptr;
 RaycastOcclusionCull *raycast_occlusion_cull = nullptr;
 
 
-void register_raycast_types() {
+void initialize_raycast_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+
 #ifdef TOOLS_ENABLED
 #ifdef TOOLS_ENABLED
 	LightmapRaycasterEmbree::make_default_raycaster();
 	LightmapRaycasterEmbree::make_default_raycaster();
 	StaticRaycasterEmbree::make_default_raycaster();
 	StaticRaycasterEmbree::make_default_raycaster();
@@ -44,7 +48,11 @@ void register_raycast_types() {
 	raycast_occlusion_cull = memnew(RaycastOcclusionCull);
 	raycast_occlusion_cull = memnew(RaycastOcclusionCull);
 }
 }
 
 
-void unregister_raycast_types() {
+void uninitialize_raycast_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+
 	if (raycast_occlusion_cull) {
 	if (raycast_occlusion_cull) {
 		memdelete(raycast_occlusion_cull);
 		memdelete(raycast_occlusion_cull);
 	}
 	}

+ 4 - 2
modules/raycast/register_types.h

@@ -28,5 +28,7 @@
 /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
 /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
 /*************************************************************************/
 /*************************************************************************/
 
 
-void register_raycast_types();
-void unregister_raycast_types();
+#include "modules/register_module_types.h"
+
+void initialize_raycast_module(ModuleInitializationLevel p_level);
+void uninitialize_raycast_module(ModuleInitializationLevel p_level);

+ 9 - 2
modules/regex/register_types.cpp

@@ -32,10 +32,17 @@
 #include "core/object/class_db.h"
 #include "core/object/class_db.h"
 #include "regex.h"
 #include "regex.h"
 
 
-void register_regex_types() {
+void initialize_regex_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+
 	GDREGISTER_CLASS(RegExMatch);
 	GDREGISTER_CLASS(RegExMatch);
 	GDREGISTER_CLASS(RegEx);
 	GDREGISTER_CLASS(RegEx);
 }
 }
 
 
-void unregister_regex_types() {
+void uninitialize_regex_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
 }
 }

+ 4 - 2
modules/regex/register_types.h

@@ -31,7 +31,9 @@
 #ifndef REGEX_REGISTER_TYPES_H
 #ifndef REGEX_REGISTER_TYPES_H
 #define REGEX_REGISTER_TYPES_H
 #define REGEX_REGISTER_TYPES_H
 
 
-void register_regex_types();
-void unregister_regex_types();
+#include "modules/register_module_types.h"
+
+void initialize_regex_module(ModuleInitializationLevel p_level);
+void uninitialize_regex_module(ModuleInitializationLevel p_level);
 
 
 #endif // REGEX_REGISTER_TYPES_H
 #endif // REGEX_REGISTER_TYPES_H

+ 11 - 3
modules/register_module_types.h

@@ -31,8 +31,16 @@
 #ifndef REGISTER_MODULE_TYPES_H
 #ifndef REGISTER_MODULE_TYPES_H
 #define REGISTER_MODULE_TYPES_H
 #define REGISTER_MODULE_TYPES_H
 
 
-void preregister_module_types();
-void register_module_types();
-void unregister_module_types();
+#include "core/extension/gdnative_interface.h"
+
+enum ModuleInitializationLevel {
+	MODULE_INITIALIZATION_LEVEL_CORE = GDNATIVE_INITIALIZATION_CORE,
+	MODULE_INITIALIZATION_LEVEL_SERVERS = GDNATIVE_INITIALIZATION_SERVERS,
+	MODULE_INITIALIZATION_LEVEL_SCENE = GDNATIVE_INITIALIZATION_SCENE,
+	MODULE_INITIALIZATION_LEVEL_EDITOR = GDNATIVE_INITIALIZATION_EDITOR
+};
+
+void initialize_modules(ModuleInitializationLevel p_level);
+void uninitialize_modules(ModuleInitializationLevel p_level);
 
 
 #endif // REGISTER_MODULE_TYPES_H
 #endif // REGISTER_MODULE_TYPES_H

+ 10 - 2
modules/squish/register_types.cpp

@@ -32,8 +32,16 @@
 
 
 #include "image_decompress_squish.h"
 #include "image_decompress_squish.h"
 
 
-void register_squish_types() {
+void initialize_squish_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+
 	Image::_image_decompress_bc = image_decompress_squish;
 	Image::_image_decompress_bc = image_decompress_squish;
 }
 }
 
 
-void unregister_squish_types() {}
+void uninitialize_squish_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+}

+ 4 - 2
modules/squish/register_types.h

@@ -31,7 +31,9 @@
 #ifndef SQUISH_REGISTER_TYPES_H
 #ifndef SQUISH_REGISTER_TYPES_H
 #define SQUISH_REGISTER_TYPES_H
 #define SQUISH_REGISTER_TYPES_H
 
 
-void register_squish_types();
-void unregister_squish_types();
+#include "modules/register_module_types.h"
+
+void initialize_squish_module(ModuleInitializationLevel p_level);
+void uninitialize_squish_module(ModuleInitializationLevel p_level);
 
 
 #endif // SQUISH_REGISTER_TYPES_H
 #endif // SQUISH_REGISTER_TYPES_H

+ 10 - 2
modules/svg/register_types.cpp

@@ -36,7 +36,11 @@
 
 
 static ImageLoaderSVG *image_loader_svg = nullptr;
 static ImageLoaderSVG *image_loader_svg = nullptr;
 
 
-void register_svg_types() {
+void initialize_svg_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+
 	tvg::CanvasEngine tvgEngine = tvg::CanvasEngine::Sw;
 	tvg::CanvasEngine tvgEngine = tvg::CanvasEngine::Sw;
 	if (tvg::Initializer::init(tvgEngine, 1) != tvg::Result::Success) {
 	if (tvg::Initializer::init(tvgEngine, 1) != tvg::Result::Success) {
 		return;
 		return;
@@ -45,7 +49,11 @@ void register_svg_types() {
 	ImageLoader::add_image_format_loader(image_loader_svg);
 	ImageLoader::add_image_format_loader(image_loader_svg);
 }
 }
 
 
-void unregister_svg_types() {
+void uninitialize_svg_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+
 	if (!image_loader_svg) {
 	if (!image_loader_svg) {
 		return;
 		return;
 	}
 	}

+ 4 - 2
modules/svg/register_types.h

@@ -31,7 +31,9 @@
 #ifndef SVG_REGISTER_TYPES_H
 #ifndef SVG_REGISTER_TYPES_H
 #define SVG_REGISTER_TYPES_H
 #define SVG_REGISTER_TYPES_H
 
 
-void register_svg_types();
-void unregister_svg_types();
+#include "modules/register_module_types.h"
+
+void initialize_svg_module(ModuleInitializationLevel p_level);
+void uninitialize_svg_module(ModuleInitializationLevel p_level);
 
 
 #endif // SVG_REGISTER_TYPES_H
 #endif // SVG_REGISTER_TYPES_H

+ 12 - 7
modules/text_server_adv/register_types.cpp

@@ -32,7 +32,11 @@
 
 
 #include "text_server_adv.h"
 #include "text_server_adv.h"
 
 
-void preregister_text_server_adv_types() {
+void initialize_text_server_adv_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SERVERS) {
+		return;
+	}
+
 	GDREGISTER_CLASS(TextServerAdvanced);
 	GDREGISTER_CLASS(TextServerAdvanced);
 	TextServerManager *tsman = TextServerManager::get_singleton();
 	TextServerManager *tsman = TextServerManager::get_singleton();
 	if (tsman) {
 	if (tsman) {
@@ -42,10 +46,10 @@ void preregister_text_server_adv_types() {
 	}
 	}
 }
 }
 
 
-void register_text_server_adv_types() {
-}
-
-void unregister_text_server_adv_types() {
+void uninitialize_text_server_adv_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SERVERS) {
+		return;
+	}
 }
 }
 
 
 #ifdef GDEXTENSION
 #ifdef GDEXTENSION
@@ -61,8 +65,9 @@ extern "C" {
 GDNativeBool GDN_EXPORT textserver_advanced_init(const GDNativeInterface *p_interface, const GDNativeExtensionClassLibraryPtr p_library, GDNativeInitialization *r_initialization) {
 GDNativeBool GDN_EXPORT textserver_advanced_init(const GDNativeInterface *p_interface, const GDNativeExtensionClassLibraryPtr p_library, GDNativeInitialization *r_initialization) {
 	GDExtensionBinding::InitObject init_obj(p_interface, p_library, r_initialization);
 	GDExtensionBinding::InitObject init_obj(p_interface, p_library, r_initialization);
 
 
-	init_obj.register_server_initializer(&preregister_text_server_adv_types);
-	init_obj.register_server_terminator(&unregister_text_server_adv_types);
+	init_obj.register_initializer(&initialize_text_server_adv_module);
+	init_obj.register_terminator(&uninitialize_text_server_adv_module);
+	init_obj.set_minimum_library_initialization_level(MODULE_INITIALIZATION_LEVEL_SERVERS);
 
 
 	return init_obj.init();
 	return init_obj.init();
 }
 }

+ 8 - 4
modules/text_server_adv/register_types.h

@@ -31,10 +31,14 @@
 #ifndef TEXT_SERVER_ADV_REGISTER_TYPES_H
 #ifndef TEXT_SERVER_ADV_REGISTER_TYPES_H
 #define TEXT_SERVER_ADV_REGISTER_TYPES_H
 #define TEXT_SERVER_ADV_REGISTER_TYPES_H
 
 
-#define MODULE_TEXT_SERVER_ADV_HAS_PREREGISTER
+#ifdef GDEXTENSION
+#include <godot_cpp/core/class_db.hpp>
+using namespace godot;
+#else
+#include "modules/register_module_types.h"
+#endif
 
 
-void preregister_text_server_adv_types();
-void register_text_server_adv_types();
-void unregister_text_server_adv_types();
+void initialize_text_server_adv_module(ModuleInitializationLevel p_level);
+void uninitialize_text_server_adv_module(ModuleInitializationLevel p_level);
 
 
 #endif // TEXT_SERVER_ADV_REGISTER_TYPES_H
 #endif // TEXT_SERVER_ADV_REGISTER_TYPES_H

+ 12 - 7
modules/text_server_fb/register_types.cpp

@@ -32,7 +32,11 @@
 
 
 #include "text_server_fb.h"
 #include "text_server_fb.h"
 
 
-void preregister_text_server_fb_types() {
+void initialize_text_server_fb_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SERVERS) {
+		return;
+	}
+
 	GDREGISTER_CLASS(TextServerFallback);
 	GDREGISTER_CLASS(TextServerFallback);
 	TextServerManager *tsman = TextServerManager::get_singleton();
 	TextServerManager *tsman = TextServerManager::get_singleton();
 	if (tsman) {
 	if (tsman) {
@@ -42,10 +46,10 @@ void preregister_text_server_fb_types() {
 	}
 	}
 }
 }
 
 
-void register_text_server_fb_types() {
-}
-
-void unregister_text_server_fb_types() {
+void uninitialize_text_server_fb_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SERVERS) {
+		return;
+	}
 }
 }
 
 
 #ifdef GDEXTENSION
 #ifdef GDEXTENSION
@@ -61,8 +65,9 @@ extern "C" {
 GDNativeBool GDN_EXPORT textserver_fallback_init(const GDNativeInterface *p_interface, const GDNativeExtensionClassLibraryPtr p_library, GDNativeInitialization *r_initialization) {
 GDNativeBool GDN_EXPORT textserver_fallback_init(const GDNativeInterface *p_interface, const GDNativeExtensionClassLibraryPtr p_library, GDNativeInitialization *r_initialization) {
 	GDExtensionBinding::InitObject init_obj(p_interface, p_library, r_initialization);
 	GDExtensionBinding::InitObject init_obj(p_interface, p_library, r_initialization);
 
 
-	init_obj.register_server_initializer(&preregister_text_server_fb_types);
-	init_obj.register_server_terminator(&unregister_text_server_fb_types);
+	init_obj.register_initializer(&initialize_text_server_fb_module);
+	init_obj.register_terminator(&uninitialize_text_server_fb_module);
+	init_obj.set_minimum_library_initialization_level(MODULE_INITIALIZATION_LEVEL_SERVERS);
 
 
 	return init_obj.init();
 	return init_obj.init();
 }
 }

+ 8 - 4
modules/text_server_fb/register_types.h

@@ -31,10 +31,14 @@
 #ifndef TEXT_SERVER_FB_REGISTER_TYPES_H
 #ifndef TEXT_SERVER_FB_REGISTER_TYPES_H
 #define TEXT_SERVER_FB_REGISTER_TYPES_H
 #define TEXT_SERVER_FB_REGISTER_TYPES_H
 
 
-#define MODULE_TEXT_SERVER_FB_HAS_PREREGISTER
+#ifdef GDEXTENSION
+#include <godot_cpp/core/class_db.hpp>
+using namespace godot;
+#else
+#include "modules/register_module_types.h"
+#endif
 
 
-void preregister_text_server_fb_types();
-void register_text_server_fb_types();
-void unregister_text_server_fb_types();
+void initialize_text_server_fb_module(ModuleInitializationLevel p_level);
+void uninitialize_text_server_fb_module(ModuleInitializationLevel p_level);
 
 
 #endif // TEXT_SERVER_FB_REGISTER_TYPES_H
 #endif // TEXT_SERVER_FB_REGISTER_TYPES_H

+ 10 - 2
modules/tga/register_types.cpp

@@ -34,11 +34,19 @@
 
 
 static ImageLoaderTGA *image_loader_tga = nullptr;
 static ImageLoaderTGA *image_loader_tga = nullptr;
 
 
-void register_tga_types() {
+void initialize_tga_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+
 	image_loader_tga = memnew(ImageLoaderTGA);
 	image_loader_tga = memnew(ImageLoaderTGA);
 	ImageLoader::add_image_format_loader(image_loader_tga);
 	ImageLoader::add_image_format_loader(image_loader_tga);
 }
 }
 
 
-void unregister_tga_types() {
+void uninitialize_tga_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+
 	memdelete(image_loader_tga);
 	memdelete(image_loader_tga);
 }
 }

+ 4 - 2
modules/tga/register_types.h

@@ -31,7 +31,9 @@
 #ifndef TGA_REGISTER_TYPES_H
 #ifndef TGA_REGISTER_TYPES_H
 #define TGA_REGISTER_TYPES_H
 #define TGA_REGISTER_TYPES_H
 
 
-void register_tga_types();
-void unregister_tga_types();
+#include "modules/register_module_types.h"
+
+void initialize_tga_module(ModuleInitializationLevel p_level);
+void uninitialize_tga_module(ModuleInitializationLevel p_level);
 
 
 #endif // TGA_REGISTER_TYPES_H
 #endif // TGA_REGISTER_TYPES_H

+ 10 - 2
modules/theora/register_types.cpp

@@ -34,14 +34,22 @@
 
 
 static Ref<ResourceFormatLoaderTheora> resource_loader_theora;
 static Ref<ResourceFormatLoaderTheora> resource_loader_theora;
 
 
-void register_theora_types() {
+void initialize_theora_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+
 	resource_loader_theora.instantiate();
 	resource_loader_theora.instantiate();
 	ResourceLoader::add_resource_format_loader(resource_loader_theora, true);
 	ResourceLoader::add_resource_format_loader(resource_loader_theora, true);
 
 
 	GDREGISTER_CLASS(VideoStreamTheora);
 	GDREGISTER_CLASS(VideoStreamTheora);
 }
 }
 
 
-void unregister_theora_types() {
+void uninitialize_theora_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+
 	ResourceLoader::remove_resource_format_loader(resource_loader_theora);
 	ResourceLoader::remove_resource_format_loader(resource_loader_theora);
 	resource_loader_theora.unref();
 	resource_loader_theora.unref();
 }
 }

+ 4 - 2
modules/theora/register_types.h

@@ -31,7 +31,9 @@
 #ifndef THEORA_REGISTER_TYPES_H
 #ifndef THEORA_REGISTER_TYPES_H
 #define THEORA_REGISTER_TYPES_H
 #define THEORA_REGISTER_TYPES_H
 
 
-void register_theora_types();
-void unregister_theora_types();
+#include "modules/register_module_types.h"
+
+void initialize_theora_module(ModuleInitializationLevel p_level);
+void uninitialize_theora_module(ModuleInitializationLevel p_level);
 
 
 #endif // THEORA_REGISTER_TYPES_H
 #endif // THEORA_REGISTER_TYPES_H

+ 10 - 2
modules/tinyexr/register_types.cpp

@@ -35,14 +35,22 @@
 
 
 static ImageLoaderTinyEXR *image_loader_tinyexr = nullptr;
 static ImageLoaderTinyEXR *image_loader_tinyexr = nullptr;
 
 
-void register_tinyexr_types() {
+void initialize_tinyexr_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+
 	image_loader_tinyexr = memnew(ImageLoaderTinyEXR);
 	image_loader_tinyexr = memnew(ImageLoaderTinyEXR);
 	ImageLoader::add_image_format_loader(image_loader_tinyexr);
 	ImageLoader::add_image_format_loader(image_loader_tinyexr);
 
 
 	Image::save_exr_func = save_exr;
 	Image::save_exr_func = save_exr;
 }
 }
 
 
-void unregister_tinyexr_types() {
+void uninitialize_tinyexr_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+
 	memdelete(image_loader_tinyexr);
 	memdelete(image_loader_tinyexr);
 
 
 	Image::save_exr_func = nullptr;
 	Image::save_exr_func = nullptr;

+ 4 - 2
modules/tinyexr/register_types.h

@@ -31,7 +31,9 @@
 #ifndef TINYEXR_REGISTER_TYPES_H
 #ifndef TINYEXR_REGISTER_TYPES_H
 #define TINYEXR_REGISTER_TYPES_H
 #define TINYEXR_REGISTER_TYPES_H
 
 
-void register_tinyexr_types();
-void unregister_tinyexr_types();
+#include "modules/register_module_types.h"
+
+void initialize_tinyexr_module(ModuleInitializationLevel p_level);
+void uninitialize_tinyexr_module(ModuleInitializationLevel p_level);
 
 
 #endif // TINYEXR_REGISTER_TYPES_H
 #endif // TINYEXR_REGISTER_TYPES_H

+ 9 - 2
modules/upnp/register_types.cpp

@@ -35,10 +35,17 @@
 #include "upnp.h"
 #include "upnp.h"
 #include "upnp_device.h"
 #include "upnp_device.h"
 
 
-void register_upnp_types() {
+void initialize_upnp_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+
 	GDREGISTER_CLASS(UPNP);
 	GDREGISTER_CLASS(UPNP);
 	GDREGISTER_CLASS(UPNPDevice);
 	GDREGISTER_CLASS(UPNPDevice);
 }
 }
 
 
-void unregister_upnp_types() {
+void uninitialize_upnp_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
 }
 }

+ 4 - 2
modules/upnp/register_types.h

@@ -31,7 +31,9 @@
 #ifndef UPNP_REGISTER_TYPES_H
 #ifndef UPNP_REGISTER_TYPES_H
 #define UPNP_REGISTER_TYPES_H
 #define UPNP_REGISTER_TYPES_H
 
 
-void register_upnp_types();
-void unregister_upnp_types();
+#include "modules/register_module_types.h"
+
+void initialize_upnp_module(ModuleInitializationLevel p_level);
+void uninitialize_upnp_module(ModuleInitializationLevel p_level);
 
 
 #endif // UPNP_REGISTER_TYPES_H
 #endif // UPNP_REGISTER_TYPES_H

+ 10 - 2
modules/vhacd/register_types.cpp

@@ -89,10 +89,18 @@ static Vector<Vector<Vector3>> convex_decompose(const real_t *p_vertices, int p_
 	return ret;
 	return ret;
 }
 }
 
 
-void register_vhacd_types() {
+void initialize_vhacd_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+
 	Mesh::convex_decomposition_function = convex_decompose;
 	Mesh::convex_decomposition_function = convex_decompose;
 }
 }
 
 
-void unregister_vhacd_types() {
+void uninitialize_vhacd_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+
 	Mesh::convex_decomposition_function = nullptr;
 	Mesh::convex_decomposition_function = nullptr;
 }
 }

+ 4 - 2
modules/vhacd/register_types.h

@@ -31,7 +31,9 @@
 #ifndef VHACD_REGISTER_TYPES_H
 #ifndef VHACD_REGISTER_TYPES_H
 #define VHACD_REGISTER_TYPES_H
 #define VHACD_REGISTER_TYPES_H
 
 
-void register_vhacd_types();
-void unregister_vhacd_types();
+#include "modules/register_module_types.h"
+
+void initialize_vhacd_module(ModuleInitializationLevel p_level);
+void uninitialize_vhacd_module(ModuleInitializationLevel p_level);
 
 
 #endif // VHACD_REGISTER_TYPES_H
 #endif // VHACD_REGISTER_TYPES_H

+ 90 - 81
modules/visual_script/register_types.cpp

@@ -47,95 +47,104 @@ VisualScriptLanguage *visual_script_language = nullptr;
 static VisualScriptCustomNodes *vs_custom_nodes_singleton = nullptr;
 static VisualScriptCustomNodes *vs_custom_nodes_singleton = nullptr;
 #endif
 #endif
 
 
-void register_visual_script_types() {
-	visual_script_language = memnew(VisualScriptLanguage);
-	//script_language_gd->init();
-	ScriptServer::register_language(visual_script_language);
-
-	GDREGISTER_CLASS(VisualScript);
-	GDREGISTER_ABSTRACT_CLASS(VisualScriptNode);
-	GDREGISTER_CLASS(VisualScriptFunctionState);
-	GDREGISTER_CLASS(VisualScriptFunction);
-	GDREGISTER_ABSTRACT_CLASS(VisualScriptLists);
-	GDREGISTER_CLASS(VisualScriptComposeArray);
-	GDREGISTER_CLASS(VisualScriptOperator);
-	GDREGISTER_CLASS(VisualScriptVariableSet);
-	GDREGISTER_CLASS(VisualScriptVariableGet);
-	GDREGISTER_CLASS(VisualScriptConstant);
-	GDREGISTER_CLASS(VisualScriptIndexGet);
-	GDREGISTER_CLASS(VisualScriptIndexSet);
-	GDREGISTER_CLASS(VisualScriptGlobalConstant);
-	GDREGISTER_CLASS(VisualScriptClassConstant);
-	GDREGISTER_CLASS(VisualScriptMathConstant);
-	GDREGISTER_CLASS(VisualScriptBasicTypeConstant);
-	GDREGISTER_CLASS(VisualScriptEngineSingleton);
-	GDREGISTER_CLASS(VisualScriptSceneNode);
-	GDREGISTER_CLASS(VisualScriptSceneTree);
-	GDREGISTER_CLASS(VisualScriptResourcePath);
-	GDREGISTER_CLASS(VisualScriptSelf);
-	GDREGISTER_CLASS(VisualScriptCustomNode);
-	GDREGISTER_CLASS(VisualScriptSubCall);
-	GDREGISTER_CLASS(VisualScriptComment);
-	GDREGISTER_CLASS(VisualScriptConstructor);
-	GDREGISTER_CLASS(VisualScriptLocalVar);
-	GDREGISTER_CLASS(VisualScriptLocalVarSet);
-	GDREGISTER_CLASS(VisualScriptInputAction);
-	GDREGISTER_CLASS(VisualScriptDeconstruct);
-	GDREGISTER_CLASS(VisualScriptPreload);
-	GDREGISTER_CLASS(VisualScriptTypeCast);
-
-	GDREGISTER_CLASS(VisualScriptFunctionCall);
-	GDREGISTER_CLASS(VisualScriptPropertySet);
-	GDREGISTER_CLASS(VisualScriptPropertyGet);
-	//ClassDB::register_type<VisualScriptScriptCall>();
-	GDREGISTER_CLASS(VisualScriptEmitSignal);
-
-	GDREGISTER_CLASS(VisualScriptReturn);
-	GDREGISTER_CLASS(VisualScriptCondition);
-	GDREGISTER_CLASS(VisualScriptWhile);
-	GDREGISTER_CLASS(VisualScriptIterator);
-	GDREGISTER_CLASS(VisualScriptSequence);
-	//GDREGISTER_CLASS(VisualScriptInputFilter);
-	GDREGISTER_CLASS(VisualScriptSwitch);
-	GDREGISTER_CLASS(VisualScriptSelect);
-
-	GDREGISTER_CLASS(VisualScriptYield);
-	GDREGISTER_CLASS(VisualScriptYieldSignal);
-
-	GDREGISTER_CLASS(VisualScriptBuiltinFunc);
-
-	GDREGISTER_CLASS(VisualScriptExpression);
-
-	register_visual_script_nodes();
-	register_visual_script_func_nodes();
-	register_visual_script_builtin_func_node();
-	register_visual_script_flow_control_nodes();
-	register_visual_script_yield_nodes();
-	register_visual_script_expression_node();
+void initialize_visual_script_module(ModuleInitializationLevel p_level) {
+	if (p_level == MODULE_INITIALIZATION_LEVEL_SERVERS) {
+		visual_script_language = memnew(VisualScriptLanguage);
+		//script_language_gd->init();
+		ScriptServer::register_language(visual_script_language);
+
+		GDREGISTER_CLASS(VisualScript);
+		GDREGISTER_ABSTRACT_CLASS(VisualScriptNode);
+		GDREGISTER_CLASS(VisualScriptFunctionState);
+		GDREGISTER_CLASS(VisualScriptFunction);
+		GDREGISTER_ABSTRACT_CLASS(VisualScriptLists);
+		GDREGISTER_CLASS(VisualScriptComposeArray);
+		GDREGISTER_CLASS(VisualScriptOperator);
+		GDREGISTER_CLASS(VisualScriptVariableSet);
+		GDREGISTER_CLASS(VisualScriptVariableGet);
+		GDREGISTER_CLASS(VisualScriptConstant);
+		GDREGISTER_CLASS(VisualScriptIndexGet);
+		GDREGISTER_CLASS(VisualScriptIndexSet);
+		GDREGISTER_CLASS(VisualScriptGlobalConstant);
+		GDREGISTER_CLASS(VisualScriptClassConstant);
+		GDREGISTER_CLASS(VisualScriptMathConstant);
+		GDREGISTER_CLASS(VisualScriptBasicTypeConstant);
+		GDREGISTER_CLASS(VisualScriptEngineSingleton);
+		GDREGISTER_CLASS(VisualScriptSceneNode);
+		GDREGISTER_CLASS(VisualScriptSceneTree);
+		GDREGISTER_CLASS(VisualScriptResourcePath);
+		GDREGISTER_CLASS(VisualScriptSelf);
+		GDREGISTER_CLASS(VisualScriptCustomNode);
+		GDREGISTER_CLASS(VisualScriptSubCall);
+		GDREGISTER_CLASS(VisualScriptComment);
+		GDREGISTER_CLASS(VisualScriptConstructor);
+		GDREGISTER_CLASS(VisualScriptLocalVar);
+		GDREGISTER_CLASS(VisualScriptLocalVarSet);
+		GDREGISTER_CLASS(VisualScriptInputAction);
+		GDREGISTER_CLASS(VisualScriptDeconstruct);
+		GDREGISTER_CLASS(VisualScriptPreload);
+		GDREGISTER_CLASS(VisualScriptTypeCast);
+
+		GDREGISTER_CLASS(VisualScriptFunctionCall);
+		GDREGISTER_CLASS(VisualScriptPropertySet);
+		GDREGISTER_CLASS(VisualScriptPropertyGet);
+		//ClassDB::register_type<VisualScriptScriptCall>();
+		GDREGISTER_CLASS(VisualScriptEmitSignal);
+
+		GDREGISTER_CLASS(VisualScriptReturn);
+		GDREGISTER_CLASS(VisualScriptCondition);
+		GDREGISTER_CLASS(VisualScriptWhile);
+		GDREGISTER_CLASS(VisualScriptIterator);
+		GDREGISTER_CLASS(VisualScriptSequence);
+		//GDREGISTER_CLASS(VisualScriptInputFilter);
+		GDREGISTER_CLASS(VisualScriptSwitch);
+		GDREGISTER_CLASS(VisualScriptSelect);
+
+		GDREGISTER_CLASS(VisualScriptYield);
+		GDREGISTER_CLASS(VisualScriptYieldSignal);
+
+		GDREGISTER_CLASS(VisualScriptBuiltinFunc);
+
+		GDREGISTER_CLASS(VisualScriptExpression);
+
+		register_visual_script_nodes();
+		register_visual_script_func_nodes();
+		register_visual_script_builtin_func_node();
+		register_visual_script_flow_control_nodes();
+		register_visual_script_yield_nodes();
+		register_visual_script_expression_node();
+	}
 
 
 #ifdef TOOLS_ENABLED
 #ifdef TOOLS_ENABLED
-	ClassDB::set_current_api(ClassDB::API_EDITOR);
-	GDREGISTER_CLASS(VisualScriptCustomNodes);
-	ClassDB::set_current_api(ClassDB::API_CORE);
-	vs_custom_nodes_singleton = memnew(VisualScriptCustomNodes);
-	Engine::get_singleton()->add_singleton(Engine::Singleton("VisualScriptCustomNodes", VisualScriptCustomNodes::get_singleton()));
-
-	VisualScriptEditor::register_editor();
+	if (p_level == MODULE_INITIALIZATION_LEVEL_EDITOR) {
+		ClassDB::set_current_api(ClassDB::API_EDITOR);
+		GDREGISTER_CLASS(VisualScriptCustomNodes);
+		ClassDB::set_current_api(ClassDB::API_CORE);
+		vs_custom_nodes_singleton = memnew(VisualScriptCustomNodes);
+		Engine::get_singleton()->add_singleton(Engine::Singleton("VisualScriptCustomNodes", VisualScriptCustomNodes::get_singleton()));
+
+		VisualScriptEditor::register_editor();
+	}
 #endif
 #endif
 }
 }
 
 
-void unregister_visual_script_types() {
-	unregister_visual_script_nodes();
+void uninitialize_visual_script_module(ModuleInitializationLevel p_level) {
+	if (p_level == MODULE_INITIALIZATION_LEVEL_SERVERS) {
+		unregister_visual_script_nodes();
 
 
-	ScriptServer::unregister_language(visual_script_language);
+		ScriptServer::unregister_language(visual_script_language);
+
+		if (visual_script_language) {
+			memdelete(visual_script_language);
+		}
+	}
 
 
 #ifdef TOOLS_ENABLED
 #ifdef TOOLS_ENABLED
-	VisualScriptEditor::free_clipboard();
-	if (vs_custom_nodes_singleton) {
-		memdelete(vs_custom_nodes_singleton);
+	if (p_level == MODULE_INITIALIZATION_LEVEL_EDITOR) {
+		VisualScriptEditor::free_clipboard();
+		if (vs_custom_nodes_singleton) {
+			memdelete(vs_custom_nodes_singleton);
+		}
 	}
 	}
 #endif
 #endif
-	if (visual_script_language) {
-		memdelete(visual_script_language);
-	}
 }
 }

+ 4 - 2
modules/visual_script/register_types.h

@@ -31,7 +31,9 @@
 #ifndef VISUAL_SCRIPT_REGISTER_TYPES_H
 #ifndef VISUAL_SCRIPT_REGISTER_TYPES_H
 #define VISUAL_SCRIPT_REGISTER_TYPES_H
 #define VISUAL_SCRIPT_REGISTER_TYPES_H
 
 
-void register_visual_script_types();
-void unregister_visual_script_types();
+#include "modules/register_module_types.h"
+
+void initialize_visual_script_module(ModuleInitializationLevel p_level);
+void uninitialize_visual_script_module(ModuleInitializationLevel p_level);
 
 
 #endif // VISUAL_SCRIPT_REGISTER_TYPES_H
 #endif // VISUAL_SCRIPT_REGISTER_TYPES_H

+ 10 - 2
modules/vorbis/register_types.cpp

@@ -33,7 +33,11 @@
 #include "audio_stream_ogg_vorbis.h"
 #include "audio_stream_ogg_vorbis.h"
 #include "resource_importer_ogg_vorbis.h"
 #include "resource_importer_ogg_vorbis.h"
 
 
-void register_vorbis_types() {
+void initialize_vorbis_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+
 #ifdef TOOLS_ENABLED
 #ifdef TOOLS_ENABLED
 	if (Engine::get_singleton()->is_editor_hint()) {
 	if (Engine::get_singleton()->is_editor_hint()) {
 		Ref<ResourceImporterOGGVorbis> ogg_vorbis_importer;
 		Ref<ResourceImporterOGGVorbis> ogg_vorbis_importer;
@@ -45,4 +49,8 @@ void register_vorbis_types() {
 	GDREGISTER_CLASS(AudioStreamPlaybackOGGVorbis);
 	GDREGISTER_CLASS(AudioStreamPlaybackOGGVorbis);
 }
 }
 
 
-void unregister_vorbis_types() {}
+void uninitialize_vorbis_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+}

+ 4 - 2
modules/vorbis/register_types.h

@@ -31,7 +31,9 @@
 #ifndef VORBIS_REGISTER_TYPES_H
 #ifndef VORBIS_REGISTER_TYPES_H
 #define VORBIS_REGISTER_TYPES_H
 #define VORBIS_REGISTER_TYPES_H
 
 
-void register_vorbis_types();
-void unregister_vorbis_types();
+#include "modules/register_module_types.h"
+
+void initialize_vorbis_module(ModuleInitializationLevel p_level);
+void uninitialize_vorbis_module(ModuleInitializationLevel p_level);
 
 
 #endif // VORBIS_REGISTER_TYPES_H
 #endif // VORBIS_REGISTER_TYPES_H

+ 10 - 2
modules/webp/register_types.cpp

@@ -34,11 +34,19 @@
 
 
 static ImageLoaderWEBP *image_loader_webp = nullptr;
 static ImageLoaderWEBP *image_loader_webp = nullptr;
 
 
-void register_webp_types() {
+void initialize_webp_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+
 	image_loader_webp = memnew(ImageLoaderWEBP);
 	image_loader_webp = memnew(ImageLoaderWEBP);
 	ImageLoader::add_image_format_loader(image_loader_webp);
 	ImageLoader::add_image_format_loader(image_loader_webp);
 }
 }
 
 
-void unregister_webp_types() {
+void uninitialize_webp_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+
 	memdelete(image_loader_webp);
 	memdelete(image_loader_webp);
 }
 }

+ 4 - 2
modules/webp/register_types.h

@@ -31,7 +31,9 @@
 #ifndef WEBP_REGISTER_TYPES_H
 #ifndef WEBP_REGISTER_TYPES_H
 #define WEBP_REGISTER_TYPES_H
 #define WEBP_REGISTER_TYPES_H
 
 
-void register_webp_types();
-void unregister_webp_types();
+#include "modules/register_module_types.h"
+
+void initialize_webp_module(ModuleInitializationLevel p_level);
+void uninitialize_webp_module(ModuleInitializationLevel p_level);
 
 
 #endif // WEBP_REGISTER_TYPES_H
 #endif // WEBP_REGISTER_TYPES_H

+ 10 - 2
modules/webrtc/register_types.cpp

@@ -37,7 +37,11 @@
 #include "webrtc_data_channel_extension.h"
 #include "webrtc_data_channel_extension.h"
 #include "webrtc_peer_connection_extension.h"
 #include "webrtc_peer_connection_extension.h"
 
 
-void register_webrtc_types() {
+void initialize_webrtc_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+
 #define SET_HINT(NAME, _VAL_, _MAX_) \
 #define SET_HINT(NAME, _VAL_, _MAX_) \
 	GLOBAL_DEF(NAME, _VAL_);         \
 	GLOBAL_DEF(NAME, _VAL_);         \
 	ProjectSettings::get_singleton()->set_custom_property_info(NAME, PropertyInfo(Variant::INT, NAME, PROPERTY_HINT_RANGE, "2," #_MAX_ ",1,or_greater"));
 	ProjectSettings::get_singleton()->set_custom_property_info(NAME, PropertyInfo(Variant::INT, NAME, PROPERTY_HINT_RANGE, "2," #_MAX_ ",1,or_greater"));
@@ -55,4 +59,8 @@ void register_webrtc_types() {
 #undef SET_HINT
 #undef SET_HINT
 }
 }
 
 
-void unregister_webrtc_types() {}
+void uninitialize_webrtc_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+}

+ 4 - 2
modules/webrtc/register_types.h

@@ -31,7 +31,9 @@
 #ifndef WEBRTC_REGISTER_TYPES_H
 #ifndef WEBRTC_REGISTER_TYPES_H
 #define WEBRTC_REGISTER_TYPES_H
 #define WEBRTC_REGISTER_TYPES_H
 
 
-void register_webrtc_types();
-void unregister_webrtc_types();
+#include "modules/register_module_types.h"
+
+void initialize_webrtc_module(ModuleInitializationLevel p_level);
+void uninitialize_webrtc_module(ModuleInitializationLevel p_level);
 
 
 #endif // WEBRTC_REGISTER_TYPES_H
 #endif // WEBRTC_REGISTER_TYPES_H

+ 21 - 13
modules/websocket/register_types.cpp

@@ -55,25 +55,33 @@ static void _editor_init_callback() {
 }
 }
 #endif
 #endif
 
 
-void register_websocket_types() {
+void initialize_websocket_module(ModuleInitializationLevel p_level) {
+	if (p_level == MODULE_INITIALIZATION_LEVEL_SCENE) {
 #ifdef JAVASCRIPT_ENABLED
 #ifdef JAVASCRIPT_ENABLED
-	EMWSPeer::make_default();
-	EMWSClient::make_default();
-	EMWSServer::make_default();
+		EMWSPeer::make_default();
+		EMWSClient::make_default();
+		EMWSServer::make_default();
 #else
 #else
-	WSLPeer::make_default();
-	WSLClient::make_default();
-	WSLServer::make_default();
+		WSLPeer::make_default();
+		WSLClient::make_default();
+		WSLServer::make_default();
 #endif
 #endif
 
 
-	GDREGISTER_ABSTRACT_CLASS(WebSocketMultiplayerPeer);
-	ClassDB::register_custom_instance_class<WebSocketServer>();
-	ClassDB::register_custom_instance_class<WebSocketClient>();
-	ClassDB::register_custom_instance_class<WebSocketPeer>();
+		GDREGISTER_ABSTRACT_CLASS(WebSocketMultiplayerPeer);
+		ClassDB::register_custom_instance_class<WebSocketServer>();
+		ClassDB::register_custom_instance_class<WebSocketClient>();
+		ClassDB::register_custom_instance_class<WebSocketPeer>();
+	}
 
 
 #ifdef TOOLS_ENABLED
 #ifdef TOOLS_ENABLED
-	EditorNode::add_init_callback(&_editor_init_callback);
+	if (p_level == MODULE_INITIALIZATION_LEVEL_EDITOR) {
+		EditorNode::add_init_callback(&_editor_init_callback);
+	}
 #endif
 #endif
 }
 }
 
 
-void unregister_websocket_types() {}
+void uninitialize_websocket_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+}

+ 4 - 2
modules/websocket/register_types.h

@@ -31,7 +31,9 @@
 #ifndef WEBSOCKET_REGISTER_TYPES_H
 #ifndef WEBSOCKET_REGISTER_TYPES_H
 #define WEBSOCKET_REGISTER_TYPES_H
 #define WEBSOCKET_REGISTER_TYPES_H
 
 
-void register_websocket_types();
-void unregister_websocket_types();
+#include "modules/register_module_types.h"
+
+void initialize_websocket_module(ModuleInitializationLevel p_level);
+void uninitialize_websocket_module(ModuleInitializationLevel p_level);
 
 
 #endif // WEBSOCKET_REGISTER_TYPES_H
 #endif // WEBSOCKET_REGISTER_TYPES_H

+ 10 - 2
modules/webxr/register_types.cpp

@@ -37,7 +37,11 @@
 Ref<WebXRInterfaceJS> webxr;
 Ref<WebXRInterfaceJS> webxr;
 #endif
 #endif
 
 
-void register_webxr_types() {
+void initialize_webxr_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+
 	GDREGISTER_ABSTRACT_CLASS(WebXRInterface);
 	GDREGISTER_ABSTRACT_CLASS(WebXRInterface);
 
 
 #ifdef JAVASCRIPT_ENABLED
 #ifdef JAVASCRIPT_ENABLED
@@ -46,7 +50,11 @@ void register_webxr_types() {
 #endif
 #endif
 }
 }
 
 
-void unregister_webxr_types() {
+void uninitialize_webxr_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+
 #ifdef JAVASCRIPT_ENABLED
 #ifdef JAVASCRIPT_ENABLED
 	if (webxr.is_valid()) {
 	if (webxr.is_valid()) {
 		// uninitialise our interface if it is initialised
 		// uninitialise our interface if it is initialised

+ 4 - 2
modules/webxr/register_types.h

@@ -31,7 +31,9 @@
 #ifndef WEBXR_REGISTER_TYPES_H
 #ifndef WEBXR_REGISTER_TYPES_H
 #define WEBXR_REGISTER_TYPES_H
 #define WEBXR_REGISTER_TYPES_H
 
 
-void register_webxr_types();
-void unregister_webxr_types();
+#include "modules/register_module_types.h"
+
+void initialize_webxr_module(ModuleInitializationLevel p_level);
+void uninitialize_webxr_module(ModuleInitializationLevel p_level);
 
 
 #endif // WEBXR_REGISTER_TYPES_H
 #endif // WEBXR_REGISTER_TYPES_H

+ 9 - 2
modules/xatlas_unwrap/register_types.cpp

@@ -222,9 +222,16 @@ bool xatlas_mesh_lightmap_unwrap_callback(float p_texel_size, const float *p_ver
 	return true;
 	return true;
 }
 }
 
 
-void register_xatlas_unwrap_types() {
+void initialize_xatlas_unwrap_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
+
 	array_mesh_lightmap_unwrap_callback = xatlas_mesh_lightmap_unwrap_callback;
 	array_mesh_lightmap_unwrap_callback = xatlas_mesh_lightmap_unwrap_callback;
 }
 }
 
 
-void unregister_xatlas_unwrap_types() {
+void uninitialize_xatlas_unwrap_module(ModuleInitializationLevel p_level) {
+	if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
+		return;
+	}
 }
 }

Some files were not shown because too many files changed in this diff