From fb884573ea1a0ec36d1968bf12a667cd17023d38 Mon Sep 17 00:00:00 2001 From: David Snopek Date: Fri, 29 Sep 2023 16:30:59 -0500 Subject: Allow registering "runtime classes" --- include/godot_cpp/core/class_db.hpp | 17 +++++++++++++---- include/godot_cpp/godot.hpp | 2 +- 2 files changed, 14 insertions(+), 5 deletions(-) (limited to 'include/godot_cpp') diff --git a/include/godot_cpp/core/class_db.hpp b/include/godot_cpp/core/class_db.hpp index e5bccf3..91748e6 100644 --- a/include/godot_cpp/core/class_db.hpp +++ b/include/godot_cpp/core/class_db.hpp @@ -110,7 +110,7 @@ private: static void bind_method_godot(const StringName &p_class_name, MethodBind *p_method); template - static void _register_class(bool p_virtual = false, bool p_exposed = true); + static void _register_class(bool p_virtual = false, bool p_exposed = true, bool p_runtime = false); template static GDExtensionObjectPtr _create_instance_func(void *data) { @@ -146,6 +146,8 @@ public: static void register_abstract_class(); template static void register_internal_class(); + template + static void register_runtime_class(); _FORCE_INLINE_ static void _register_engine_class(const StringName &p_name, const GDExtensionInstanceBindingCallbacks *p_callbacks) { instance_binding_callbacks[p_name] = p_callbacks; @@ -199,7 +201,7 @@ public: } template -void ClassDB::_register_class(bool p_virtual, bool p_exposed) { +void ClassDB::_register_class(bool p_virtual, bool p_exposed, bool p_runtime) { static_assert(TypesAreSame::value, "Class not declared properly, please use GDCLASS."); instance_binding_callbacks[T::get_class_static()] = &T::_gde_binding_callbacks; @@ -217,10 +219,11 @@ void ClassDB::_register_class(bool p_virtual, bool p_exposed) { class_register_order.push_back(cl.name); // Register this class with Godot - GDExtensionClassCreationInfo2 class_info = { + GDExtensionClassCreationInfo3 class_info = { p_virtual, // GDExtensionBool is_virtual; is_abstract, // GDExtensionBool is_abstract; p_exposed, // GDExtensionBool is_exposed; + p_runtime, // GDExtensionBool is_runtime; T::set_bind, // GDExtensionClassSet set_func; T::get_bind, // GDExtensionClassGet get_func; T::has_get_property_list() ? T::get_property_list_bind : nullptr, // GDExtensionClassGetPropertyList get_property_list_func; @@ -242,7 +245,7 @@ void ClassDB::_register_class(bool p_virtual, bool p_exposed) { (void *)&T::get_class_static(), // void *class_userdata; }; - internal::gdextension_interface_classdb_register_extension_class2(internal::library, cl.name._native_ptr(), cl.parent_name._native_ptr(), &class_info); + internal::gdextension_interface_classdb_register_extension_class3(internal::library, cl.name._native_ptr(), cl.parent_name._native_ptr(), &class_info); // call bind_methods etc. to register all members of the class T::initialize_class(); @@ -266,6 +269,11 @@ void ClassDB::register_internal_class() { ClassDB::_register_class(false, false); } +template +void ClassDB::register_runtime_class() { + ClassDB::_register_class(false, true, true); +} + template MethodBind *ClassDB::bind_method(N p_method_name, M p_method, VarArgs... p_args) { Variant args[sizeof...(p_args) + 1] = { p_args..., Variant() }; // +1 makes sure zero sized arrays are also supported. @@ -325,6 +333,7 @@ MethodBind *ClassDB::bind_vararg_method(uint32_t p_flags, StringName p_name, M p #define GDREGISTER_VIRTUAL_CLASS(m_class) ClassDB::register_class(true); #define GDREGISTER_ABSTRACT_CLASS(m_class) ClassDB::register_abstract_class(); #define GDREGISTER_INTERNAL_CLASS(m_class) ClassDB::register_internal_class(); +#define GDREGISTER_RUNTIME_CLASS(m_class) ClassDB::register_runtime_class(); } // namespace godot diff --git a/include/godot_cpp/godot.hpp b/include/godot_cpp/godot.hpp index 1b420d3..c4e5d83 100644 --- a/include/godot_cpp/godot.hpp +++ b/include/godot_cpp/godot.hpp @@ -177,7 +177,7 @@ extern "C" GDExtensionInterfacePlaceHolderScriptInstanceUpdate gdextension_inter extern "C" GDExtensionInterfaceClassdbConstructObject gdextension_interface_classdb_construct_object; extern "C" GDExtensionInterfaceClassdbGetMethodBind gdextension_interface_classdb_get_method_bind; extern "C" GDExtensionInterfaceClassdbGetClassTag gdextension_interface_classdb_get_class_tag; -extern "C" GDExtensionInterfaceClassdbRegisterExtensionClass2 gdextension_interface_classdb_register_extension_class2; +extern "C" GDExtensionInterfaceClassdbRegisterExtensionClass3 gdextension_interface_classdb_register_extension_class3; extern "C" GDExtensionInterfaceClassdbRegisterExtensionClassMethod gdextension_interface_classdb_register_extension_class_method; extern "C" GDExtensionInterfaceClassdbRegisterExtensionClassVirtualMethod gdextension_interface_classdb_register_extension_class_virtual_method; extern "C" GDExtensionInterfaceClassdbRegisterExtensionClassIntegerConstant gdextension_interface_classdb_register_extension_class_integer_constant; -- cgit v1.2.3