diff options
author | David Snopek <dsnopek@gmail.com> | 2024-01-19 07:27:06 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-19 07:27:06 -0600 |
commit | 6c04514039a34c646c7e30aa25f48fdd04e13daf (patch) | |
tree | 10206b7c76576ab33fe0abe1bfa0c14f70fd436f /include/godot_cpp/core/class_db.hpp | |
parent | 480a0f8c069576050e192b202248e66976982456 (diff) | |
parent | 5f350e257214c490639682d0b601be859a3b4332 (diff) | |
download | redot-cpp-6c04514039a34c646c7e30aa25f48fdd04e13daf.tar.gz |
Merge pull request #1359 from Naros/GH-1287
Rework GDCLASS macro to allow abstract classes
Diffstat (limited to 'include/godot_cpp/core/class_db.hpp')
-rw-r--r-- | include/godot_cpp/core/class_db.hpp | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/include/godot_cpp/core/class_db.hpp b/include/godot_cpp/core/class_db.hpp index 4196a76..af394f0 100644 --- a/include/godot_cpp/core/class_db.hpp +++ b/include/godot_cpp/core/class_db.hpp @@ -112,6 +112,33 @@ private: template <class T, bool is_abstract> static void _register_class(bool p_virtual = false, bool p_exposed = true); + template <class T> + static GDExtensionObjectPtr _create_instance_func(void *data) { + if constexpr (!std::is_abstract_v<T>) { + T *new_object = memnew(T); + return new_object->_owner; + } else { + return nullptr; + } + } + + template <class T> + static GDExtensionClassInstancePtr _recreate_instance_func(void *data, GDExtensionObjectPtr obj) { + if constexpr (!std::is_abstract_v<T>) { +#ifdef HOT_RELOAD_ENABLED + T *new_instance = (T *)memalloc(sizeof(T)); + Wrapped::RecreateInstance recreate_data = { new_instance, obj, Wrapped::recreate_instance }; + Wrapped::recreate_instance = &recreate_data; + memnew_placement(new_instance, T); + return new_instance; +#else + return nullptr; +#endif + } else { + return nullptr; + } + } + public: template <class T> static void register_class(bool p_virtual = false); @@ -202,9 +229,9 @@ void ClassDB::_register_class(bool p_virtual, bool p_exposed) { T::to_string_bind, // GDExtensionClassToString to_string_func; nullptr, // GDExtensionClassReference reference_func; nullptr, // GDExtensionClassUnreference unreference_func; - T::create, // GDExtensionClassCreateInstance create_instance_func; /* this one is mandatory */ + &_create_instance_func<T>, // GDExtensionClassCreateInstance create_instance_func; /* this one is mandatory */ T::free, // GDExtensionClassFreeInstance free_instance_func; /* this one is mandatory */ - T::recreate, // GDExtensionClassRecreateInstance recreate_instance_func; + &_recreate_instance_func<T>, // GDExtensionClassRecreateInstance recreate_instance_func; &ClassDB::get_virtual_func, // GDExtensionClassGetVirtual get_virtual_func; nullptr, // GDExtensionClassGetVirtualCallData get_virtual_call_data_func; nullptr, // GDExtensionClassCallVirtualWithData call_virtual_func; |